opencv轮廓相关函数

    • 查找轮廓

contours, hierarchy = cv2.findContours(image,mode,method)

参数:

  • image:寻找轮廓所使用的图像。(寻找过程不修改此图像)

  • mode:模式。

  • cv2.RETR_EXTERNAL只检测外轮廓;

  • cv2.RETR_LIST检测的轮廓不建立等级关系;

  • cv2.RETR_CCOMP建立两个等级的轮廓,上一层为外边界,内层为内孔的边界。如果内孔内还有连通物体,则这个物体的边界也在顶层;

  • cv2.RETR_TREE建立一个等级树结构的轮廓。

  • method:轮廓近似方法。

  • cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素坐标xy分别之差最大为1;

  • cv2.CHAIN_APPROX_SIMPLE同一条直线(水平、垂直和对角线段),只保留端点坐标,例如一个矩形轮廓只需要4个点来保存轮廓信息;

  • cv2.CHAIN_APPROX_TC89_L1 不太懂

  • cv2.CV_CHAIN_APPROX_TC89_KCOS 不太懂

返回值:

  • contours:点集形式存储的轮廓信息,vector数组,python中是个list

  • hierarchy:【输出可选】,是个vector数组,python中是list。包含有关图像拓扑的信息。它具有与轮廓数量一样多的元素。对于每个第 i 个等高线轮廓 [i],元素层次结构 [i][0]、层次结构 [i][1]、层次结构 [i][2] 和层次结构 [i][3] 分别在同一层次结构级别(第一个子轮廓和父轮廓)的下一个和上一个轮廓的轮廓中设置为 0 的索引。如果对于轮廓 i,没有下一个、上一个、父或嵌套的轮廓,则层次结构 [i] 的相应元素将为负数。

快速使用

contours = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

2.画出轮廓

cv2.drawContours(image, contours, contourIdx, color, thickness, lineType, hierarchy, maxLevel, offset)

参数:

  • image:绘制轮廓的目标图像

  • contours:所要绘制的轮廓(数据类型为list)

  • contourIdx:绘制轮廓list中哪一条轮廓,-1表示绘制所有。

  • color:绘制出的线条颜色。数据格式为bgr元组。如蓝色(255, 0, 0)

  • thickness线条粗细(整型)

  • linetype:线形。一般用不到。cv2.LINE_AA为抗锯齿线

  • hierarchy:有关层次结构的【可选】信息。仅当只想绘制某些轮廓时才需要它

  • maxLevel:绘制轮廓的最大标高。如果为 0,则仅绘制指定的轮廓。如果为 1,则该函数绘制轮廓和所有嵌套轮廓。如果为 2,则函数绘制轮廓、所有嵌套轮廓、所有嵌套到嵌套轮廓等。【仅当有层次结构可用时】,才会考虑此参数。

  • offset:【可选】轮廓偏移参数。按指定的轮廓移动所有绘制的轮廓

无返回值。

快速使用

cv2.drawContours(img, contours, -1, (255,255,0), 2)
有时候会用for循环把cv2.findContours()返回轮廓contours拆开为一个个的contour,拆开前后都是list点集,故都可以送入此函数绘制

3.轮廓外接矩形

获取外接正方形

x,y,w,h = cv2.boundingRect(contours)    # 传入轮廓list
# 返回值为坐标和宽高

获取外接矩形

rect = cv.minAreaRect(contours)    # 传入轮廓list
# 返回旋转矩形
# 返回值rect包含重心坐标(x, y), 宽高(width, height), 旋转角度
# 前两个为元组,最后旋转角度为浮点

查找旋转矩形的四个点

box = cv2.boxPoints(rect)  # 查找旋转矩形的四个点。传入rect为旋转矩形
# 返回值box为包含四个点的list,浮点型

返回的box点集,查找角点示例

# 获取四个顶点坐标
left_point_x = np.min(box[:, 0])    # 左为第几行,右为第几列
right_point_x = np.max(box[:, 0])
top_point_y = np.min(box[:, 1])
bottom_point_y = np.max(box[:, 1])

快速应用

rect = cv2.minAreaRect(contours)
center, size, rotation = rect    # 可拆开
box = cv2.boxPoints(rect)  # 查找旋转矩形的四个点。
box = np.int0(box)    # 浮点转为整型
cv2.drawContours(img,[box],0,(0,0,255),2)

二者区别:绿线表示外接正方形,红线表示外接矩形

4.轮廓近似

approx = cv2.approxPolyDP(contours,epsilon, closed)
# 返回值approx与contours类型一样
# 传入参数:1.轮廓点集;2.轮廓近似精度(double);3.所近似出的轮廓线是否闭合(bool)

举例:(最左侧为原图)

epsilon = 0.1*cv.arcLength(cnt,True)
approx = cv.approxPolyDP(cnt,epsilon,True)

下面,在第二张图片中,绿线显示了精度 epsilon = 10% 时的近似曲线。第三幅图显示了精度 epsilon = 1% 时的情况。

猜你喜欢

转载自blog.csdn.net/qq_35858902/article/details/128832358
今日推荐