详细解释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()- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
在此示例中,我们首先读取图像并将其转换为灰度图像。然后,我们使用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- 1
- 2
- 3
- 4
- 5
- 6
- 7
其中,输入参数 contour 是输入轮廓的顶点坐标数组,epsilon 是逼近精度参数,closed 是封闭参数;输出结果 area 是逼近多边形的面积。
可以使用 OpenCV 中的函数 cv2.minAreaRect 和 cv2.boxPoints 来计算轮廓包围图形的最小矩形框,并得到矩形框的的四个顶点坐标。然后可以使用 Python 矩形操作库 Shapely 来计算矩形和轮廓交集的面积。
具体的步骤如下:
- 使用 cv2.findContours 函数得到输入轮廓的顶点坐标数组。
- 1
- 2
- 使用 cv2.minAreaRect 函数计算轮廓包围的最小矩形框及其四个顶点的坐标。
- 1
- 2
- 3
- 使用 Shapely 库计算矩形和轮廓交集的面积。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
其中,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)- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
其中,input.jpg 为输入图像文件名,可以替换为其他图像。
使用 OpenCV 中的函数 cv2.boundingRect 对多边形逼近得到的轮廓进行包围矩形计算时,得到的坐标是最小矩形的左上角坐标和宽度高度。也就是说,boundingRect 得到的矩形框是能够完全覆盖多边形的最小矩形框,而不是包含多边形的最大矩形框。
简单来说,boundingRect 得到的矩形框是能够最小化多边形占用的空间大小的矩形框。实际应用中,boundingRect 函数通常用于求取多边形的包围盒,以便进行后续图形处理、物体识别等操作。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |