Harris角点检测及代码分析(续)
来源:互联网 发布:极限挑战第一季6 知乎 编辑:程序博客网 时间:2024/05/16 14:52
紧接着“Harris角点检测及代码分析”,这里主要分析OpenCV的cvGoodFeaturesToTrack()函数,这才是角点提取的真正代码。
Jianbo Shi, Carlo Tomasi. Good Features to Track. CVPR94
时间:2015-05-25 16:12
算法步骤
- cvCornerHarris()函数仅计算出每个像素单元的
R 值,然后再对R 进行过滤,仅留下≥β×maxR 的像素点; - 非极大值抑制(Non-Maximum Suppression),我看到网上很多人直接Dilate-Image && Origin-Image,但这样会形成角点块,除非有下面的步骤;
- 对该阶段的角点
R 值进行降序排序; - 距离滤波器,过滤点靠太近的点,留下
R 值高的角点。
代码分析
便于理解先看OpenCV1.0的cvGoodFeaturesToTrack()源码,已删除了与理解算法无关的代码。
void cvGoodFeaturesToTrack(...){ // 是否使用harris角点响应器 if(use_harris) { // harris角点响应值,det(M)-a*(trace(M))^2 cvCornerHarris(img, eig, block_size, 3, harris_k); } else { // 用最小特征值作为响应值 cvCornerMinEigenVal(img, eig, block_size, 3); } cvMinMaxLoc(eig, 0, &max_val, 0, 0, mask); cvThreshold(eig, eig, max_val * 0.01, 0, CV_THRESH_TOZERO); cvDilate(eig, tmp); min_dist = cvRound(min_distance * min_distance); // 检查原响应图与dilate图的每个像素,如果不为0且相等,则为候选角点 for(y = 1, k = 0; y < size.height - 1; y++) { for(x = 1; x < size.width - 1; x++) { if(eig_data[x] != 0 && eig_data[x] == tmp_data[x]) ptr_data[k++] = eig_data + x; } } // 对候选角点按响应值降序排序 icvSortFeatures( ptr_data, k, 0 ); // 遍历所有候选角点,如果当前角点与前面所有角点的欧式距离小于min_dist, // 则标记为真正角点 for(i = 0; i < k; i++) { for(j = 0; j < count; j++) { int dx = x - ptr[j].x; int dy = y - ptr[j].y; int dist = dx * dx + dy * dy; if(dist < min_dist) break; } if(j == count) { ptr[count].x = x; ptr[count].y = y; if(++count >= max_count) break; } }}
算法优化
OpenCV2.0以上版本在goodFeaturesToTrack()函数中对距离滤波器做了修改,应该是为了加速做的改进。具体方法为:
- 对整张图像划分网格,每个网格的大小为min_dist * min_dst,网格数量为grid_width * grid_height;
- 建立二维矩阵,grid(grid_width * grid_height),用来存放最终标记的角点;
- 进行距离滤波时,计算出候选角点所在网格,仅需检测网格8领域的角点与候选角点的距离,就能快速verify。
为了保证能计算出比较多的角点,一般min_dist设置得比较小,如果10,针对一张640 * 480的图像检测角点,应该能有不错的性能提升。
0 0
- Harris角点检测及代码分析(续)
- Harris角点检测及代码分析
- Harris角点检测代码
- Harris角点检测原理分析与代码解读
- 详解Harris角点检测及代码实现
- 详解Harris角点检测及代码实现
- 详解Harris角点检测及代码实现
- harris角点检测c++代码
- Harris角点检测原理分析
- Harris角点检测原理分析
- Harris角点检测及实现
- Harris角点检测及matlab程序
- Harris角点检测原理及实现
- Harris 角点检测
- Harris角点检测
- Harris角点检测
- Harris角点检测
- Harris角点检测
- 顺序栈的简单操作
- HDU--2016
- Android问题集锦之四十:Android NDK: Could not find application project directory
- Java 8 详解之默认方法
- [LeetCode] Combination Sum III
- Harris角点检测及代码分析(续)
- 轮廓处理之三
- 使用cocos2d-x制作 Texture unpacker
- 集合Map
- Parameter "basePath" cannot have zero length.
- app运营:如何制定消息推送策略?
- DHCP Option 常见取值及含义
- 人性漫画:打工与创业的残酷区别……
- 堆和栈的区别