harris角点检测_角点检测实战

1. Harris 角点检测

介绍: 角点是很容易在图像中定位的局部特征,并且大量存在于人造物体中(例如墙壁、门、桌子等),角点的价值在于它是两条边缘线的接合点,是一种二维特征,可以被精确地检测(即使是亚像素级精度)。

实现原理:

e02624767e6d6f5d1e7f8c0d526829b1.png
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

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

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

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

获取例子所用的图片可以关注微信OpenCV图像处理算法获得哦,里面也会写我学习图像处理历程,欢迎大佬来交流!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值