1. Harris 角点检测
介绍: 角点是很容易在图像中定位的局部特征,并且大量存在于人造物体中(例如墙壁、门、桌子等),角点的价值在于它是两条边缘线的接合点,是一种二维特征,可以被精确地检测(即使是亚像素级精度)。
实现原理:
![e02624767e6d6f5d1e7f8c0d526829b1.png](https://img-blog.csdnimg.cn/img_convert/e02624767e6d6f5d1e7f8c0d526829b1.png)
![dba9f34ca56d0db5fdd0af064fc46a43.png](https://img-blog.csdnimg.cn/img_convert/dba9f34ca56d0db5fdd0af064fc46a43.png)
例子代码:
#include#includeusing namespace std;using namespace cv;Mat srcImg, grayImg;int thresholdValue = 130;int maxCount = 255;void HarrisDemo(int, void *){ Mat dstImg, normDstImg, normScaleDst; dstImg = Mat::zeros(grayImg.size(), CV_32FC1); int blockSize = 2; //领域尺寸 int ksize = 3; //口径尺寸 double k = 0.04; //Harris 参数 cornerHarris(grayImg, dstImg, blockSize, ksize, k, BORDER_DEFAULT); //角点检测 normalize(dstImg, normDstImg, 0, 255, NORM_MINMAX, CV_32FC1, Mat()); //归一化 convertScaleAbs(normDstImg, normScaleDst); Mat resultImg = srcImg.clone(); for (int i = 0; i thresholdValue) { circle(resultImg, Point(j, i), 2, Scalar(0, 0, 255), 2, 8, 0); } currentRow++; } } imshow("HarrisCornerDetection Result", resultImg);}void test(){ srcImg = imread("home.jpg"); if (srcImg.empty()) { cout <
效果图
![231ab895da63b795c09a232dad0d2267.png](https://img-blog.csdnimg.cn/img_convert/231ab895da63b795c09a232dad0d2267.png)
2. Shi - Tomasi 角点检测
介绍:跟 Harris 角点检测的理论几乎完全一致,唯一不同的是在使用矩阵特征值 λ₁λ₂ 计算角度响应的时候。
例子代码:
#include#includeusing namespace std;using namespace cv;//Shi - TomasiMat srcImg, grayImg;int thresholdValue = 25;int maxCorners = 200;RNG rng(12345);void ShiTomasiDemo(int, void *){ if (thresholdValue corners; //装载角点 //函数需要的参数 double quelityLevel = 0.01; double minDistance = 10; int blockSize = 3; bool useHarris = false; double k = 0.04; Mat resultImg = srcImg.clone(); //复制灰度图像的图 goodFeaturesToTrack(grayImg, corners, thresholdValue, quelityLevel, minDistance, Mat(), blockSize, useHarris, k); cout <
效果图
![81f0afd28fe02186356818704fcc5fed.png](https://img-blog.csdnimg.cn/img_convert/81f0afd28fe02186356818704fcc5fed.png)
3. 自定义角点检测器
- 基于 Harris 与 Shi - Tomasi 角点检测
- 首先通过计算矩阵 M 得到 λ₁λ₂ 两个特征值根据他们得到角点响应值
- 然后自己设置阈值实现计算出阈值得到有响应值角点位置
例子代码:
#include#includeusing namespace std;using namespace cv;//自定义角点检测Mat srcImg, grayImg;//harris corner responseMat harrisDst, harrisRspImg; double harrisMinRsp;double harrisMaxRsp;//shi-tomasi corner responseMat shitomasiRsp;double shitomasiMinRsp;double shitomasiMaxRsp;int smQualityLevel = 30;// quality levelint qualityLeve = 30;int maxCount = 100;void CustomHarrisDemo(int, void *){ if (qualityLeve (i, j); if (v > t) { circle(resultImg, Point(j, i), 2, Scalar(0, 0, 255), 2, 8, 0); } } } imshow("Custom Harris Corners Detector", resultImg);}void CustomShiTomasiDemo(int, void *){ if (qualityLeve (i, j); if (v > t) { circle(resultImg, Point(j, i), 2, Scalar(0, 0, 255), 2, 8, 0); } } } imshow("Custom Shi-Tomasi Corners Detector", resultImg);}void test(){ srcImg = imread("home.jpg"); if (srcImg.empty()) { cout <(i, j)[0]; double lambda2 = harrisDst.at(i, j)[1]; harrisRspImg.at(i, j) = lambda1*lambda2 - k*pow((lambda1 + lambda2), 2); } } minMaxLoc(harrisRspImg, &harrisMinRsp, &harrisMaxRsp, 0, 0, Mat()); namedWindow("Custom Harris Corners Detector", CV_WINDOW_AUTOSIZE); createTrackbar("Quality Value", "Custom Harris Corners Detector", &qualityLeve, maxCount, CustomHarrisDemo); CustomHarrisDemo(0, 0); //计算最小特征值 shitomasiRsp = Mat::zeros(srcImg.size(), CV_32FC1); cornerMinEigenVal(grayImg, shitomasiRsp, blockSize, ksize, 4); minMaxLoc(shitomasiRsp, &shitomasiMinRsp, &shitomasiMaxRsp, 0, 0, Mat()); namedWindow("Custom Shi-Tomasi Corners Detector", CV_WINDOW_AUTOSIZE); createTrackbar("Quality Value", "Custom Shi-Tomasi Corners Detector", &smQualityLevel, maxCount, CustomShiTomasiDemo); CustomShiTomasiDemo(0, 0);}int main(){ test(); waitKey(0); return 0;}
效果图
![5b96bf4427a1af865dd6d28573d27980.png](https://img-blog.csdnimg.cn/img_convert/5b96bf4427a1af865dd6d28573d27980.png)
4. 亚像素级别角点检测
作用:提高检测精准度。
- 插值方法
- 基于图像矩计算
- 曲线拟合方法 - (高斯曲线、多项式和椭圆曲面)。
例子代码:
#include#includeusing namespace std;using namespace cv;//亚像素级别焦点检测int maxCorners = 20;int maxCount = 50;Mat srcImg, grayImg;void subPixelDemo(int, void *){ if (maxCorners corners; double qualityLevel = 0.01; double minDistance = 10; int blockSize = 3; double k = 0.04; goodFeaturesToTrack(grayImg, corners, maxCorners, qualityLevel, minDistance, Mat(), blockSize, false, k); cout <
效果图
![d25b9197498b6da247a4339a56e7e881.png](https://img-blog.csdnimg.cn/img_convert/d25b9197498b6da247a4339a56e7e881.png)
获取例子所用的图片可以关注微信OpenCV图像处理算法获得哦,里面也会写我学习图像处理历程,欢迎大佬来交流!!!