我有白色背景和简单形状的图像(每个图像都有一个形状)。我想确定某个点(x,y)是否在形状内部。我怎么能用opencv做到这一点?
答案 0 :(得分:12)
使用pointPolygonTest
功能。 Here's教程。
答案 1 :(得分:1)
要确定某个点是在形状的内部,外部还是边缘,可以使用cv2.pointPolygonTest()
检查该点是否在轮廓内。该函数返回import os
current_path = os.getcwd()
print('Current path: %s' %current_path)
filenames = os.listdir(current_path)
for filenamen in filnames:
os.rename(filename, filename.replace(" ", "_"))
os.rename(filename, filename.replace(".", "_"))
os.rename(filename, filename.replace(",", "_"))
os.rename(filename, filename.replace(";", "_"))
os.rename(filename, filename.replace("-", "_"))
os.rename(filename, filename.replace("–", "_"))
os.rename(filename, filename.replace("—", "_"))
os.rename(filename, filename.replace("ß", "ss"))
os.rename(filename, filename.replace("ä", "ae"))
os.rename(filename, filename.replace("ü", "ue"))
os.rename(filename, filename.replace("ö", "o"))
os.rename(filename, filename.replace("á", "a"))
os.rename(filename, filename.replace("â", "a"))
os.rename(filename, filename.replace("à", "a"))
…
,+1
或-1
分别指示一个点是在轮廓的内部,外部还是在轮廓上。假设我们已经有了形状的轮廓,我们可以简单地将轮廓和0
点传递给函数。
(x,y)
在函数中,第三个参数为result = cv2.pointPolygonTest(contour, (x,y), False)
。如果为measureDist
,则会找到图像中的点与轮廓之间的最短距离。如果为True
,它将发现该点是在内部,外部还是在轮廓上。由于我们不想找到距离,因此将False
参数设置为measureDist
这是一个找到方形轮廓然后检查点是否在轮廓内的示例
测试图像
找到轮廓并检查点后的图像
结果
point1:-1.0
point2:1.0
point3:0.0
因此,point1在外部,point2在内部,point3在轮廓上
False
答案 2 :(得分:0)
如果要访问凸包内部的所有点,可以进行遮罩
我首先通过在黑色框架上用cv2.fillPoly()将我的凸包白色绘制为白色来解决这个问题
black_frame = np.zeros_like(your_frame).astype(np.uint8)
cv2.fillPoly(black_frame , [hull], (255, 255, 255))
mask = black_frame == 255
targetROI = your_frame * mask
black_frame = np.zeros_like(your_frame).astype(np.uint8)
cv2.fillPoly(black_frame , [hull], (255, 255, 255))
mask = black_frame == 255
targetROI = your_frame * mask