【OpenCV探索之路(三)】亚像素角点法

        鉴于网络上没有什么关于亚像素角点检测的完整代码,那我就贴出来一个最简单的开个坑嘞。话不多说,直接上代码!

        

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat img = imread("jianzhu.jpg");
	Mat gray;
	cvtColor(img, gray, COLOR_BGR2GRAY);
	//检测角点
	vector<Point2f> corners;
	goodFeaturesToTrack(gray, corners, 100, 0.01, 10);
	//cornersub 亚像素检测
	TermCriteria criteria(TermCriteria::COUNT + TermCriteria::EPS,30,0.01);
	cornerSubPix(gray, corners, Size(5, 5), Size(-1, -1),criteria);

	//画出
	for (size_t i = 0; i < corners.size(); i++) {
		circle(img, corners[i], 3, Scalar(0, 0, 255), -1);
	}
	//
	imshow("Result", img);
	waitKey(0);
	return 0;
}

下面做一下解释:

//检测角点
	vector<Point2f> corners;
	goodFeaturesToTrack(gray, corners, 100, 0.01, 10);

        vector<Point2f> corners是一个向量,用于存储检测到的角点坐标。它的类型是std::vector,元素类型是Point2f,即二维平面上的浮点型坐标。

在使用goodFeaturesToTrack函数检测角点时,我们需要先定义一个向量来存储检测到的角点坐标。这个向量可以在函数调用时作为参数传入,也可以在函数内部定义并返回。在这个例子中,向量corners是作为函数的输出参数,用于存储检测到的角点坐标。具体而言,函数会将检测到的角点坐标写入到向量corners中,我们可以通过访问向量元素来获取这些角点的坐标信息。     

其中:goodFeaturesToTrack函数的五个参数分别是:

void goodFeaturesToTrack(InputArray image,
OutputArray corners, 
int maxCorners, 
double qualityLevel, 
double minDistance, 
InputArray mask=noArray(), 
int blockSize=3, 
bool useHarrisDetector=false,
double k=0.04 )

其中用到的参数的意义为:

  • image:输入图像,可以是灰度图像或彩色图像;
  • corners:输出角点的坐标;
  • maxCorners:需要检测的最大角点数量;
  • qualityLevel:表示角点的质量水平,取值范围在[0,1]之间,用于设置角点响应函数的阈值;
  • minDistance:表示检测到的角点之间的最小距离,如果检测到的角点

        

//cornersub 亚像素检测
	TermCriteria criteria(TermCriteria::COUNT + TermCriteria::EPS,30,0.01);
	cornerSubPix(gray, corners, Size(5, 5), Size(-1, -1),criteria);

         这句代码是OpenCV中用于设置迭代终止条件的函数TermCriteria()的一个示例。它的作用是定义迭代求解过程中的终止条件,以便在满足某些条件时终止迭代。TermCriteria是OpenCV中的一个结构体,它包含三个参数:

  • type:迭代终止的类型,它可以是以下三种之一:
    • TermCriteria::COUNT:当达到指定的迭代次数时终止迭代;
    • TermCriteria::EPS:当迭代求解的误差满足指定的阈值时终止迭代;
    • TermCriteria::COUNT + TermCriteria::EPS:同时满足上述两种终止条件时终止迭代。
  • maxCount:最大迭代次数,当迭代次数达到这个值时,会自动停止迭代。
  • epsilon:迭代求解的误差阈值,当求解的误差小于这个值时,会自动停止迭代。

        在这个例子中,我们定义了一个TermCriteria对象criteria,将type设为TermCriteria::EPS + TermCriteria::MAX_ITER,表示迭代求解的终止条件是满足误差阈值和最大迭代次数。具体而言,最大迭代次数为30,误差阈值为0.001。这意味着,在迭代求解中,如果达到了最大迭代次数或者误差小于0.001时,会停止迭代。

 

两个函数之间的相互关系:

        cornerSubPix是OpenCV中一个函数,用于亚像素级别的角点精细化定位。在使用goodFeaturesToTrack函数检测到角点后,这些角点的坐标可能不够准确,存在一定的误差。而cornerSubPix函数可以进一步提高角点的精度,使得检测到的角点更加精准、稳定。

        cornerSubPix的原理是对goodFeaturesToTrack检测到的角点周围的像素进行拟合,得到一个更加准确的角点位置。具体而言,它会对每个角点周围的像素拟合一个二次函数,然后找到这个二次函数的极值点,即为精细化定位后的角点位置。

        cornerSubPix函数的输入参数包括原始图像、角点坐标、窗口大小等。它的输出是精细化定位后的角点坐标。在实际使用中,可以先使用goodFeaturesToTrack函数进行角点检测,再使用cornerSubPix函数进行亚像素级别的精细化定位,得到更加准确的角点位置。

返回结果:

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值