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)实现步骤:
- 输入图像转为灰度图像cvtColor
- 使用Canny进行边缘提取,得到二值图像
- 使用findContours寻找轮廓
- 使用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)实现步骤:
- 首先把图像从RGB转为灰度
- 然后再转为二值图像
- 在通过发现轮廓得到候选点
- 凸包API调用
- 绘制显示
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)实现步骤:
- 首先将图像变为二值图像
- 发现轮廓,找到图像轮廓
- 通过相关API在轮廓点上找到最小包含矩形和圆,旋转矩形和椭圆
- 绘制他们