在进行轮廓操作之前,需要先将图片处理成二值化图像
图像轮廓用于图形分析金以及物体的识别与检测
查找轮廓
findContours(src,mode,method)
常用的查找轮廓的mode是:RETR_TREE,它的规则是从右到左,从大到小
存储轮廓的method有两种:
一种是CHAIN_APPROX_SIMPLE,只存储物体轮廓的角点信息
另一种是CHAIN_APPROX_NONE,存储物体轮廓的所有信息
绘制轮廓
drawContours(image, contours, contourIdx(轮廓的索引), color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
在绘制轮廓时,会直接绘制在原图上,所以最好创建一个深拷贝对象进行轮廓绘制
轮廓的面积和周长
面积
contourArea(contour)
周长
arcLength(curve,closed)
curve就是contour,closed是是否闭合的轮廓
多边形逼近
由于绘制轮廓可能过于复杂,所以使用多边形逼近对原始轮廓做一个近似
多边形逼近中的DP算法原理
不断找到多边形最远的点加入多边形,直到最短距离小于阈值
approxPolyDP(contour,epsilon,closed)
epsilon就是设置的阈值,阈值越小,越接近于原始轮廓
凸包
多边形逼近可以近似物体的轮廓,但是有时候我们相用一个多边形来简化这个轮廓,就可以使用凸包
convexHull(contour)
凸包的计算结果
蓝色线条就是凸包的结果,红色是原始轮廓,绿色是多边形逼近
外接矩形
外接矩形分为最小内接矩形和最大外接矩形
最小内接矩形
根据物体的形状(轮廓)的角点得到一个旋转的矩形
minAreaRect(contour)得到的是一个元组((x,y),(w,h),r)
需要将minAreaRect的元组转化为轮廓数据,使用api -----boxPoints(元组对象)(此api只能对带有角度的元组对象进行操作)
boxPoints的结果可能是一个非整数型的数据,但是drawContours中的contour明确规定只能是int型并且是列表
所以对boxPoints的对象(box)取整并转为int型,np.round(box).astype('int64')
在drawContours的时候一定要[box]列表对象传入contour位置参数,否则程序报错
最大外接矩形
boundingRect(contour)得到的是一个元组(x,y,w,h)
根据这个元组,直接使用调用绘制矩形的api ---- rectangle(img,start,end,color)即可
结果
红色是最小内接矩形,绿色是最大外接矩形