python-OpenCV之轮廓的查找,绘制,特征,近似,外接矩形

轮廓查找

简述

轮廓即是以某种方式表示图像中的曲线的点的列表,可以把轮廓理解为一个有序的点集。

OpenCV函数原型

cv2.findContours(img, mode, method)

参数解释

img输入的原图片
mode

轮廓检索模式

RETR_EXTERNAL :只检索最外面的轮廓;

RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;

RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;

RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;

method

轮廓逼近模式

CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。

CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。

轮廓绘制

OpenCV函数原型

cv2.drawContours(image, contours, contourIdx, color, thickness)

参数解释

image输入的原图片
contours已经查找出的多个轮廓
contourldx需要绘制的轮廓的索引
color绘制的颜色
thickness绘制的粗细,如果该参数小于0,则表示填充整个轮廓内的区域

注意:该函数会直接在图片上进行绘制,所以一般要将原图复制一份,再进行绘制

轮廓特征

令cnt为图像中的一个轮廓

binary, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
cnt = contours[8]

面积

cv2.contourArea(cnt)

周长

cv2.arcLength(cnt, True)

注意:第二个参数指定图形是否闭环,如果是则为True, 否则只是一条曲线。

轮廓近似

OpenCV函数原型

cv2.approxPolyDP(curve, epsilon, closed)

 参数解释

curve需要进行近似的轮廓
epsilon指定近似精度的参数ε,这是原始曲线与其近似值之间的最大距离。参数越小,两直线越接近
closed若为true,曲线第一个点与最后一个点连接形成闭合曲线,若为false,曲线不闭合。

轮廓的外接矩形

OpenCV函数原型

cv2.rectangle(img, (x, y), (x + w, y + h), color, thickness)

参数解释

img进行绘制的图片
x,y轮廓左上角的坐标
w,h轮廓的宽度和高度
color轮廓颜色
thickness轮廓线条的粗细

关于x,y,w,h的位置关系

x,y ------
|          |
|          |
|          |
--------x+w,y+h

代码演示

import cv2 as cv
import numpy as np

# 读入图片
src = cv.imread('contours.png')
# 转换成灰度图
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv.threshold(gray, 129, 255, cv.THRESH_BINARY)

# 查找轮廓
# binary-二值化结果,contours-轮廓信息,hierarchy-层级
binary, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
# 显示轮廓,tmp为黑色的背景图
tmp = np.zeros(src.shape, np.uint8)
res = cv.drawContours(tmp, contours, -1, (250, 255, 255), 1)
cv.imshow('Allcontours', res)

cnt = contours[8]
tmp2 = np.zeros(src.shape, np.uint8)
res2 = cv.drawContours(tmp2, cnt, -1, (250, 255, 255), 2)
cv.imshow('cnt', res2)

# 轮廓特征
# 面积
print(cv.contourArea(cnt))
# 周长,第二个参数指定图形是否闭环,如果是则为True, 否则只是一条曲线.
print(cv.arcLength(cnt, True))

# 轮廓近似,epsilon数值越小,越近似
epsilon = 0.08 * cv.arcLength(cnt, True)
approx = cv.approxPolyDP(cnt, epsilon, True)
tmp2 = np.zeros(src.shape, np.uint8)
# 注意,这里approx要加中括号
res3 = cv.drawContours(tmp2, [approx], -1, (250, 250, 255), 1)
cv.imshow('approx', res3)

# 外接图形
x, y, w, h = cv.boundingRect(cnt)
# 直接在图片上进行绘制,所以一般要将原图复制一份,再进行绘制
tmp3 = src.copy()
res4 = cv.rectangle(tmp3, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv.imshow('rectangle', res4)

cv.waitKey()
cv.destroyAllWindows()

运行结果

原图片​
检测出的所有轮廓
轮廓特征,近似,外接图形所选择的轮廓
轮廓近似

 

轮廓的外接矩形

参考:python opencv cv2.rectangle 参数含义

  • 10
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python-OpenCV可以用来识别矩形。可以通过使用cv2.findContours()函数来找到图像中的轮廓,然后使用cv2.approxPolyDP()函数来近似这些轮廓,最后使用cv2.drawContours()函数来绘制矩形。此外,还可以使用cv2.boundingRect()函数来获取矩形的位置和大小。 ### 回答2: Python-OpenCV 是一个非常流行的图像处理库,它可以用于各种各样的计算机视觉任务。其中一个常见的应用程序是矩形识别。简单来说,矩形识别是指在一张图像中识别出所有矩形的坐标,并对其进行必要的处理。 在 Python-OpenCV 中,矩形识别可以通过多种方式实现。其中一个常用的方法是使用轮廓检测。轮廓是一些连续的点组成的线条,它们沿着图像的边缘运行,并被用来识别物体的形状和大小。在 Python-OpenCV 中,可以使用 findContours() 函数来查找轮廓。 一旦找到了轮廓,我们就可以使用 approximation() 函数来近似矩形。该函数选择最适合轮廓形状的最小矩形,该矩形可以是边界框或旋转矩形。通过使用这些技术,可以很容易地通过 Python-OpenCV 实现矩形识别。 实现矩形识别具有多种应用。例如,可以在计算机视觉系统中使用它来检测物体或区域。此外,可以在图像处理应用程序中使用矩形识别来自动裁剪图像或识别文档中的特定区域。总的来说,Python-OpenCV矩形识别是计算机视觉应用中非常振奋人心和有用的技术。 ### 回答3: 矩形识别是Python-OpenCV中常见的任务之一。在Python-OpenCV中,可以使用cv2.rectangle()函数进行矩形绘制。接下来是一些步骤,用于进行矩形识别: 1. 首先,从OpenCV库中导入cv2模块,并使用cv2.imread()函数读取一张图片。 2. 将图片转换为灰度图像。这可以使用cv2.cvtColor()函数完成。 3. 使用cv2.GaussianBlur()函数对原始图像进行模糊处理。这可以减少一些图像噪声。 4. 然后,可以使用cv2.Canny()函数检测边缘。这将产生一张二值化图像,其中端点会在物体的边缘上产生大量点。 5. 接下来,可以通过cv2.findContours()函数找到图像中所有的轮廓。 6. 对于每个找到的轮廓,可以使用cv2.approxPolyDP()函数来近似它们的形状。近似的多边形可以帮助找到矩形。 7. 对于近似的多边形,可以使用cv2.boundingRect()函数查找矩形的位置和大小。然后可以在图像上使用cv2.rectangle()函数绘制矩形。 总之,使用Python-OpenCV进行矩形识别是一个四步骤的过程:灰度化、边缘检测、轮廓分析,矩形绘制。这些步骤都可以通过Python-OpenCV库中提供的函数轻松完成。但是对于复杂的场景,矩形识别还有许多待研究的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值