OpenCV轮廓检测

一、简介

OpenCV是一个强大且流行的计算机视觉库,广泛应用于各种领域,如机器人、安防、自动驾驶、医疗等。OpenCV提供了许多函数和算法来处理图像和视频的问题,而轮廓检测是其中之一。轮廓是由图像中的连续点组成的曲线,其表示了这个物体的边界。轮廓检测可以在计算机视觉领域中起到非常重要的作用,例如图像分割、物体识别、运动跟踪、手势识别等。

二、基本函数

OpenCV提供了许多轮廓检测的函数,其中最常用的函数是findContours()。该函数可用于在二进制图像中找到所有的轮廓。该函数返回的结果是一组点的列表,每个列表代表一个轮廓。在使用findContours()函数之前,我们需要将图像转换为二进制图像,即使得背景为黑色,物体为白色的图像。接下来是 findContours()函数的基本使用:

import cv2
img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0,0,255), 3)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上代码展示了如何使用findContours()函数来检测图像的轮廓。首先读入一张图像,将其转换为灰度图像,然后将灰度图像转换为二进制图像。接着使用findContours()函数找到图像中所有的轮廓,绘制出所有轮廓,并将结果打印出来。

三、检测模式

1. RETR_EXTERNAL

该模式只检测最外层的轮廓,忽略不在外部的轮廓。

img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0,0,255), 3)

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. RETR_TREE

该模式会检测所有的轮廓,并且将其组合成一个树形结构,每个轮廓都有一个父轮廓和子轮廓。

img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for i in range(len(contours)):
    if hierarchy[0][i][3] == -1:
        cv2.drawContours(img, contours, i, (0, 255, 0), 2)

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上代码展示了如何使用RETR_TREE模式检测图像的轮廓,并展示了如何访问轮廓的层次结构。

四、逼近方法

逼近方法是指我们可以用一条直线或一个多边形来逼近一个轮廓。这对于降低计算量和压缩数据是非常有用的。OpenCV提供了多种逼近方法,包括:

  • cv2.CHAIN_APPROX_NONE:存储所有的边界点
  • cv2.CHAIN_APPROX_SIMPLE:只存储拐角点
  • cv2.CHAIN_APPROX_TC89_L1
  • cv2.CHAIN_APPROX_TC89_KCOS

1. cv2.CHAIN_APPROX_NONE

使用cv2.CHAIN_APPROX_NONE模式,可以检测出图像的所有轮廓点。下面是代码示例:

img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0,255,0), 3)

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. cv2.CHAIN_APPROX_SIMPLE

使用cv2.CHAIN_APPROX_SIMPLE模式,只保存重要的拐角点,可以大大减小存储空间。下面是代码示例:

img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    cv2.drawContours(img, [cnt], 0, (0,255,0), 3)

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. cv2.approxPolyDP()

除了cv2.CHAIN_APPROX_SIMPLE以外,我们还可以使用cv2.approxPolyDP()函数对轮廓进行逼近。该函数会将轮廓逼近为一条直线或一组多边形。下面是代码示例:

img = cv2.imread('image.tif')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

for cnt in contours:
    epsilon = 0.01 * cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, epsilon, True)
    cv2.drawContours(img, [approx], 0, (0,255,0), 3)

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

五、结论

本文详细介绍了OpenCV轮廓检测的基本函数、检测模式和逼近方法。轮廓检测是计算机视觉中常用的技术之一,可以用于图像分割、物体识别、运动跟踪、手势识别等。通过本文的介绍,读者可以掌握OpenCV轮廓检测的基本原理和常用方法,为计算机视觉的研究和应用提供帮助。

原创文章,作者:IZEHL,如若转载,请注明出处:https://www.506064.com/n/370801.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
IZEHLIZEHL
上一篇 2025-04-22 01:14
下一篇 2025-04-22 01:14

相关推荐

  • 如何在PyCharm中安装OpenCV?

    本文将从以下几个方面详细介绍如何在PyCharm中安装OpenCV。 一、安装Python 在安装OpenCV之前,请确保已经安装了Python。 如果您还没有安装Python,可…

    编程 2025-04-29
  • Python OpenCV 直线检测

    本文将介绍在Python OpenCV中进行直线检测的方法,主要涉及到图像的边缘检测、霍夫变换和绘制直线等操作。 一、边缘检测 由于直线检测是从图像的边缘开始的,因此必须先找到图像…

    编程 2025-04-29
  • Opencv 实现读取 BMP 图片

    Opencv 是一个基于 C/C++ 语言的开源计算机视觉库,可以用于图像处理、特征识别、目标跟踪、机器学习等领域。在图像处理中,读取 BMP 图片是常见操作之一。 一、打开 BM…

    编程 2025-04-27
  • opencv鼠标绘图

    本文将为您详细介绍如何使用opencv在原始图片上进行鼠标绘图。 一、准备工作 在开始绘制之前,您需要先准备好以下的工作: 1、安装opencv库,可以通过pip install …

    编程 2025-04-27
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • OpenCV的全面介绍

    OpenCV是一款强大的开源计算机视觉库,它包含了各种用于图像和视频处理,图像识别和机器学习的函数,它可以用于开发实时的计算机视觉软件和系统,特别适用于图像处理、物体识别、人脸识别…

    编程 2025-04-25
  • Opencv CUDA编译用法介绍

    本文将从多个方面对Opencv CUDA编译进行详细的阐述和解读。通过以下小标题,我们将详细介绍如何进行编译。 一、环境搭建 在使用CUDA进行加速之前,需要进行CUDA的环境搭建…

    编程 2025-04-25
  • 详解OpenCV高斯滤波

    一、高斯滤波的介绍 OpenCV高斯滤波是一种平滑图像的处理方法,通常用于去除噪声、模糊化图像等。它的原理是利用高斯函数进行加权平均,从而减少噪声的干扰。 在图像处理中,噪声是一种…

    编程 2025-04-25
  • Clion配置OpenCV

    Clion是一个功能强大的跨平台集成开发环境,但要开发图像处理、计算机视觉等相关领域应用,需要将OpenCV集成到Clion中,才能方便地进行开发。本文将介绍如何在Clion中配置…

    编程 2025-04-24
  • OpenCV之cv2.imshow()

    一、cv2.imshow()介绍 cv2.imshow()是OpenCV中显示图像的主要函数之一。它可以显示传递给它的图像窗口,或者将图像作为选定窗口的内容。cv2.imshow(…

    编程 2025-04-24

发表回复

登录后才能评论