轮廓特征属性及应用
1)凸包
凸包(Convex Hull)是一个计算机几何图形学中的概念, 简单来说, 给定二维平面点集, 凸包就是能够将最外层的点连接起来构成的凸多边形, 它能够包含点集中所有的点。物体的凸包检测常应用在物体识别、手势识别及边界检测等领域。
寻找凸包—cv2.convexHull()
⚫points: 输入的二维点集, 可以填Mat类型或std::vector
⚫hull: 函数调用后找到的凸包
⚫clockwise: 操作方向标志符, 当为true时, 输出的凸包为顺时针方向, false为逆时针方向(假
定坐标系x轴指向右,y轴指向上方)
⚫returnPoints: 操作标志符, 默认值true. 当标志符为true时, 函数返回凸包各个点, 否则返回与凸包点对应的轮廓点的索引
for cnt in contours:
hull = cv2.convexHull(cnt)#默认returnPoints=True
for cnt in contours :
hull = cv2.convexHull(cnt,returnPoints=False)#print hull
for i in range(0,len (hull)) :
print hull[i]
cv2.drawContours(img,contours[0] ,hull[il,(0,255,0) ,8)
凸性检测—cv2.isContourConvex()
⚫contour: 表示输入参数待检测凸性的轮廓
⚫retval: 返回值True或False
凸包缺陷分析—cv2.convexityDefects()
⚫contour: 表示输入参数检测到的轮廓, 可以用cv2.findContours函数获得
⚫convexhull: 输入参数表示检测到的凸包, 可以用cv2.convexHull函数获得
⚫convexityDefects: 检测到的最终结果, 应为vector<vector>类型, Vec4i
存储了起始点、结束点、距离及最远点到凸包的距离
使用特定形状的轮廓包围
在实际应用中, 经常会有将检测到的轮廓用多边形表示出来的需求, 提取包围轮廓的多边形也方便我们做进一步分析, 轮廓包围主要有一下几种:
◼轮廓外接矩形
◼轮廓最小外接矩形(旋转)
◼轮廓最小包围圆形
◼轮廓拟合椭圆
◼轮廓逼近多边形曲线
轮廓外接矩形—cv2.boundingRect()
⚫points: 输入的二维点集
⚫返回值: Rect类矩形对象(x,y,w,h)
for cnt in contours:
(x,y, w,h) = cv2.boundingRect(cnt)
cv2.rectangle (img,(x,y) ,(x+w,y+h), (0,255,0) ,2)
cv2.drawContours(img,contours,-1, (0,0,255) ,2)
cv2.putText (img, ("Num=%s"%str (len (contours))), (5,20), font, 0.8,(0 ,255,0), 2)
for cnt in contours:
(x,Y, w,h) = cv2.boundingRect(cnt)
if(w>10 and h>10) :
i+=1
picName =./result/%d.jpg'%i #格式化字符串
print picNameROI = temp[y:y+h,x:x+wlcv2 .imwrite(picName , ROI)
cv2 .rectangle (img,(x,y),(x+w,y+h),(0,255,0) ,2)
1)最小外接矩形
轮廓最小外接矩形—cv2.minAreaRect()
在这里插入图片描述
⚫points: 输入的二维点集
⚫返回值: RotatedRect类矩形对象, 外接旋转矩形主要成员有center、size、 angle
在opencv中,坐标的原点在左上角,与x轴平行的方向为角度为0,逆时针旋转角度为负,顺时针旋转角度为正。而RotatedRect类是以矩形的哪一条边与x轴的夹角作为角度的呢?angle 是水平轴(x轴)逆时针旋转,与碰到的第一个边的夹角,而opencv默认把这个边的边长作为width,angle的取值范围必然是负的.
类型结构说明
for cnt in contours :
rect = cv2 .minAreaRect(cnt)
box = cv2.boxPoints (rect)
box = np.int0(box)
print box
img = cv2 .drawContours (img,[box],0,(0,255,0),2)