opencv python中cv.approxPolyDP函数详细解释

 更新时间:2024年01月30日 10:11:16   作者:清风云襄  
这篇文章主要给大家介绍了关于opencv python中cv.approxPolyDP函数详细解释的相关资料,OpenCV中的approxPolyDP()函数用于对形状进行逼近,以减少多边形的顶点数,可以用于对图像轮廓点进行多边形拟合,需要的朋友可以参考下

在OpenCV Python中,cv.approxPolyDP是一个用于多边形逼近的函数。它使用Douglas-Peucker算法来减少多边形的点数。

该函数需要两个参数:输入多边形和一个表示逼近精度的参数。输入多边形是一个由点组成的数组,而逼近精度是一个用于控制轮廓近似的精度参数。

该函数在输入多边形中保留重要的角度,并删除不必要的顶点,从而减少了生成多边形所需的点数。它可以用于图像处理中的轮廓发现和分析,通过减少多边形点数,可以更容易地检测和识别形状。

下面是一个简单的示例

展示了如何在OpenCV Python中使用cv.approxPolyDP来逼近多边形:

import cv2 as cv
import numpy as np

# 读取图像
img = cv.imread("polygon.jpg")

# 转换为灰度图像
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 二值化图像
ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)

# 找到轮廓
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

# 逼近多边形
approx = cv.approxPolyDP(contours[0], 0.01 * cv.arcLength(contours[0], True), True)

# 绘制轮廓和逼近多边形
cv.drawContours(img, [contours[0]], 0, (0, 255, 0), 2)
cv.drawContours(img, [approx], 0, (255, 0, 0), 2)

# 显示图像
cv.imshow("Image", img)
cv.waitKey(0)
cv.destroyAllWindows()

在此示例中,我们首先读取图像并将其转换为灰度图像。然后,我们使用cv.threshold将其转换为二值化图像,并使用cv.findContours找到其轮廓。接下来,我们将使用cv.approxPolyDP逼近多边形。最后,我们使用cv.drawContours将原始轮廓和逼近多边形绘制到图像上。

请注意,实际应用中,需要使用适当的值来调整逼近精度参数,以使逼近过程产生最佳结果。

cv.approxPolyDP函数有三个参数,分别是:

  • curve:输入多边形的轮廓。
  • epsilon:逼近精度参数,表示逼近精度的界限。该参数是一个正数,其值越小则逼近程度越高。通常建议使用轮廓周长的一定比例来计算该参数,常见的比例因子为0.01。
  • closed:布尔值参数,表示输出的逼近多边形是否闭合。如果布尔值为True,则输出的多边形是封闭的。如果为False,则只返回线段。

在实际使用时,需要针对具体的应用场景和图像情况来调整epsilon的值,以充分利用其控制逼近精度的功能。

需要注意的是,函数返回值是输出的逼近多边形的点数组形式,可以使用cv.drawContours函数将其绘制到图像上。

cv.approxPolyDP 函数返回的是多边形的顶点坐标数组,可以使用cv.contourArea函数根据这些顶点坐标计算多边形的面积。需要注意的是,cv.contourArea 函数只能用于计算封闭的轮廓的面积,因此需要在调用cv.approxPolyDP 函数时将 closed 参数设为 True,以输出封闭的多边形轮廓。

具体的代码实现方法如下:

# 输入轮廓 contour,逼近精度 epsilon 和封闭参数 closed,返回逼近多边形的面积
def compute_approxPolyDP_area(contour, epsilon, closed=True):
    # 计算逼近多边形的顶点坐标
    approx = cv.approxPolyDP(contour, epsilon, closed)
    # 计算逼近多边形的面积
    area = cv.contourArea(approx)
    return area

其中,输入参数 contour 是输入轮廓的顶点坐标数组,epsilon 是逼近精度参数,closed 是封闭参数;输出结果 area 是逼近多边形的面积。

可以使用 OpenCV 中的函数 cv2.minAreaRect 和 cv2.boxPoints 来计算轮廓包围图形的最小矩形框,并得到矩形框的的四个顶点坐标。然后可以使用 Python 矩形操作库 Shapely 来计算矩形和轮廓交集的面积。

具体的步骤如下:

  • 使用 cv2.findContours 函数得到输入轮廓的顶点坐标数组。
# img 为输入图像
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  • 使用 cv2.minAreaRect 函数计算轮廓包围的最小矩形框及其四个顶点的坐标。
rect = cv2.minAreaRect(contours[0])  # 计算最小矩形框
box = cv2.boxPoints(rect)  # 得到矩形框的四个顶点坐标
box = np.int0(box)  # 转换为整型
  • 使用 Shapely 库计算矩形和轮廓交集的面积。
from shapely.geometry import Polygon

