鉴于网络上没有什么关于亚像素角点检测的完整代码,那我就贴出来一个最简单的开个坑嘞。话不多说,直接上代码!
#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
函数进行亚像素级别的精细化定位,得到更加准确的角点位置。
返回结果: