欢迎来到天天文库
浏览记录
ID:37724224
大小:1.38 MB
页数:12页
时间:2019-05-29
《harris角点检测原理步骤说明》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、一、Harris角点检测基本理论1.1 简略表达:角点:最直观的印象就是在水平、竖直两个方向上变化均较大的点,即Ix、Iy都较大 边缘:仅在水平、或者仅在竖直方向有较大的变化量,即Ix和Iy只有其一较大 平坦地区:在水平、竖直方向的变化量均较小,即Ix、Iy都较小角点响应R=det(M)-k*(trace(M)^2) (附录资料给出k=0.04~0.06,opencv指出是0.05-0.5,浮动较大)det(M)=λ1*λ2 trace(M)=λ1+λ2R取决于M的特征值,对于角点
2、R
3、很大,平坦的
4、区域
5、R
6、很小,边缘的R为负值。1.2 详细描述:见附录里的ppt1.3 算法步骤其中,局部极大值可用先膨胀后与原图比较的方法求得,具体见二中源码。二、opencv代码实现harris类[cpp]viewplaincopyprint?1.#ifndef HARRIS_H 2.#define HARRIS_H 3.#include "opencv2/opencv.hpp" 4. 5.class harris 6.{ 7.private: 8. cv::Mat cornerStrength;
7、 //opencv harris函数检测结果,也就是每个像素的角点响应函数值 9. cv::Mat cornerTh; //cornerStrength阈值化的结果 10. cv::Mat localMax; //局部最大值结果 11. int neighbourhood; //邻域窗口大小 12. int aperture;//sobel边缘检测窗口大小(sobel获取各像素点x,y方向的灰度导数) 13. double k; 14. double maxS
8、trength;//角点响应函数最大值 15. double threshold;//阈值除去响应小的值 16. int nonMaxSize;//这里采用默认的3,就是最大值抑制的邻域窗口大小 17. cv::Mat kernel;//最大值抑制的核,这里也就是膨胀用到的核 18.public: 19. harris():neighbourhood(3),aperture(3),k(0.01),maxStrength(0.0),threshold(0.01),nonMaxS
9、ize(3){ 20. 21. }; 22. 23. void setLocalMaxWindowsize(int nonMaxSize){ 24. this->nonMaxSize = nonMaxSize; 25. }; 26. 27. //计算角点响应函数以及非最大值抑制 28. void detect(const cv::Mat &image){ 29. //opencv自带的角点响应函数计算函数 30.
10、 cv::cornerHarris (image,cornerStrength,neighbourhood,aperture,k); 31. double minStrength; 1. //计算最大最小响应值 2. cv::minMaxLoc (cornerStrength,&minStrength,&maxStrength); 3. 4. cv::Mat dilated; 5.
11、 //默认3*3核膨胀,膨胀之后,除了局部最大值点和原来相同,其它非局部最大值点被 6. //3*3邻域内的最大值点取代 7. cv::dilate (cornerStrength,dilated,cv::Mat()); 8. //与原图相比,只剩下和原图值相同的点,这些点都是局部最大值点,保存到localMax 9. cv::compare(cornerStrength,dilated,localMax,cv
12、::CMP_EQ); 10. } 11. 12. //获取角点图 13. cv::Mat getCornerMap(double qualityLevel) { 14. cv::Mat cornerMap; 15. // 根据角点响应最大值计算阈值 16. threshold= qualityLevel
此文档下载收益归作者所有