有没有办法从Python OpenCV中的给定圆外的轮廓中删除点?

时间:2014-11-29 23:57:15

标签: python opencv contour

让我们说我有一个轮廓,意在表示手的形状。问题是,轮廓还包含手臂的其他部分(即手腕,前臂,上臂等)。为了找到手部中心的位置,我正在观察组合(尺寸3) )凸壳的缺陷点,找到与这3个点相切的圆心,并将最合理的圆平均在一起,以粗略地理解手的中心位置。

通过这个平均中心,我希望能够移除我给定轮廓上的点,这些点不会落入可能确定手的宽度的半径范围内 - 在其他单词,不在此圈内的截止点。我可以简单地遍历每个轮廓点并删除这些点,但由于Python循环,这将是非常低效的。速度。是否有更快或更有效的方法,可能使用一些内置的OpenCV函数或其他?

谢谢!

1 个答案:

答案 0 :(得分:0)

有趣的your other question后续行动。

您可以通过布尔索引删除不需要的点:

import numpy as np
hand_contour = np.random.rand(60,2)  # you can use np.squeeze on the data from opencv to get rid of that annoying singleton axis (60,1,2)->(60,2)
# You have found the center of the palm and a possible radius
center = np.array([.3, .1])
radius = .3
mask = (hand_contour[:,0] - center[0])**2 + (hand_contour[:,1] - center[1])**2 < radius**2
within_palm = hand_contour[mask,:]  # Only selects those values within that circle.

您还可以使用masked_array屏蔽不需要的值,但如果您对保留原始数据不感兴趣,则可采用上述方法。