我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详细解释opencv python中的 cv.approxPolyDP

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详细解释opencv python中的 cv.approxPolyDP

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

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

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

下面是一个简单的示例,展示了如何在OpenCV Python中使用cv.approxPolyDP来逼近多边形:

import cv2 as cvimport 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 = 0if 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 cv2import numpy as npfrom 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 = 0if 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://blog.csdn.net/qq_27487739/article/details/131320356

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详细解释opencv python中的 cv.approxPolyDP

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python委托模式详细解释

收集了网上的三个例子,然后做了些注释:#!/usr/bin/env python3# -*- coding: utf-8 -*-class Wrapper: def __init__(self, obj): self.w
2023-01-31

IP地址的详细解释

  今天这篇文章主要给大家介绍的是关于IP地址十进制和二进制之间的转换、IP地址的分类、IP子网划分、子网掩码以及公有地址和私有地址等CCNA基础知识。对cnna基础知识感兴趣的小伙伴们可以看一下。  (一)二进制和十进制之间的转换  如果IPv4地址使用32位二进制数格式,要使用点分十进制数来表示,例如202.101
IP地址的详细解释
2024-04-17

PyCharm中配置解释器的详细步骤解析

详解在PyCharm中配置解释器的步骤,需要具体代码示例在使用PyCharm进行Python开发时,正确配置解释器是非常重要的一步。解释器是执行Python代码的环境,PyCharm需要知道要使用哪个解释器来运行项目代码。本文将详细介绍在
PyCharm中配置解释器的详细步骤解析
2024-02-03

Linux内核宏Container_Of的详细解释

目录1. 结构体在内存中是如何存储的2. container_of宏3. typeof4. (((type *)0)->member)5. const typeof(((type * )0) ->member)*__mptr = (ptr)
2022-06-04

MySQL EXPLAIN输出列的详细解释

1. 简介EXPLAIN语句提供有关 MySQL 如何执行语句的信息。 EXPLAIN与SELECT、DELETE、INSERT、REPLACE和UPDATE语句一起使用。mysql> EXPLAIN SELECT * FROM emplo
2022-05-30

linux下的tar命令详细解释

tar命令 [root@Linux ~]# tar [-cxtzjvfpPN] 文件与目录 ....参数: -c :建立一个压缩文件的参数指令(create 的意思); -x :解开一个压缩文件的参数指令! -t :查看 tarfile 里
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录