# 计算矩形和轮廓交集的面积
intersection_area = 0
if len(contours) > 0:
    polygon = Polygon(contours[0].reshape(-1, 2))
    rect_polygon = Polygon(box.reshape(-1, 2))
    intersection = rect_polygon.intersection(polygon)
    if intersection.geom_type == 'Polygon':
        intersection_area = intersection.area

其中,Polygon 函数用于创建一个多边形对象,intersection 函数用于计算两个多边形的交集。最终的 intersection_area 变量即为矩形和轮廓交集的面积。

完整代码如下所示:

import cv2
import numpy as np
from shapely.geometry import Polygon

# 读取输入图像
img = cv2.imread('input.jpg', 0)

# 计算轮廓
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 计算最小矩形框
rect = cv2.minAreaRect(contours[0])
box = cv2.boxPoints(rect)
box = np.int0(box)

# 计算矩形和轮廓交集的面积
intersection_area = 0
if len(contours) > 0:
    polygon = Polygon(contours[0].reshape(-1, 2))
    rect_polygon = Polygon(box.reshape(-1, 2))
    intersection = rect_polygon.intersection(polygon)
    if intersection.geom_type == 'Polygon':
        intersection_area = intersection.area

# 输出交集面积
print("Intersection area:", intersection_area)

其中,input.jpg 为输入图像文件名,可以替换为其他图像。

使用 OpenCV 中的函数 cv2.boundingRect 对多边形逼近得到的轮廓进行包围矩形计算时,得到的坐标是最小矩形的左上角坐标和宽度高度。也就是说,boundingRect 得到的矩形框是能够完全覆盖多边形的最小矩形框,而不是包含多边形的最大矩形框。

简单来说,boundingRect 得到的矩形框是能够最小化多边形占用的空间大小的矩形框。实际应用中,boundingRect 函数通常用于求取多边形的包围盒,以便进行后续图形处理、物体识别等操作。

注意事项:

Douglas-Peucker算法:

(1)在曲线的起点 A 和终点 B 之间做一条直线 AB,是曲线的弦;

(2)寻找曲线上离该直线段距离最大的点 C,计算其与 AB 的距离 d;

(3)比较距离 d 与设定的阈值 threshold,如果小于设定阈值则该直线段作为曲线的近似,该段曲线处理完毕。

(4)如果距离 d 大于设定阈值,则以 C 点将曲线 AB 分为两段 AC 和 BC,并分别对这两段进行以上步骤的处理。

(5)当所有曲线都处理完毕时,依次连接所有分割点形成的折线,作为曲线的近似。

总结

到此这篇关于opencv python中cv.approxPolyDP函数详细解释的文章就介绍到这了,更多相关opencv python中的cv.approxPolyDP 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用pandas合并多个excel的方法示例

    利用pandas合并多个excel的方法示例

    这篇文章主要介绍了利用pandas合并多个excel的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 一篇文章带你了解python标准库--datetime模块

    一篇文章带你了解python标准库--datetime模块

    这篇文章主要为大家介绍了python中的datetime模块,datetime模块的接口则更直观、更容易调用,想要了解datetime模块的朋友可以参考一下
    2021-08-08
  • Python自动化运维_文件内容差异对比分析

    Python自动化运维_文件内容差异对比分析

    下面小编就为大家分享一篇Python自动化运维_文件内容差异对比分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • python解决字典中的值是列表问题的方法

    python解决字典中的值是列表问题的方法

    这篇文章主要介绍了字典中的值是列表问题,先用value连成一个str,最后用str.split()作一个转换,生成一个列表.看了python cookbook,上面正好有一个recipe讲到如何处理这样的问题
    2013-03-03
  • python机器学习基础线性回归与岭回归算法详解

    python机器学习基础线性回归与岭回归算法详解

    这篇文章主要为大家介绍了python机器学习基础线性回归与岭回归算法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Python struct模块解析

    Python struct模块解析

    我们知道python只定义了6种数据类型,字符串,整数,浮点数,列表,元组,字典。但是C语言中有些字节型的变量,在python中该如何实现呢?这点颇为重要,特别是要在网络上进行数据传输的话。
    2014-06-06
  • 详解python OpenCV学习笔记之直方图均衡化

    详解python OpenCV学习笔记之直方图均衡化

    本篇文章主要介绍了详解python OpenCV学习笔记之直方图均衡化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法

    pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法

    今天小编就为大家分享一篇pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • win10下python2和python3共存问题解决方法

    win10下python2和python3共存问题解决方法

    在本篇文章里小编给大家整理了关于win10下python2和python3共存问题解决方法,有兴趣的朋友们参考下。
    2019-12-12
  • python属于跨平台语言码

    python属于跨平台语言码

    在本篇文章里小编给大家整理的是关于python是否跨平台的相关知识点文章,有兴趣的朋友们可以参考下。
    2020-06-06

最新评论