繁体   English   中英

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

Is there a way to use cv2.approxPolyDP to approximate open curve?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

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()

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

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

3 个回复

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

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

所以你应该能够做到:

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

以下是如何使用 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)

在此处输入图片说明

最后还是没找到可以直接在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

1 cv2.approxPolydp() 返回什么?

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

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

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

6 cv2.approxPolyDP检测点的规则是什么?

我有两个输入图像: 第一: 第二: 现在我想检测方形区域。 这是我的代码: 所以,我得到了两个输出图像: 第一: 第二: 红色线是轮廓线,绿色线是由approxPolyDP检测到的点。 所以,第一个是我想要的。 ...

10 有没有办法向曲线渐变添加边缘?

我想实现以下图像行为。 我不知道其他方式,所以这张照片是手绘的。 图中的所有角均假定为圆角。 我用谷歌搜索并找不到方法来做到这一点,所以我决定通过以下步骤来实现它: 用径向渐变绘制一个圆 用伪元素等隐藏必要部分以外的部分 div { width: 35vmax; hei ...

2020-01-08 11:40:25 1 53   html/ css
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM