OpenCV(四十二):Harris角点检测 以你之姓@ 2024-03-03 02:51 10阅读 0赞 #### 1.Harris角点介绍 #### 什么是角点? 角点指的是两条边的交点,图中红色圈起来的点就是角点。 ![99b1a3a94a1744f5a4d1e9cad6587958.png][] Harris角点检测原理:首先定义一个矩形区域,然后将这个矩形区域放置在我的图像中,求取这个区域内所有的像素值之和,之后沿着多个方向移动我这个区域,再次计算新区域的像素值之和,如果移动前和移动后的像素值两者的差值比较小,那么就不是Harris角点,如果两者之间差值比较大,就认定移动前覆盖的区域内存在Harris角点。 如图:下图两条线形成角点,而矩形区域分别表示**平面、边界、角点**三种位置: ![8ea3862dc77e414791f64c9f78e380ef.png][] #### 2.Harris角点计算 #### Harris角点检测原理:当移动窗口,窗口内像素值变化大就有Harris角点 Harris角点检测原理公式: ![72e1d57733ec4267b10af59e1b8492a0.png][] 权重系数的引入是为了更加方便地去确定某一个点是Harris角点。 Harris角点检测原理公式写成矩阵形式: ![1a5f8fbb73b34351b5fe9d943a8f00fc.png][] 由此可得出梯度协方差矩阵M ![eebd58304e7a467c923e62d41e29df4a.png][] Harris评价函数来测量每个像素的角点程度 ,与梯度协方差矩阵M相关 ![afc9f68c0f024d53bb56055d922c0e09.png][] 在这个公式中,R是角点响应函数的值,M是一个2x2的矩阵,描述了局部区域中像素的梯度信息,det(M)表示矩阵的行列式,trace(M)表示矩阵的迹,k是一个常数,用于调节响应函数的敏感度。 Harris评价函数可以用特征向量来表示。λ1和λ2分别是M的两个特征值。 ![e85a92c4342d4630b39512e3e3294448.png][] 通过对特征值λ1和λ2进行求解,我们可以计算Harris评价函数R,并据此来判断像素是否为角点。 * 当λ1和λ2都较大且接近时,表示图像局部区域存在角点。 * 当λ1和λ2都比较小或者差异较大时,表示图像局部区域是平坦或者边缘区域。 #### 3.检测Harris角点函数cornerHarris() #### > void cv::cornerHarris ( InputArray src, > > OutputArray dst, > > int blockSize, > > int ksize, > > double K, > > int borderType = BORDER\_DEFAULT > > ) * src:待检测Harris角点的输入图像,图像必须是CV 8U或者CV 32F的单通道灰度图像 * dst: 存放Harris评价系数的R矩阵,数据类型为CV 32F的单通道图像,与输入图像具有相同的尺寸 * blockSize:邻域大小 * ksize: Sobel算子的半径,用于得到梯度信息 * k:计算Harris评价系数R的权重系数 * borderType:像素外推算法标志 #### 4.绘制角点函数drawKeypoints() #### > void drawKeypoints(InputArray image, > > const std::vector<KeyPoint>& keypoints, > > OutputArray outImage, > > const Scalar& color = Scalar::all(-1), > > int flags = DrawMatchesFlags::DEFAULT > > ) 参数说明: * image: 输入图像,可以是任意类型的Mat对象。 * keypoints: vector类型的关键点,每个关键点包含其在图像中的位置和其他信息(如尺度、方向等)。 * outImage: 输出图像,用于存储绘制了特征点的图像。可以与输入图像相同的尺寸和类型。 * color: 绘制特征点的颜色,可以是Scalar对象或CV\_RGB(R, G, B)宏定义,默认为Scalar::all(-1)表示随机颜色。 * flags: 绘制标志,用于控制绘制方式。可以是以下常量之一: * DrawMatchesFlags::DEFAULT: 默认绘制方式,显示关键点的位置和大小。 * DrawMatchesFlags::DRAW\_OVER\_OUTIMG: 将关键点绘制在输出图像上,而不是创建新的输出图像。 * DrawMatchesFlags::DRAW\_RICH\_KEYPOINTS: 绘制丰富的特征点,显示位置、尺度、方向等详细信息。 #### 5.示例代码: #### void Harris_f(Mat image){ //转成灰度图像 Mat gray; cvtColor(image,gray,COLOR_BGR2GRAY); // 执行Harris角点检测 Mat harris; cornerHarris(gray,harris,2,3,0.04); //归一化便于进行数值比较和结果显示 Mat harrisn; normalize(harris,harrisn,0,255,NORM_MINMAX); //将图像的数据类型变成CV_8U convertScaleAbs(harrisn,harrisn); //寻找Harris角点 vector<KeyPoint> keyPoints; for(int row=0;row<harrisn.rows;row++){ for(int col=0;col<harrisn.cols;col++){ int R=harrisn.at<uchar>(row,col); if(R<180){ //将角点存入KeyPoint中 KeyPoint keyPoint; keyPoint.pt.y=row; keyPoint.pt.x=col; keyPoints.push_back(keyPoint); } } } //绘制角点 drawKeypoints(image,keyPoints,image,Scalar(0,0,255,255)); //与显示结果 imwrite("/sdcard/DCIM/harrisn.png",harrisn); imwrite("/sdcard/DCIM/result.png",image); } ![bf61a54c9a4c4ef39a5f9b56921f5292.jpeg][]![b8ada1b035024b948c0271bc7fce78c1.jpeg][] (系数矩阵) (绘制Harris角点) [99b1a3a94a1744f5a4d1e9cad6587958.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/03/5aaf4ae86eb54386bedd5089e4f79c1e.png [8ea3862dc77e414791f64c9f78e380ef.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/03/52dc956a26dc4dfaa53a82cc8f4f397c.png [72e1d57733ec4267b10af59e1b8492a0.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/03/7b8dafdd53064e29805a76fca479b77b.png [1a5f8fbb73b34351b5fe9d943a8f00fc.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/03/9a74d7d306844e1ca23ed2264673bea0.png [eebd58304e7a467c923e62d41e29df4a.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/03/bc874cb1b8af481f9666b1bada2272fa.png [afc9f68c0f024d53bb56055d922c0e09.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/03/017bffe77ae740a8bee2bacc29f87257.png [e85a92c4342d4630b39512e3e3294448.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/03/a3f51e08cd9d49eda1829615ae73e79a.png [bf61a54c9a4c4ef39a5f9b56921f5292.jpeg]: https://img-blog.csdnimg.cn/bf61a54c9a4c4ef39a5f9b56921f5292.jpeg [b8ada1b035024b948c0271bc7fce78c1.jpeg]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/03/8e3cd593d2fb406c920c2e32db16c071.png
还没有评论,来说两句吧...