我正在使用opencv和python进行编程,我试图在我知道它们的坐标的两个点之间画一条线,然后让线完成直到它到达轮廓的末端,如下图所示。在我的情况下,轮廓实际上是一个图像面,但我在这里提供了一个圆圈用于解释。所以我想要达到的目的是让头部的边缘与线和轮廓相交。有没有办法从两个点画一条线然后让线完成绘图直到到达轮廓?
答案 0 :(得分:0)
我可以想到一个简单的方法,它不会涉及逐步更新图像:在一个空白图像上,绘制从第一点沿第二点方向延伸的长线,然后并且得到的图像具有绘制(填充)的单个轮廓的图像。这将使轮廓末端的线停止。然后,您可以使用该蒙版绘制线条,或者如果您想要线条的坐标,则可以获得最小/最大x,y坐标。
通过一个例子,首先我们找到轮廓并将其绘制在空白图像上:
contours = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[1]
contour_img = np.zeros_like(img)
cv2.fillPoly(contour_img, contours, 255)
然后,如果我们有点p1
和p2
,找到他们前进的方向并找到该距离远的点并在新的空白图像上绘制该线(这里我使用距离p1
1000像素的距离):
p1 = (250, 250)
p2 = (235, 210)
theta = np.arctan2(p1[1]-p2[1], p1[0]-p2[0])
endpt_x = int(p1[0] - 1000*np.cos(theta))
endpt_y = int(p1[1] - 1000*np.sin(theta))
line_img = np.zeros_like(img)
cv2.line(line_img, (p1[0], p1[1]), (endpt_x, endpt_y), 255, 2)
然后简单cv2.bitwise_and()
两个图像一起
contour_line_img = cv2.bitwise_and(line_img, contour_img)
这是一个图像,显示了点,延伸过轮廓的线,以及在轮廓处断开的线。
编辑:请注意,这仅适用于轮廓凸出的情况。如果有任何凹陷且线条穿过那个凹陷部分,它将继续在它的另一边画出。对于例如在Silencer的回答中,如果两个点都在耳朵内部并且指向另一只耳朵,那么一旦它到达边缘,你就会想要轮廓停止,但我的另一只耳朵会继续吸引它。我认为像Silencer这样的迭代方法对于一般情况来说是最好的,但是我喜欢这种方法的简单性,如果你知道你有凸轮廓或者你的点会在没有这个问题的地方。< / p>
Edit2:Stack上的其他人通过创建一个来回答他们自己关于Python中Line Iterator类的问题:openCV 3.0 python LineIterator