详细解释opencv python中的 cv.approxPolyDP

这篇具有很好参考价值的文章主要介绍了详细解释opencv python中的 cv.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 来计算矩形和轮廓交集的面积。

具体的步骤如下:

  1. 使用 cv2.findContours 函数得到输入轮廓的顶点坐标数组。
# img 为输入图像
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  1. 使用 cv2.minAreaRect 函数计算轮廓包围的最小矩形框及其四个顶点的坐标。
rect = cv2.minAreaRect(contours[0])  # 计算最小矩形框
box = cv2.boxPoints(rect)  # 得到矩形框的四个顶点坐标
box = np.int0(box)  # 转换为整型
  1. 使用 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 函数通常用于求取多边形的包围盒,以便进行后续图形处理、物体识别等操作。文章来源地址https://www.toymoban.com/news/detail-665558.html

到了这里,关于详细解释opencv python中的 cv.approxPolyDP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入解析OpenCV中的cv2.waitKey()函数

    OpenCV 是一个开源计算机视觉库,广泛用于图像处理和计算机视觉任务。在图像处理中,有时候我们需要在图像显示时等待用户的交互,例如等待用户按下一个键来关闭图像窗口或执行其他操作。这时就可以使用 waitKey() 函数。 waitKey() 函数通常与OpenCV的图像显示功能一起使用

    2024年02月04日
    浏览(51)
  • 【CV 向】了解 OpenCV 中的算术与位运算

    Python OpenCV 是一个功能强大的计算机视觉库,用于图像处理和计算机视觉任务。在 OpenCV 中,我们可以使用 NumPy 库创建图像,并应用算术和位运算来实现图像的增强、特效处理和图像融合等操作。本文将介绍如何利用 NumPy 创建图像,并展示如何使用 Python OpenCV 进行算术与位运

    2024年02月09日
    浏览(44)
  • C#中的yield return详细解释

    C# 中的 yield return 是一个强大的,它可以帮助我们在不创建临时集合的情况下,实现可枚举的值的生成。yield return 可以实现延迟执行(Lazy Evaluation), 更具可读性和优化内存的使用。 yield return 的工作原理 在 C# 中,当我们使用 yield return 时,编译器会为我们生成一个名

    2024年02月13日
    浏览(37)
  • OpenCV-Python学习(13)—— OpenCV 多边形填充与绘制(cv.fillPoly、cv.polylines)

    1. 知识点 学习 cv.polylines 函数的使用; 学习 cv.fillPoly 函数的使用。 2. 绘制折线或多边形 cv.polylines 函数说明 2.1 函数使用 2.2 参数说明 参数 说明 img 表示要在其上绘制矩形的图像的img对象。 pts 表示一个或多个点集。 isClosed 表示标志,决定所绘制的多边形是否闭合。若为 T

    2024年02月16日
    浏览(59)
  • Python cv2 opencv-python opencv-contrib-python 安装

    老规矩,话不多说,上代码! pip install opencv-python(如果只用主模块,则使用这个命令安装【推荐】) pip install opencv-contrib-python(如果需要用到 contrib 模块,则使用这个命令【本次因自己没有使用 contrib 模块,所以没有尝试】) 首先,讲一下 cv2 这个模块是 opencv 的,所以安

    2024年02月11日
    浏览(49)
  • 利用C++超详细解释数据结构中的链表

    链表(Linked List)是一种常见的数据结构,它可以动态地插入和删除元素,不需要像数组那样预先分配固定大小的内存。链表中的每个元素称为节点(Node),每个节点包含一个数据值和一个指向下一个节点的指针。本教学将涵盖以下知识点: 单向链表(Singly Linked List) 双向

    2024年02月04日
    浏览(31)
  • 深入理解 OpenCV 中的二值化:cv2.THRESH_BINARY 与 cv2.THRESH_OTSU 的组合运用

    引言 在图像处理和计算机视觉中,二值化是一种常见的图像处理技术,用于将图像转换为只有两种可能取值的图像,通常是黑白。OpenCV 提供了一种强大的工具来实现图像二值化,即 cv2.threshold() 函数。本篇博客将深入介绍 cv2.THRESH_BINARY 和 cv2.THRESH_OTSU 的组合使用,以及它们对

    2024年02月05日
    浏览(47)
  • python使用cv2库、下载opencv库

    cv2库在opencv库内,因此需要下载opencv-python和opencv-contrib-python 1、打开windows命令行: win+R cmd 2、更新pip版本(不一定要): python -m pip install --upgrade pip 3、使用pip下载opencv: 下载opencv库前最好要下载numpy库。 这里使用中科大的镜像源:https://pypi.mirrors.ustc.edu.cn/simple/ pip install

    2024年02月01日
    浏览(44)
  • OpenCV-Python学习(15)—— OpenCV 鼠标操作和响应(cv.setMouseCallback)

    1. 学习目标 学习如何在OpenCV中处理鼠标事件; 学习鼠标事件与回调; 学习鼠标事件回调函数的基本流程。 2. Callback 基本流程 3. 鼠标事件 cv.setMouseCallback 函数说明 3.1 cv.setMouseCallback() 函数使用 3.2 参数说明 参数 说明 winname 表示监听鼠标事件的窗口。 onMouse 表示响应函数,即

    2024年02月10日
    浏览(50)
  • OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)

    1. 学习目标 学习旋转矩阵; 学习使用 OpenCV 的 cv.warpAffine 函数进行图片的旋转; 学习使用 OpenCV 的 cv.getRotationMatrix2D 来计算不同旋转中心的不同角度的 MAR 旋转变换矩阵; 学习使用 OpenCV 的 cv.rotate 进行特殊角度的旋转(90,180,270 度)。 2. 不同中心的旋转矩阵计算 2.1 图像

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包