博客
关于我
opencv之cv2.findContours和drawContours(python)
阅读量:791 次
发布时间:2023-02-23

本文共 1698 字,大约阅读时间需要 5 分钟。

OpenCV之cv2.findContours(Python)

概述

cv2.findContours 是 OpenCV 中一个强大的工具,用于从图像中检测轮廓。该函数能够识别图像中的边界,并返回这些边界的坐标。通过合理配置参数,可以控制轮廓的检测模式和近似方法,满足不同的应用需求。

输入参数解析

image

  • 输入图像需为二值化图像(灰度图)或单色图。建议先使用 cv2.cvtColor 将彩色图像转换为灰度图。

mode

  • 控制轮廓的检测模式:
    • cv2.RETR_EXTERNAL:仅检测外轮廓。
    • cv2.RETR_LIST:不建立轮廓等级关系。
    • cv2.RETR_CCOMP:建立两层等级轮廓,上层为外轮廓,内层为内孔边界(内孔内连通物体的边界也会被包含)。
    • cv2.RETR_TREE:建立层级化的轮廓树结构。

method

  • 控制轮廓近似方法:
    • cv2.CHAIN_APPROX_NOME:存储所有轮廓点,相邻点间像素差不超过1。
    • cv2.CHAIN_APPROX_SIMPLE:压缩轮廓点,只保留各方向的终点坐标。例如,矩形只需4个点。
    • cv2.CHAIN_APPROX_TC89_L1 和 cv2.CHAIN_APPROX_TC89_KCOS:基于不同距离度量的近似方法。

返回参数解析

contours

  • 返回的轮廓列表,每个轮廓由一个或多个点组成。

hierarchy

  • 每个轮廓的属性信息,包括轮廓的等级和父节点信息。

实际应用示例

import cv2# 读取图像并转换为灰度img = cv2.imread('contours2.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 阈值分割,获得二值图ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 检测轮廓binary, contours, hierarchy = cv2.findContours(    thresh,     cv2.RETR_TREE,     cv2.CHAIN_APPROX_NONE)# 获取第一个轮廓cnt = contours[0]# 轮廓近似epsilon = 0.1 * cv2.arcLength(cnt, True)approx = cv2.approxPolyDP(cnt, epsilon, True)# 绘制近似轮廓draw_img = img.copy()ret = cv2.drawContours(    draw_img,     [approx],     -1,     (0, 0, 255),     2)# 显示结果cv2.imshow('ret', ret)

辅助工具说明

  • 二值化图像:使用 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 将彩色图像转换为灰度图。
  • 轮廓面积计算:使用 cv2.contourArea(cnt) 计算轮廓的面积。
  • 轮廓周长计算:使用 cv2.arcLength(cnt, True) 计算轮廓的周长。
  • 轮廓近似:通过设置阈值 epsilon,控制近似程度。例如:
    epsilon = 0.1 * cv2.arcLength(cnt, True)approx = cv2.approxPolyDP(cnt, epsilon, True)
  • 外接矩形:使用 cv2.boundingRect(cnt) 获取轮廓的最小包围矩形。
  • 外接圆:使用 cv2.minEnclosingCircle(cnt) 获取轮廓的最小包围圆。
  • 绘图参数说明

    • color:线的颜色值,例如 (0, 0, 255) 表示红色。
    • thickness:线的宽度,-1 表示填充模式。
    • lineType:线类型,默认值通常可用。
    • hierarchy:轮廓的层级信息。
    • maxLevel:绘制的最大等级。
    • offset:偏移量,用于调整绘图位置。

    通过合理配置这些参数,可以在图像中清晰地显示出所检测的轮廓。

    转载地址:http://qrsfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现高斯消除算法(附完整源码)
    查看>>
    Objective-C实现高斯滤波GaussianBlur函数用法(附完整源码)
    查看>>
    Objective-C实现高斯滤波函数(附完整源码)
    查看>>
    Objective-C实现高精度乘法(附完整源码)
    查看>>
    Objective-C实现高精度减法(附完整源码)
    查看>>
    Objective-C实现高精度除法(附完整源码)
    查看>>
    Objective-C实现鸡兔同笼问题(附完整源码)
    查看>>
    Objective-c正确的写法单身
    查看>>
    Objective-C语法之代码块(block)的使用
    查看>>
    ObjectMapper - 实现复杂类型对象反序列化(天坑!)
    查看>>
    ObjectProperty 类的使用
    查看>>
    Objects.equals有坑
    查看>>
    Object常用方法
    查看>>
    Object方法的finalize方法
    查看>>
    Object类有哪些方法,hashcode方法的作用,为什么要重写hashcode方法?
    查看>>
    Objenesis创建类的实例
    查看>>
    OBObjective-c 多线程(锁机制) 解决资源抢夺问题
    查看>>
    OBS studio最新版配置鉴权推流
    查看>>
    Obsidian的使用-ChatGPT4o作答
    查看>>
    Obsidian笔记记录GPT回复的数学公式无缝转化插件Katex to mathjax
    查看>>