美文网首页GoCoding
OpenCV 查找轮廓

OpenCV 查找轮廓

作者: GoCodingInMyWay | 来源:发表于2021-06-07 23:20 被阅读0次

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

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

image

我们以下图作为示例:

image

二值化图像

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

image image

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

image

模型用的 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)
image

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)
image

参考

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

相关文章

  • OpenCV 查找轮廓

    本文将结合实例代码,介绍 OpenCV 如何查找轮廓、获取边界框。 代码: contours.py[https:/...

  • opencv查找轮廓并配色

    记录目的 每次都要重新理解得到的层级树应该怎么处理,很麻烦,所以记一下,方便以后直接用。 查找轮廓 单纯查找轮廓部...

  • 【OPENCV】轮廓检测

    Tags: DIP findContours() void findContours(InputOutputArr...

  • opencv图像轮廓

    1.1什么是轮廓 cv2.findContours() 轮廓可以简单认为成连续的点(连着边界)连在一起的曲线,具有...

  • opencv 轮廓检测

  • openCV:图像轮廓

    查找轮廓 什么是轮廓 轮廓可以简单认为成连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析...

  • OpenCV 之轮廓

    什么是轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的...

  • opencv细化轮廓

    1.源码实现 2.编译源码 3.运行及其结果

  • android opencv之旅(四)查找轮廓,获取外包矩形

    棋盘边界是一个黑色的正方形,为了定位这个正方形,我们先查找出图片中的所有轮廓。 查找轮廓 参数列表: src:源M...

  • C++ opencv-3.4.1 提取不规则物体的轮廓

    在学习opencv的时候,对一张照片,需要标注照片上物体的不规则轮廓。 如图: 使用opencv进行物体的轮廓处理...

网友评论

    本文标题:OpenCV 查找轮廓

    本文链接:https://www.haomeiwen.com/subject/deareltx.html