我想用线段链来近似平滑线。

OpenCV 3.4中的cv2.approxPolyDP在闭合曲线的情况下取得了很好的效果。

原点闭合曲线: 原点闭合曲线 近似闭合曲线: 近似闭合曲线

但是在开曲线的情况下,cv2.approxPolyDP并没有达到预期的效果。

原点开曲线: 原点开曲线 近似开放曲线: 近似开放曲线

我想要的结果应该是一条线段链,而不是一个封闭的多边形,像这样(这张图片是由 Photoshop 创建的,而不是 Python 程序创建的): 在此处输入图片说明

有没有办法使用 cv2.approxPolyDP 来近似开放曲线?

我的 Python 程序如下:

import cv2

img = cv2.imread('1.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cv2.imshow("gray", gray)
cv2.waitKey(0)

_, binary = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)

# cv2.imshow("binary", binary)
# cv2.waitKey(0)

_, contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    epsilon = 0.009 * cv2.arcLength(contour, True)
    approx = cv2.approxPolyDP(contour, epsilon, closed=True)
    cv2.drawContours(img, [approx], -1, (0, 255, 255), 1)

cv2.imshow("approx", img)
cv2.waitKey(0)

cv2.destroyAllWindows()

我的程序中使用的原始照片如下。

闭合曲线照片打开曲线照片

#1楼 票数:1

根据approxPolyDP()文档,您可以简单地使用closed=False

closed – 如果为真,则近似曲线是闭合的(它的第一个和最后一个顶点是连接的)。 否则,它不会关闭。

所以你应该能够做到:

approx = cv2.approxPolyDP(contour, epsilon, closed=False)

#2楼 票数:1 已采纳

以下是如何使用 cv2.approxPolyDP 在 Python/OpenCV 中执行此操作

输入(裁剪掉屏幕快照标题栏)

在此处输入图片说明

import numpy as np
import cv2

# read input
img = cv2.imread('curve.png')
hh, ww = img.shape[:2]

# convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold
thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)[1]

# get points
points = np.column_stack(np.where(thresh.transpose() != 0))

# list points
for pt in points:
    ptx = pt[0]
    pty = pt[1]
    print(ptx,pty)

# approximate polygon
poly = cv2.approxPolyDP(points, 0.02 * ww, False)

# list polygon points
for p in poly:
    px = p[0]
    py = p[0]
    print(px,py)

# draw polygon on copy of input
result = img.copy()
cv2.polylines(result, [poly], False, (0,0,255), 1)

# save results
cv2.imwrite('curve_polygon.png', result)

cv2.imshow("thresh", thresh)
cv2.imshow("result", result)
cv2.waitKey(0)

在此处输入图片说明

#3楼 票数:0

最后还是没找到可以直接在OpenCV中使用的方法。 但是我找到了一种算法(名为 Ramer-Douglas-Peucker 算法),只需少量代码即可近似曲线。

https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm

https://www.sciencedirect.com/science/article/abs/pii/0167865594900027

  ask by vividmoon translate from so

未解决问题?本站智能推荐:

2回复

cv2.minAreaRect 错误,给了我与凸包函数相关的错误,我没有使用过

在下面的代码中,我试图找出一个对象是否为绿色并在其周围绘制轮廓。 有了这些信息,我还想找到形状的角并裁剪它,但是我收到了一个与我没有在代码中使用的 ConvexHull 函数相关的错误。 我使用过 python 3 和 Opencv 3.2.0 我写的代码给了我这个错误 这是我的代码 一段
2回复

如何在openCV 3.2.0中使用BruteForce Matching?

我正在使用opencv 3.2.0,并且试图分别进行特征检测,描述符计算以及与FAST,BRISK和BruteForce的描述符匹配。 我在Visual Studio 2017中使用C ++。 这是我的简单代码,无法正常运行。 我阅读了许多代码和技巧,但找不到适合我问题的正确解决方案
2回复

如何使用OpenCV从底部填充图像直到检测到边缘?

我的目标是能够使用OpenCV 3复制此链接中显示的避障方法。似乎他们提供的软件仅适用于Windows。 我认为可以使用OpenCV复制。 我目前正在使用Canny边缘检测进行第2步。 我不确定我可以使用什么功能来创建第3步,即从底部填充图像,直到检测到边缘为止。 任何参考材料将不胜感激
1回复

已安装OpenCV 3.2,但无法使用它。 每次加载4.0版本

我有问题,那就是我在挣扎。 我将python(anaconda)用于某些代码。 我目前正在从openCV进行教程。 每当需要安装新软件包时,我都会创建env。 这些是我正在执行的步骤: 创造新环境 (确保已安装版本3.2.0) 然后我去python检查版本:
1回复

cv2.approxPolydp() 返回什么?

我正在尝试根据应用cv2.approxPolyDP()后检测到的轮廓调整图像大小。 之后,我必须使用cv2.resize()自定义裁剪它,并根据cv2.approxPolyDP()检测到的轮廓的返回值进行裁剪。 我想知道哪个索引是高度,哪个索引是宽度或起始 x,y 坐标和结束 x,y 坐标。
4回复

在python中使用cv2.approxPolyDP()绘制轮廓

我无法使用cv2.approxPolyDP()绘制形状的完整轮廓。 我得到以下结果: 但我想要这样的输出: 这是我的代码:
1回复

cv2.approxPolyDP() , cv2.arcLength() 这些是如何工作的

这些功能是如何工作的? 我正在使用 Python3.7 和 OpenCv 4.2.0。 提前致谢。
2回复

OpenCV - 可视化使用 cv2.approxPolyDP() 提取的多边形曲线

我想可视化使用cv2.approxPolyDP()提取的多边形曲线。 这是我正在使用的图像: 我的代码尝试隔离主岛并定义和绘制轮廓近似值和轮廓船体。 我已经绘制了绿色的轮廓,红色的近似值: 以下是生成的图像: 第一个图像以绿色绘制轮廓。 第二个以红色绘制近似值 - 如何将此近似值绘制