OpenCV模板匹配和轮廓处理

1.模板匹配(Template Match)

(1)模板匹配介绍

模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域,所以模板匹配首先需要一个模板图像T(给定的子图像)

另外需要一个待检测的图像-源图像S

工作方法,在带检测图像上,从左到右,从上到下计算模板图像与重叠子图像的匹配度,匹配程度越大,俩者相同的可能性越大

模板匹配介绍——匹配算法介绍

计算(归一化)平方不同

计算(归一化)相关性

计算(归一化)相关系数

(2)相关API介绍(cv::matchTemplate)

MatchTemplate(inputArray          image,//源图像,必须是8-bit或者32-bit浮点数图像

                          inputArray         image,//模板图像,类型与输入图像一致

                          outputarray       result,//输出结果,必须是单通道32位浮点数,假设源图像wxh,模板图像Wxh,则结果必须为W-w+1,H-h+1的大小

                          int                     method,//使用的匹配方法

                          inputarray        masknoarray()//(optional))

匹配方法:

TM_SQDIFF=0,

TM_SQDIFF_NORMEO=1,

TM_CCORR=2,

TM_CCORR_NORMEO=3,

TM_CCOEFF=4,

TM_CCOEFF_NORMEO=5

2.轮廓发现(find contour)

(1)轮廓发现

轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。所以边缘提取的阈值选定会影响最终轮廓发现结果。

(2)API介绍

FindContours发现轮廓

DrawContours绘制轮廓

在二值图像上发现轮廓使用API          

cv::findContours(inputOutArray      bining,//输入图像,非0的像素被看成1,0的像素值保持不变,8-bit

                           OutputArray         contours,//全部发现的轮廓对象

                           OutputArray         hierarchy//图该的拓扑结构,可选,该轮廓发现算法正是基于图像拓扑结构实现

                           Int                        mode,//轮廓返回的方式

                           Int                       method,//发现方式

                           Point                   offset=Point()//轮廓像素的位移,默认(0,0)没有位移)

对发现的轮廓数据进行绘制显示

 

drawContours(inputoutarray          binimg,//输出图像

                       Outputarray            contours,//全部发现的轮廓图像

                       Int                           contourldx//轮廓索引号

                      Const                      Scalar&color,//绘制时候颜色

                      Int                            thickness,//绘制线宽

                      Int                            lineType,//线的类型LINE_8

                      Inputarray                hierarchy,//拓扑结构图

                      Int                            maxlevel,//最大层数,0只会绘制当前的,1表示绘制当前及其内嵌的轮廓

                     Point                        offset=Point()//轮廓位移,可选)

(3)实现步骤:

  1. 输入图像转为灰度图像cvtColor
  2. 使用Canny进行边缘提取,得到二值图像
  3. 使用findContours寻找轮廓
  4. 使用drawContours绘制轮廓

3.凸包——Convex Hull

(1)概念介绍

什么是凸包,在一个多变形边缘或者内部任意俩个点的连线都包含在多边形边界或者内部

正式定义:包含点集合S中所有点的最小凸多边形称为凸包

(2)检测算法:Graham扫描法

首先选择Y方向最低的点作为起始点p0

从p0开始极坐标扫描,依次添加p1…pn(排序顺序是根据极坐标的角度大小,逆时针方向)

对每个pi来说,如果添加pi点到凸包中导致一个左转向(逆时针方法)则添加该点到凸包,反之如果导致一个右转向(顺时针方向)删除该点从凸包中

(3)API说明cv::convexHull

ConvexHull(inputArray             points,//输入候选点,来自findContours

                   outputArray            hull,//凸包

                   bool                        clockwise,//default true,顺时针方向

                   bool                        returnPoints)//true表示返回点个数,如果第二个参数是vector<point>则自动忽略

(4)实现步骤:

  1. 首先把图像从RGB转为灰度
  2. 然后再转为二值图像
  3. 在通过发现轮廓得到候选点
  4. 凸包API调用
  5. 绘制显示

4.轮廓周围绘制矩形框和圆形框

(1)API介绍

ApproxPolyDP(inputarray         curve,

                        Outputarray     approxCure,

                        Double     epsilon,   

                        Bool          closed)

基于RDP算法实现,目的是减少多边形轮廓点数

(2)轮廓周围绘制矩形——API

Cv::boundingRect(inputarray       points)得到轮廓周围最小矩形左上交点坐标和右下交点坐标,绘制一个矩形

Cv::minAreaRect(inputarray   points)得到一个旋转的矩形,返回旋转矩形

(3)轮廓周围绘制圆和椭圆——API

Cv::minEnclosingCircle(inputarray       points,//得到最小区域圆形

                                           Point2f&         center,//圆心位置

                                           Float&            radius//圆的半径

Cv::fitElipse(inputarray        points)得到最小椭圆

(4)实现步骤:

  1. 首先将图像变为二值图像
  2. 发现轮廓,找到图像轮廓
  3. 通过相关API在轮廓点上找到最小包含矩形和圆,旋转矩形和椭圆
  4. 绘制他们
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值