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

OpenCV C++ 简单小技巧 - 角点检测 (21_第1张图片

对于图像颜色特征查找。把前景色绿色设置为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数据展示出来


OpenCV C++ 简单小技巧 - 角点检测 (21_第2张图片

原图


OpenCV C++ 简单小技巧 - 角点检测 (21_第3张图片
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);

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


OpenCV C++ 简单小技巧 - 角点检测 (21_第4张图片
image.png

我很满意

Shi-Tomasi角点检测

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

vector cornerGood;
goodFeaturesToTrack(f1, cornerGood, 10, 0.01, 10);

for (int i=0; i
OpenCV C++ 简单小技巧 - 角点检测 (21_第5张图片
image.png

你可能感兴趣的:(OpenCV C++ 简单小技巧 - 角点检测 (21)