【问题标题】:OpenCV - How to draw a line inside contour?OpenCV - 如何在轮廓内画一条线?
【发布时间】:2020-05-11 16:24:16
【问题描述】:

我正在开发一个 DIY 3d 扫描仪项目。我将使用一个非常常见的算法。
请参阅此处:https://lesagegp.wordpress.com/2013/12/04/laser-scanning-explained/
我已经完全理解了这个算法并为它写了一个代码。我现在要做的就是处理图像。我已经捕获了几张图像进行测试。这是其中之一:

我已经设法用一个非常简单的代码找到了激光的轮廓:

image = cv2.imread("frame/1.png")
image = cv2.flip(image, 1)
hsv_frame = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
low_red = np.array([161, 155, 84])
high_red = np.array([179, 255, 255])
red_mask = cv2.inRange(hsv_frame, low_red, high_red)
contour = cv2.findContours(red_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[0]
draw_it = cv2.drawContours(image, contour, -1, (0, 255, 0), 3)

cv2.imshow("contour",draw_it)

结果:

现在我要做的就是在轮廓内部或轮廓的内边缘绘制一条折线或类似的东西。就像本例中的蓝线:

有没有办法做到这一点并获取该线的坐标?提前致谢。

【问题讨论】:

  • 你在寻找轮廓的中轴吗?
  • @Micka 中轴或内轴很好。我只想得到一条线而不是轮廓。

标签: python python-3.x opencv image-processing python-imaging-library


【解决方案1】:

让我们从稍微修剪过的轮廓图像开始——我碰巧是通过其他方式生成的,因为你的代码没有在我的 OpenCV 版本上运行:

然后我会将其读取为灰度,并使用 skimage 函数medial_axis() 找到中轴,如下所示:

import cv2
from skimage.morphology import medial_axis

# Load your trimmed image as greyscale
image = cv2.imread("a.png", cv2.IMREAD_GRAYSCALE)

# Find medial axis
skeleton = medial_axis(image).astype(np.uint8)

# Save
cv2.imwrite("result.png", skeleton*255)

关键词:图像处理、Python、OpenCV、skimage、scikit-image、中轴、骨架、骨架化。

【讨论】:

  • 非常感谢。还有一件事。你知道在结果中获取白线坐标的方法吗?
  • 当然,X,Y = np.where(skeleton>0)
  • 或者,如果您希望它们成对压缩coords = np.column_stack(np.where(skeleton>0))
猜你喜欢
  • 2020-07-04
  • 2021-09-07
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 2023-03-21
相关资源
最近更新 更多