博舍

实战 cv视觉识别实战

实战

点击上方“小白学视觉”,选择加"星标"或“置顶”

重磅干货,第一时间送达

导读

本文将介绍使用OpenCV实现多角度模板匹配的详细步骤+代码。(来源公众号:OpenCV与AI深度学习)

背景介绍

  熟悉OpenCV的朋友肯定都知道OpenCV自带的模板匹配matchTemplate方法是不支持旋转的,也就是说当目标和模板有角度差异时匹配常常会失败,可能目标只是轻微的旋转,匹配分数就会下降很多,导致匹配精度下降甚至匹配出错。另一个方法是matchShape(形状匹配),匹配时需要轮廓分明才容易匹配成功,但无法的到匹配角度,也不方便使用。本文介绍基于matchTemplate+旋转+金字塔下采样实现多角度的模板匹配,返回匹配结果(斜矩形、角度、方向)。

实现效果

如上面视频所示,本方法可以对不同角度的元件做匹配并标注元件方向。

实现思路

【1】如何适应目标的角度变化?我们可以将模板旋转,从0~360°依次匹配找到最佳的匹配位置;

【2】如何提高匹配速度?使用金字塔下采样,将模板和待匹配图均缩小后匹配;加大匹配搜寻角度的步长,比如从每1°匹配一次改为每5°匹配一次等。

实现步骤:

【1】旋转模板图像。旋转图像本身比较简单,下面是代码:

//旋转图像MatImageRotate(Matimage,doubleangle){MatnewImg;Point2fpt=Point2f((float)image.cols/2,(float)image.rows/2);MatM=getRotationMatrix2D(pt,angle,1.0);warpAffine(image,newImg,M,image.size());returnnewImg;}

但需要注意,很多时候按照上面方法旋转时,会丢失模板信息产生黑边,这里提供两种方法供大家参考尝试:

①旋转时放大目标图像尺寸,保证模板图像上信息不丢失,然后模板匹配时使用mask,如何使用mask掩码有什么用?看下面链接文章介绍:

实战|OpenCV带掩码(mask)的模板匹配使用技巧与演示(附源码)

②旋转时不放大目标图像尺寸,剔除黑边剩余部分做mask来匹配。

【2】图像金字塔下采样。什么是图像金字塔?什么是上下采样?直接百度。

下采样的目的前面已介绍,减小图像分辨率提高图像匹配速度,代码如下:

//对模板图像和待检测图像分别进行图像金字塔下采样for(inti=0;iangleStep);if(temp>thresScore){returnResultPoint(location.x*pow(2,numLevels),location.y*pow(2,numLevels),-angle,temp);}}returnResultPoint(-1,-1,0,0);

【4】标注匹配结果。根据模板图大小、匹配结果角度计算出匹配后的矩形四个角点,根据角点关系即可绘制方向:

//获取旋转后矩形对应的端点坐标vectorGetRotatePoints(Matimg,RectinRect,doubleangle){Rectrect=inRect;vectorpts;Point2fcenter=Point2f(img.cols/2,img.rows/2);MatM=getRotationMatrix2D(center,angle,1.0);//cout

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