zoukankan      html  css  js  c++  java
  • OpenCV 查找轮廓

    本文将结合实例代码,介绍 OpenCV 如何查找轮廓、获取边界框。

    OpenCV 提供了 findContours 函数查找轮廓,需要以二值化图像作为输入、并指定些选项调用即可。

    我们以下图作为示例:

    二值化图像

    代码工程 data/ 提供了小狗和红球的二值化掩膜图像:

    其使用预训练好的实例分割模型来生成的,脚本可见 detectron2_seg_threshold.py。模型检出结果,如下:

    模型用的 Mask R-CNN 已有预测边框。但其他模型会有只出预测掩膜的,此时想要边框就可以使用 OpenCV 来提取。

    本文代码也提供了根据色域来获取红球掩膜的办法:

    import cv2 as cv
    import numpy as np
    
    # 读取图像
    img = cv.imread(args.image, cv.IMREAD_COLOR)
    
    # HSV 阈值,获取掩膜
    def _threshold_hsv(image, lower, upper):
      hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
      mask = cv.inRange(hsv, lower, upper)
      result = cv.bitwise_and(image, image, mask=mask)
      return result, mask
    
    _, thres = _threshold_hsv(img, np.array([0,110,190]), np.array([7,255,255]))
    
    # 清除小点(可选)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3), (1, 1))
    thres = cv.morphologyEx(thres, cv.MORPH_OPEN, kernel)
    

    查找轮廓

    # 查找轮廓
    #  cv.RETR_EXTERNAL: 只查找外部轮廓
    contours, hierarchy = cv.findContours(
      threshold, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    
    # 近似轮廓,减点(可选)
    contours_poly = [cv.approxPolyDP(c, 3, True) for c in contours]
    
    # 绘制轮廓
    h, w = threshold.shape[:2]
    drawing = np.zeros((h, w, 3), dtype=np.uint8)
    for i in range(len(contours)):
      cv.drawContours(drawing, contours_poly, i, (0, 255, 0), 1, cv.LINE_8, hierarchy)
    

    获取边界框

    boundingRect 获取边界框,并绘制:

    for contour in contours_poly:
      rect = cv.boundingRect(contour)
      cv.rectangle(drawing,
                    (int(rect[0]), int(rect[1])),
                    (int(rect[0]+rect[2]), int(rect[1]+rect[3])),
                    (0, 255, 0), 2, cv.LINE_8)
    

    minEnclosingCircle 获取边界圈,并绘制:

    for contour in contours_poly:
      center, radius = cv.minEnclosingCircle(contour)
      cv.circle(drawing, (int(center[0]), int(center[1])), int(radius),
                (0, 255, 0), 2, cv.LINE_8)
    

    参考

    GoCoding 个人实践的经验分享,可关注公众号!

  • 相关阅读:
    搭建一个简单的springMVC框架
    java枚举使用
    java中枚举类型的使用
    java递归算法
    JAVA递归算法及经典递归例子 对于这个汉诺塔问题
    java斐波纳契数列
    要求给一个数值,计算它的阶乘
    AcWing2193 分配问题(二分图最优匹配)
    2020上海大学校赛L 动物森友会(网络流+二分)
    BZOJ2654 tree(wqs二分)
  • 原文地址:https://www.cnblogs.com/gocodinginmyway/p/14860999.html
Copyright © 2011-2022 走看看