OpenCV C++ 简单小技巧 - 角点检测 (21

对于图像颜色特征查找。把前景色绿色设置为a,背景色白色设置为b。
1 :当一个区域在绿色内部,这个区域在绿色内部四个方向任意移动,变化差异不大。a1:b1≈a2:b2
2 :在绿色边缘移动的区域,纵向会有很大差异,因为绿色和白色的比例发生变化了,a1:b1≠a2:b2
而如果横向移动则不会产生过大差异性。a1:b1≈a2:b2
3 :但如果你锁定这绿色矩形四周的角,你会发现,这个角无论横向还是纵向移动,都会导致很大差异。a1:b1≠a2:b2

cornerHarris 检测角点就是这个算法

cvtColor(frame, f1, COLOR_BGR2GRAY);

f2 = Mat::zeros(frame.size(), CV_32FC1);

cornerHarris(f1, f2, 2, 3, 0.04, BORDER_DEFAULT);

dilate(f2, f2, kernal,{-1,-1},10);

normalize(f2, f3, 0, 255, NORM_MINMAX,CV_32FC1,Mat());
convertScaleAbs(f3, f4);

double valMax,valMin;
minMaxIdx(f2, &valMin,&valMax);
frame.setTo(255,f2>valMin+(valMax-valMin)*.1);

f3/f4没有参与原图处理,只是把f2数据展示出来


原图


number_9_by_soid442.jpg

这张图不好找到角点,因为太杂乱了,还好之前的形态学可以有效去除这个问题

首先阀值很重要

threshold(f1, f1, 50, 255, THRESH_BINARY);

其次进行迭代闭运算

Mat kernal = Mat::ones(3, 3, CV_8U);
morphologyEx(f1, f1, MORPH_CLOSE, kernal,{-1,-1},10);

最后结果 (模糊后可能会更好,不做实验了。)


image.png

我很满意

Shi-Tomasi角点检测

goodFeaturesToTrack 这个api貌似是从已有的角点中选择更优的一定数量点作为特征,而不是把所有角点都列出来。
它的要求是输入源是单通道,输出是点合集,以及需要的特征点最大数量

vector<cv::Point2f> cornerGood;
goodFeaturesToTrack(f1, cornerGood, 10, 0.01, 10);

for (int i=0; i<cornerGood.size(); i++) {
    circle(f5, cornerGood[i], 20, Scalar(255),-1);
}
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《机械制图》10%(50+30=80) 单项选择题 Q-B1-E-001 L 基本幅面不能满足需要而采用加长幅面时...
    开源时代阅读 4,065评论 1 1
  • 按照用途分类出以下统计函数: AVEDEV 用途:返回一组数据与其平均值的绝对偏差的平均值,该函数可以评测数据(例...
    四方院祭司阅读 2,993评论 0 3
  • VBA订制工具栏 http://club.excelhome.net/thread-1047254-1-1.htm...
    大海一滴写字的地方阅读 2,293评论 0 0
  • 经过这些天的学习,终于清楚的知道,我是只“海燕”为什么还是无法自由翱翔! 记得老师在上课时说了这么一个事: 解决问...
    海过留痕燕过留声阅读 230评论 0 0
  • 你经过的时候 我身边带过一阵风 我拍照的时候 风车一直忽悠的转 显示出来在心中的 却只有一刻 它无风静止的那时刻 ...
    山屈生阅读 302评论 0 3