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