图像轮廓API

查找轮廓

查找轮廓前需要黑白化和二值化

findContours(image, mode, method[, contours[, hierarchy[, offset]]])

mode 查找轮廓的模式

  • RETR_EXTERNAL = 0, 表示只检测外围轮
    RETR_LIST = 1, 检测的轮廓不建立等级关系, 即检测所有轮廓, 较为常用
    RETR_CCOMP = 2, 每层最多两级, 从小到大, 从里到外.
    RETR_TREE = 3, 按照树型存储轮廓, 从大到小, 从右到左.

  • method 轮廓近似方法也叫ApproximationMode

    • CHAIN_APPROX_NONE 保存所有轮廓上的点
    • CHAIN_APPROX_SIMPLE, 只保存角点, 比如四边形, 只保留四边形的4个角, 存储信息少, 比较常用
  • 返回 contours和hierachy 即轮廓和层级
    result, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    轮廓查找, 新版本返回两个结果, 轮廓和层级, 老版本返回3个参数, 图像, 轮廓和层级

绘制轮廓

  • drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
    • image 要绘制的轮廓图像
    • contours轮廓点
    • contourIdx 要绘制的轮廓的编号. -1 表示绘制所有轮廓
    • color 轮廓的颜色, 如 (0, 0, 255)表示红色
    • thickness线宽, -1 表示全部填充

#绘制轮廓, 注意, 绘制轮廓会改变原图
cv2.drawContours(img, contours, 1, (0, 0, 255), 2)

轮廓的面积和周长

  • contourArea(contour)
  • arcLength(curve, closed)
    • curve即轮廓
    • closed是否是闭合的轮廓
      conttours[0]是图像最外侧的轮廓,即窗口
      area = cv2.contourArea(contours[1])
      perimeter = cv2.arcLength(contours[1], True)

多边形逼近与凸包

approxPolyDP(curve, epsilon, closed[, approxCurve])

  • curve 要近似逼近的轮廓
  • epsilon 即DP算法使用的阈值
  • closed轮廓是否闭合

approx = cv2.approxPolyDP(contours[0], 20, True)

凸包

convexHull(points[, hull[, clockwise[, returnPoints]]])

  • points 即轮廓
  • colckwise 顺时针绘制
    hull = cv2.convexHull(contours[0])

外接矩形

  • minAreaRect(points) 最小外接矩阵

    • points 即为轮廓
    • 返回元组, 内容是一个旋转矩形(RotatedRect)的参数: 矩形的起始坐标x,y, 矩形的宽度和高度, 矩形的选择角度.
  • boundingRect(points) 最大外接矩阵

    • points 即为轮廓

(x, y), (w, h), angle = cv2.minAreaRect(contours[1])
#快速把rotatedrect转化为轮廓数据
box = cv2.boxPoints®
print(box)
#轮廓必须是整数, 不能是小数, 所以转化为整数
box = np.round(box).astype(‘int64’)
print(box)
#绘制最小外接矩形
cv2.drawContours(img, [box], 0, (255, 0, 0), 2)
#返回矩形的x,y和w,h
x,y, w, h = cv2.boundingRect(contours[1])
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值