- OpenCV Python 教程
- OpenCV Python - 首页
- OpenCV Python - 概述
- OpenCV Python - 环境配置
- OpenCV Python - 读取图像
- OpenCV Python - 写入图像
- OpenCV Python - 使用 Matplotlib
- OpenCV Python - 图像属性
- OpenCV Python - 按位运算
- OpenCV Python - 形状和文本
- OpenCV Python - 鼠标事件
- OpenCV Python - 添加轨迹条
- OpenCV Python - 缩放和旋转
- OpenCV Python - 图像阈值
- OpenCV Python - 图像滤波
- OpenCV Python - 边缘检测
- OpenCV Python - 直方图
- OpenCV Python - 颜色空间
- OpenCV Python - 图像变换
- OpenCV Python - 图像轮廓
- OpenCV Python - 模板匹配
- OpenCV Python - 图像金字塔
- OpenCV Python - 图像加法
- OpenCV Python - 图像混合
- OpenCV Python - 傅里叶变换
- OpenCV Python - 捕获视频
- OpenCV Python - 播放视频
- OpenCV Python - 从视频中提取图像
- OpenCV Python - 从图像生成视频
- OpenCV Python - 人脸检测
- OpenCV Python - 均值漂移/CamShift
- OpenCV Python - 特征检测
- OpenCV Python - 特征匹配
- OpenCV Python - 数字识别
- OpenCV Python 资源
- OpenCV Python - 快速指南
- OpenCV Python - 资源
- OpenCV Python - 讨论
OpenCV Python - 图像轮廓
轮廓是指连接边界上所有连续点的一条曲线,这些点具有相同的颜色或强度。轮廓对于形状分析和物体检测非常有用。
查找轮廓
在查找轮廓之前,我们应该应用阈值或 Canny 边缘检测。然后,通过使用 **findContours()** 方法,我们可以在二值图像中找到轮廓。
**findContours()** 函数的使用命令如下:
cv.findContours(image, mode, method, contours)
参数
**findContours()** 函数的参数如下:
- image - 源图像,一个 8 位单通道图像。
- mode - 轮廓检索模式。
- method - 轮廓近似方法。
mode 参数的值如下:
**cv.RETR_EXTERNAL** - 只检索最外层的轮廓。
**cv.RETR_LIST** - 检索所有轮廓,但不建立任何层次关系。
**cv.RETR_CCOMP** - 检索所有轮廓,并将它们组织成两级层次结构。
**cv.RETR_TREE** - 检索所有轮廓,并重建嵌套轮廓的完整层次结构。
另一方面,近似方法可以是以下之一:
**cv.CHAIN_APPROX_NONE** - 存储所有轮廓点。
**cv.CHAIN_APPROX_SIMPLE** - 压缩水平、垂直和对角线段,只保留它们的端点。
绘制轮廓
在检测到轮廓向量后,可以使用 **cv.drawContours()** 函数在原始图像上绘制轮廓。
cv.drawContours() 函数的命令如下:
cv.drawContours(image, contours, contourIdx, color)
参数
**drawContours()** 函数的参数如下:
- image - 目标图像。
- contours - 所有输入轮廓。每个轮廓都存储为一个点向量。
- contourIdx - 指示要绘制的轮廓的参数。如果为负数,则绘制所有轮廓。
- color - 轮廓的颜色。
示例
以下代码是在具有三个填充黑色形状的输入图像上绘制轮廓的示例。
第一步,我们获取灰度图像,然后执行 Canny 边缘检测。
在结果图像上,我们然后调用 findContours() 函数。其结果是一个点向量。然后我们调用 drawContours() 函数。
完整的代码如下:
import cv2 import numpy as np img = cv2.imread('shapes.png') cv2.imshow('Original', img) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) canny = cv2.Canny(gray, 30, 200) contours, hierarchy = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) print("Number of Contours = " ,len(contours)) cv2.imshow('Canny Edges', canny) cv2.drawContours(img, contours, -1, (0, 255, 0), 3) cv2.imshow('Contours', img) cv2.waitKey(0) cv2.destroyAllWindows()
输出
原始图像、经过 Canny 边缘检测后的图像以及绘制了轮廓的图像将分别显示在不同的窗口中,如下所示:
经过 **Canny 边缘检测** 后,图像如下所示:
经过 **绘制轮廓** 后,图像如下所示: