精华内容
下载资源
问答
  • 亚像素角点检测

    2018-12-01 17:56:28
    常规的角点检测算法输出的角点坐标是整数,即角点位置恰好与...相比常规角点检测,亚像素角点检测用实数取代整数来表示角点坐标。   亚像素角点检测算法 亚像素角点检测需要先运行常规的角点检测,得到整数表...

            常规的角点检测算法输出的角点坐标是整数,即角点位置恰好与像素位置重合。

            实际场景中角点位置是连续的,而相机的像素是离散的,两者总是有偏差。如果需要基于图像进行几何测量,这个偏差是不能容忍的。这就是亚像素角点检测问题的背景。相比常规角点检测,亚像素角点检测用实数取代整数来表示角点坐标。

     

    亚像素角点检测算法

    亚像素角点检测需要先运行常规的角点检测,得到整数表示的角点坐标。然后算法对每个角点做细化,得到实数表示的角点坐标

     

    第一步:goodFeaturesToTrack()    //检测角点

     

    第二步:TermCriteria()            //设置迭代算法的终止条件

    TermCriteria(int type,int max_iter, double epsilon);

    参数

    type:终止条件类型;

    CV_TERMCRIT_ITER--max_iter达到最大值后停止算法;

    CV_TERMCRIT_EPS--当算法依赖的精确度低于epsilon后,停止算法;

    CV_TERMCRIT_ITER+CV_TERMCRIT_EPS--当max_iter达到最大值或算法依赖的精确度低于epsilon任一个满足时,停止算法;

    max_iter:最大迭代次数;

    epsilon:要求精度;
     

    第三步:cornerSubPix()         //细化角点位置;

    void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria);

    参数:

    image:输入图像;

    corners:初始化输入角点的坐标,为输出提供细化的坐标;

    winSize:搜索窗口的边长的一半;

    zeroZone:搜索区域中间的死区的一半大小,对它在下边的求和公式不计算,有时候它用来避免可能的自相关矩阵的奇异性,(-1,-1)用来表明这里没有这样的规模;

    criteria:角点细化的迭代过程的终止条件;

     

    代码示例:

    #include <iostream>
    #include "opencv2/opencv.hpp"
    
    
    using namespace cv;
    using namespace std;
    
    int num_corners = 10;
    int max_count = 100;
    Mat src, gray_src;
    const char* output_title = "SubPixel Result";
    void SubPixel_Demo(int, void*);
    int main(int argc, char** argv) 
    {
    	src = imread("D:/cv400/house.jpg");
    	if (src.empty()) 
    	{
    		cout<<"could not load image..."<<endl;
    		return -1;
    	}
    	namedWindow("input image", WINDOW_AUTOSIZE);
    	imshow("input image", src);
    	cvtColor(src, gray_src, COLOR_BGR2GRAY);
    	namedWindow(output_title, WINDOW_AUTOSIZE);
    	createTrackbar("Corners:", output_title, &num_corners, max_count, SubPixel_Demo);
    	SubPixel_Demo(0, 0);
    
    	waitKey(0);
    	return 0;
    }
    
    void SubPixel_Demo(int, void*) 
    {
    	if (num_corners < 5)
    		num_corners = 5;
    
    	vector<Point2f> corners;
    	double qualityLevel = 0.01;
    	double minDistance = 10;
    	int blockSize = 3;
    	double k = 0.04;
    	goodFeaturesToTrack(gray_src, corners, num_corners, qualityLevel, minDistance, Mat(), blockSize, false, k);
    	cout << "number of corners: " << corners.size() << endl;
    	Mat resultImg = src.clone();
    	for (size_t t = 0; t < corners.size(); t++)
    		circle(resultImg, corners[t], 2, Scalar(0, 0, 255), 2, 8, 0);
    	imshow(output_title, resultImg);
    
    	Size winSize = Size(5, 5);
    	Size zerozone = Size(-1, -1);
    	TermCriteria tc = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);
    	cornerSubPix(gray_src, corners, winSize, zerozone, tc);
    
    	for (size_t t = 0; t < corners.size(); t++)
    		cout << "corners"<<(t + 1) << " .[x, y] = " << corners[t].x << " , " << corners[t].y << endl;
    	
    	return;
    }
    

    原图:

    角点检测:

    角点坐标:

     

    展开全文
  • OpenCV亚像素角点检测

    2019-08-18 22:26:08
    前言 我在做围棋盘的的四个角点检测时,试了几种...//亚像素角点检测 void cornerDetectorPixel(Mat &src, Mat &dst) { Mat src_img, gray; //读取图像 src_img = src.clone(); //把原图像转换成灰度...

    前言

    我在做围棋盘的的四个角点检测时,试了几种角点检测,用来得到棋盘四个角的初始点,试了几种角点检测的方法,但在我所使用的环境下,亚像素的角点检测得到的结果比较理想。

    代码

    //亚像素角点检测
    void cornerDetectorPixel(Mat &src, Mat &dst)
    {
    	Mat src_img, gray;
    
    	//读取图像
    	src_img = src.clone();
    
    	//把原图像转换成灰度图
    	cvtColor(src_img, gray, COLOR_BGR2GRAY);
    
    	vector<Point2f> corners;
    	
    	dst = src_img.clone();
    	//进行角点检测
    	goodFeaturesToTrack(gray, corners, 4, 0.01, 10, Mat(), 3, false, 0.04);
    
    	//输出检测到的角点的数量
    	cout << "输出检测到的角点的数量: " << corners.size() << endl;
    	
    	//参数设置
    	Size winSize = Size(5, 5);
    	Size zeroZone = Size(-1, -1);
    
    	TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);
    	//计算亚像素级角点位置
    	cornerSubPix(gray, corners, winSize, zeroZone, criteria);
    	//输出精准角点坐标信息
    	for (int i = 0; i < corners.size(); i++)
    	{
    		cout << "[" << i << "]" << "号角点坐标:" << "(" << corners[i].x << ", " << corners[i].y << ")" << endl;
    	}
    
    	//绘制出被检测的角点
    	for (size_t i = 0; i < corners.size(); i++)
    	{
    		circle(dst, corners[i], 6, Scalar(0, 0, 255), -2, 8, 0);
    	}
    	imshow("dst", dst);
    }
    

    运行结果:
    在这里插入图片描述
    还是有角点没有检测到,要使用可以自己试着优化下参数。

    展开全文
  • zernike亚像素角点检测

    2019-01-22 21:13:34
    基于matlab使用zernike方法将角点坐标精确到亚像素级别的压像素角点检测算法
  • 基于harris的亚像素角点提取算法,自动提取棋盘格,提取棋盘格区域为矩形,否则无法自动计算棋盘格角点。
  • OpenCV3 亚像素角点检测:cornerSubPix()

    千次阅读 2019-12-02 20:58:53
    goodFeaturesToTrack()提取到的角点只能达到像素级别【OpenCV3 角点检测:goodFeaturesToTrack()】,在很多情况下并不能满足实际的需求,这时,我们则需要使用cv::cornerSubPix()对检测到的角点作进一步的优化计算,...

    前言:cv::goodFeaturesToTrack()提取到的角点只能达到像素级别【OpenCV3 角点检测:goodFeaturesToTrack()】,在很多情况下并不能满足实际的需求,这时,我们则需要使用cv::cornerSubPix()对检测到的角点作进一步的优化计算,可使角点的精度达到亚像素级别。

    函数原型:

    	void cv::cornerSubPix(
    		cv::InputArray image, // 输入图像
    		cv::InputOutputArray corners, // 角点(既作为输入也作为输出)
    		cv::Size winSize, // 区域大小为 NXN; N=(winSize*2+1)
    		cv::Size zeroZone, // 类似于winSize,但是总具有较小的范围,Size(-1,-1)表示忽略
    		cv::TermCriteria criteria // 停止优化的标准
    	);
    

    参数解析:

    第一个参数是输入图像,和cv::goodFeaturesToTrack()中的输入图像是同一个图像。
    第二个参数是检测到的角点,即是输入也是输出。
    
    第三个参数是计算亚像素角点时考虑的区域的大小,大小为NXN; N=(winSize*2+1)。
    
    第四个参数作用类似于winSize,但是总是具有较小的范围,通常忽略(即Size(-1, -1))。
    
    第五个参数用于表示计算亚像素时停止迭代的标准,可选的值有cv::TermCriteria::MAX_ITER 、cv::TermCriteria::EPS(可以是两者其一,或两者均选),
    前者表示迭代次数达到了最大次数时停止,后者表示角点位置变化的最小值已经达到最小时停止迭代。二者均使用cv::TermCriteria()构造函数进行指定。
    

    程序示例:

    #include <iostream>
    #include <vector>
    #include <opencv2/opencv.hpp>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    
    int main()
    {
    	cv::Mat image_color = cv::imread("house.jpg", 1);
     
    	//用于绘制亚像素角点
    	cv::Mat image_copy = image_color.clone();
    	//使用灰度图像进行角点检测
    	cv::Mat image_gray;
    	cv::cvtColor(image_color, image_gray, cv::COLOR_BGR2GRAY);
     
    	//设置角点检测参数
    	std::vector<cv::Point2f> corners;
    	int max_corners = 100;
    	double quality_level = 0.01;
    	double min_distance = 10;
    	int block_size = 3;
    	bool use_harris = false;
    	double k = 0.04;
     
    	//角点检测
    	cv::goodFeaturesToTrack(image_gray,
    		corners,
    		max_corners,
    		quality_level,
    		min_distance,
    		cv::Mat(),
    		block_size,
    		use_harris,
    		k);
     
    	//将检测到的角点绘制到原图上
    	for (int i = 0; i < corners.size(); i++)
    	{
    		cv::circle(image_color, corners[i], 5, cv::Scalar(0, 0, 255), 2, 8, 0);
    	}
     
    	//指定亚像素计算迭代标注
    	cv::TermCriteria criteria = cv::TermCriteria(
    					cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,
    					40,
    					0.01);
     
    	//亚像素检测
    	cv::cornerSubPix(image_gray, corners, cv::Size(5, 5), cv::Size(-1, -1), criteria);
     
    	//将检测到的亚像素角点绘制到原图上
    	for (int i = 0; i < corners.size(); i++)
    	{
    		cv::circle(image_copy, corners[i], 5, cv::Scalar(0, 255, 0), 2, 8, 0);
    	}
     
    	cv::imshow("corner", image_color);
    	cv::imshow("sub pixel corner", image_copy);
     
    	cv::imwrite("corner.jpg", image_color);
    	cv::imwrite("corner_sub.jpg", image_copy);
    
    	cv::waitKey(0);
    	return 0;
    }

     

     

    展开全文
  • 花老湿学习OPenCV:亚像素角点检测

    千次阅读 2019-06-25 09:23:06
    引言: 若进行图像处理的目的不是提取用于...亚像素角点检测的位置在摄像机标定、跟踪并重建摄像机的轨迹,或者重建被跟踪目标的三维结构时,是一个基本的测量值。 API: 代码展示: ...

    引言:

    若进行图像处理的目的不是提取用于识别的特征点,而是进行几何测量,这通常需要更高的精度,而goodFeaturesToTrack() 只能提供简单的像素的坐标---有时候需要实数坐标而不是整数坐标。
    亚像素级角点检测的位置在摄像机标定、跟踪并重建摄像机的轨迹,或者重建被跟踪目标的三维结构时,是一个基本的测量值。
     

     

    API:

     

    代码展示:

     

    #include "pch.h"
    #include <iostream>
    #include "opencv2/opencv.hpp"
    
    using namespace std;
    using namespace cv;
    
    Mat src;
    Mat graysrc;
    int maxConnerNum = 30;
    int maxTrackbarNum = 100;
    RNG rng(getTickCount());
    
    void Connerdecetor_demo(int pos, void* data);
    
    int main()
    {
    	//待检测图像
    	src = imread("F:\\visual studio\\Image\\building1.jpg");
    	if (src.empty())
    	{
    		cout << "Can't load the image" << endl;
    		return -1;
    	}
    	imshow("src", src);
    	
    	//转化为灰度图
    	cvtColor(src, graysrc, COLOR_BGR2GRAY);
    
    	namedWindow("dst", WINDOW_AUTOSIZE);
    	createTrackbar("最大角点数", "dst", &maxConnerNum, maxTrackbarNum, Connerdecetor_demo);
    	Connerdecetor_demo(0, 0);
    
    	waitKey(0);
    }
    
    
    void Connerdecetor_demo(int pos, void* data)
    {
    	vector<Point2f> corners1;
    	double qualityLevel = 0.01;//角点检测可接受的最小特征值
    	double minDistance = 10;//角点之间的最小距离
    	int blocksize = 3; //计算导数自相关矩阵时指定的邻域范围
    	bool useharris = false; //是否使用harris角点检测
    	double k = 0.04; //harris所用参数
    
    	//Shi-Tomasi角点检测 用于提供整数角点坐标
    	goodFeaturesToTrack(graysrc, corners1, maxConnerNum, qualityLevel, minDistance, Mat(), 3, false, 0.04);
    
    
    	vector<Point2f> corners2 = corners1;
    	Size winSzie(5, 5);
    	Size zeroZone(-1, -1);
    	TermCriteria criteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);
    	
    	//亚像素角点检测
    	cornerSubPix(graysrc, corners2, winSzie, zeroZone, criteria);
    
    	Mat dst = graysrc.clone();
    	cvtColor(dst, dst, COLOR_GRAY2BGR);
    	
    	for (int i = 0; i < corners1.size(); i++)
    	{
    		cout << "Thi-Tomasi角点" << i << ":  (" << corners1[i].x << " , " << corners1[i].y << ")" << endl;
    		cout << "亚像素角点" << i << ":  (" << corners2[i].x << " , " << corners2[i].y << ")" << endl;
    		circle(dst, corners2[i], 2, Scalar(255, 0, 0), 2, LINE_AA, 0);
    	}
    	imshow("dst", dst);
    
    	
    }

    效果展示:

     

    展开全文
  • cv::cornerSubPix()亚像素角点检测

    千次阅读 2018-12-06 12:59:00
    cv::goodFeaturesToTrack()提取到的角点只能达到像素级别,在很多情况下并不能满足实际的需求,这时,我们则需要使用cv::cornerSubPix()对检测到的角点作进一步的优化计算,可使角点的精度达到亚像素级别。...
  • goodFeaturesToTrack()提取到的角点只能达到像素级别【OpenCV3 角点检测:goodFeaturesToTrack()】,在很多情况下并不能满足实际的需求,这时,我们则需要使用cv::cornerSubPix()对检测到的角点作进一步的优化计算,...
  • 前言: 图像特征点检测广泛运用于计算机视觉处理领域,包括目标识别与跟踪、立体成像,在特征点的图像分析中,特征点提取是非常重要的步骤,其中,角点是最常见的一类... 那么如何提取亚像素角点的位置呢?在 Ha...
  • 理论与现实总是不一致的,实际情况下几乎所有的角点不会是一个真正的准确像素点。(100, 5) 实际上(100.234, 5.789) (应用:跟踪,三维重建,相机校正) 亚像素定位 方法:①插值方法②基于图像矩计算③曲线拟合方法-...
  • opencv学习之亚像素角点检测

    千次阅读 2017-04-29 10:48:05
    // opencv2413_test.cpp : 定义控制台应用程序的入口。 // #include "stdafx.h" #include #include #include using namespace cv; using namespace std; Mat g_srcImage, g_grayImage; int g_maxCornerNumber...
  • OpenCV的中有cornerSubPixel()这个API函式用来针对初始的整数角点坐标进行亚像素精度的优化,该函式原型如下: C++: void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone...
  •   本篇主要说亚像素角点,又叫次级像素角点,其实通俗来说,就是输入整数坐标,使用最小二乘法迭代计算所需精度的实数坐标。Demo                亚像素角点概述进行图像处理提取用于识别的特征点进行...
  • 在图像处理和与计算机视觉领域,兴趣(interest points),或称作关键(keypoints)、特征(feature points) 被大量用于解决...如果能检测到足够多的这种,同时他们的区分度很高,并且可以精确定位稳定的特...
  • 《OpenCV开发笔记(六十一):红胖子8分钟带你深入了解Shi-Tomasi角点检测(图文并茂+浅显易懂+程序源码)》 亚像素角点检测原理 其中,(a)点p附近的图像是均匀的,其梯度为0,(b)边缘的梯度与沿地缘方向的q-p向量...
  •   《OpenCV开发笔记(六十一):红胖子8分钟带你深入了解Shi-Tomasi角点检测(图文并茂+浅显易懂+程序源码)》 亚像素角点检测原理      其中,(a)点p附近的图像是均匀的,其梯度为0,(b)边缘的梯度与沿地缘...
  • 《OpenCV开发笔记(六十一):红胖子8分钟带你深入了解Shi-Tomasi角点检测(图文并茂+浅显易懂+程序源码)》 亚像素角点检测原理 其中,(a)点p附近的图像是均匀的,其梯度为0,(b)边缘的梯度与沿地缘方向的q-p向量...
  • 亚像素角点检测

    2021-01-07 02:15:38
    文章目录亚像素级角点检测亚像素级角点检测APICode效果 亚像素级角点检测 1、概念; 2、API; 3、Code; 亚像素级角点检测 ...1、cornerSubPix() : 寻找亚像素角点位置(不是整数类型的位置,而是更精确的浮
  • 图像处理之角点检测亚像素角点定位 角点是图像中亮度变化最强地方反映了图像的本质特征,提取图像中的角点可以有效提高图像处理速度与精准度。所以对于整张图像来说特别重要,角点检测与提取的越准确图像处理与...
  • 亚像素级别角点检测(Python实现)

    千次阅读 2018-08-22 00:10:16
    以上两节学习了harris和Shi-Tomasi角点检测,但是在实际中精度不是很高,所以引入亚像素角点检测.以提高检测精准度. 1 作用 提高检测精准度 理论与实际总是不一致的,实际情况几乎所有的角点不会是一个真正的...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 216
精华内容 86
关键字:

亚像素角点检测