Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法使用cv2.approxPolyDP来近似开放曲线?_Python_Python 3.x_Opencv_Opencv3.2 - Fatal编程技术网

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

Python 有没有办法使用cv2.approxPolyDP来近似开放曲线?,python,python-3.x,opencv,opencv3.2,Python,Python 3.x,Opencv,Opencv3.2,我想用线段链近似平滑线 OpenCV 3.4中的cv2.approxPolyDP在闭合曲线的情况下取得了良好的结果 原点闭合曲线: 近似闭合曲线: 但在开放曲线的情况下,cv2.approxPolyDP没有达到预期的效果 原点开放曲线: 近似开放曲线: 我想要的结果应该是一条线段链,而不是一个闭合多边形,如下图所示(这张图片是由Photoshop创建的,但不是Python程序): 有没有办法使用cv2.approxPolyDP来近似开放曲线 我的Python程序如下所示: import c

我想用线段链近似平滑线

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()
我的程序中使用的原始照片如下

根据,您只需使用
closed=False

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

所以你应该能够做到:

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

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


请参见这里介绍了如何在Python/OpenCV中使用cv2.approxPolyDP实现这一点

输入(截取的屏幕外捕捉标题栏)



我试图修改参数
closed=False
。但是在我的例子中,虽然曲线在我的原始图片中只有1个像素,
cv2.approxPolyD
返回围绕原点曲线的线段链。我只想得到一条直线段链。@然后你能编辑并添加一个到不符合你需要的东西的OP中,以便解决你的实际问题吗?谢谢你提醒我,我的声誉不到10,所以我不能在描述中添加图像,但我在自己的博客上添加了一个外部链接来解释我的情况。啊哈!我想我已经从你博客中的图片中发现了这个问题,现在我明白你所说的“加倍”是什么意思了。轮廓是形状的轮廓,这意味着即使是一条直线,其轮廓也是围绕该直线的矩形。因此,您确实需要近似曲线本身,您可以使用
cv2.findNonZero()
直接在灰度图像上获得的像素。不过,我不知道如何将它们按正确的顺序排列。另外,我给了你一张赞成票,所以你现在应该可以直接将你的图片添加到你的帖子中(如果你愿意的话)。
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)