opencv自定义角点_自定义角点检测器

该博客介绍了如何使用OpenCV库自定义实现Harris和Shi-Tomasi角点检测算法。首先通过`cornerEigenValsAndVecs`计算特征值,然后根据响应值设定阈值筛选角点。对于Harris角点检测,通过计算两个特征值的乘积并应用响应阈值;对于Shi-Tomasi角点检测,使用`cornerMinEigenVal`获取最小特征值。最后,通过调整质量级别阈值,显示检测结果。
摘要由CSDN通过智能技术生成

自定义角点检测器是基于Harris和Shi-Tomasi角点检测的

首先通过计算矩阵M来得出λ1λ2两个特征值,然后根据他们得到角点响应值

然后自己设置阈值实现实现计算出阈值得到有效响应值的角点位置

API

cv::cornerEigenValsAndVecs

(

InputArray src,

OutputArray dst,

int blocksize,

int ksize,

int borderType=BORDER_DEFAULT

)

cv::cornerMinEigenVal

(

InputArray src,

OutputArray dst,

int blocksize,

int ksize=3,

int borderType=BORDER_DEFAULT

)

自定义CustomHarris角点检测Demo

#include"pch.h"#include#include#include

using namespacestd;using namespacecv;const char* output_title = "Custom Harris CornerDetection Reslut";doubleharris_mins_rsp;doubleharris_max_rsp;int qualityLevel = 30;int max_count = 100;

Mat src, gray_src;

Mat harris_dst, harriRspImg;void CustomHarris_Demo(int,void*);int main(int argc, char**argv)

{

src= imread("1.jpg");

imshow("input img", src);int blocksize = 3;int ksize = 3;double k = 0.04;

harriRspImg=Mat::zeros(src.size(), CV_32FC1);

harris_dst= Mat::zeros(src.size(), CV_32FC(6));

namedWindow(output_title, CV_WINDOW_AUTOSIZE);

cvtColor(src, gray_src, COLOR_BGR2GRAY);//caculate eigen value计算特征值

cornerEigenValsAndVecs(gray_src, harris_dst, blocksize, ksize, BORDER_DEFAULT);//计算响应

for(int row=0;row

{double lamda1=harris_dst.at(row, col)[0];double lamda2 = harris_dst.at(row, col)[1];

harriRspImg.at(row, col) = lamda1 * lamda2 - k * pow((lamda1 + lamda2), 2);//pow求平方

}

minMaxLoc(harriRspImg,&harris_mins_rsp, &harris_max_rsp, 0, 0,Mat());

createTrackbar("Quality value:", output_title, &qualityLevel, max_count, CustomHarris_Demo);

CustomHarris_Demo(0, 0);

waitKey();return 0;

}void CustomHarris_Demo(int, void*)

{if (qualityLevel < 10)

qualityLevel= 10;

Mat resultImg=src.clone();float t = harris_mins_rsp + (double(qualityLevel)) / max_count * (harris_max_rsp -harris_mins_rsp);for(int row=0;row

{float v = harriRspImg.at(row, col);if (v >t)

circle(resultImg, Point(col, row),2, Scalar(0, 0, 255), 2, 8, 0);

}

imshow(output_title, resultImg);

}

自定义CustomShi-Tomasi角点检测Demo

#include"pch.h"#include#include#include

using namespacestd;using namespacecv;const char* output_title = "Custom Shi-Tomasi CornerDetection Reslut";doubleharris_mins_rsp;doubleharris_max_rsp;int qualityLevel = 30;int max_count = 100;

Mat src, gray_src;

Mat harris_dst, harriRspImg;//Shi-Tomasi

Mat ShiTomasiRspImg;doubleShiTomasi_max_rsp;doubleShiTomasi_min_rsp;int SM_QualityLevel = 30;void CustomShiTomasi_Demo(int,void*);int main(int argc, char**argv)

{

src= imread("1.jpg");

imshow("input img", src);int blocksize = 3;int ksize = 3;double k = 0.04;

harriRspImg=Mat::zeros(src.size(), CV_32FC1);

harris_dst= Mat::zeros(src.size(), CV_32FC(6));

namedWindow(output_title, CV_WINDOW_AUTOSIZE);

cvtColor(src, gray_src, COLOR_BGR2GRAY);//caculate eigen value计算特征值

cornerEigenValsAndVecs(gray_src, harris_dst, blocksize, ksize, BORDER_DEFAULT);//计算响应

for(int row=0;row

{double lamda1 = harris_dst.at(row, col)[0];double lamda2 = harris_dst.at(row, col)[1];

harriRspImg.at(row, col) = lamda1 * lamda2 - k * pow((lamda1 + lamda2), 2);//pow求平方

}

minMaxLoc(harriRspImg,&harris_mins_rsp, &harris_max_rsp, 0, 0,Mat());//createTrackbar("Quality value:", output_title, &qualityLevel, max_count, CustomHarris_Demo);//CustomHarris_Demo(0, 0);//计算最小特征值

ShiTomasiRspImg =Mat::zeros(src.size(), CV_32FC1);

cornerMinEigenVal(gray_src, ShiTomasiRspImg, blocksize, ksize,4);

minMaxLoc(ShiTomasiRspImg,&ShiTomasi_min_rsp, &ShiTomasi_max_rsp, 0, 0, Mat());

createTrackbar("Min Value:", output_title, &SM_QualityLevel, max_count, CustomShiTomasi_Demo);

CustomShiTomasi_Demo(0, 0);

waitKey();return 0;

}void CustomShiTomasi_Demo(int, void*)

{if (qualityLevel < 20)

qualityLevel= 20;

Mat resultImg=src.clone();float t = ShiTomasi_min_rsp + ((double(SM_QualityLevel)) / max_count) * (ShiTomasi_max_rsp -ShiTomasi_min_rsp);for(int row=0;row

{float v = ShiTomasiRspImg.at(row, col);if (v >t)

circle(resultImg, Point(col, row),2, Scalar(0, 0, 255), 2, 8, 0);

}

imshow(output_title, resultImg);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值