OpenCV Python特征检测:如何提供掩码? (筛)

时间:2017-02-20 14:08:14

标签: python opencv types feature-detection sift

我正在使用OpenCV3在Python3中构建一个简单的项目,试图将拼图块与#34;完成"拼图图像。我已经开始使用SIFT进行测试了。

我可以提取拼图的轮廓并裁剪图像,但由于大部分高频位于片段周围(片段结束和地板开始),我想将面具传递给SIFT detectAndCompute()方法,从而迫使算法仅在片段内查找关键点。

test_mask = np.ones(img1.shape, np.uint8)
kp1, des1 = sift.detectAndCompute(img1, mask = test_mask)

在通过测试掩码(确保它的uint8)后,我收到以下错误:

  

kp1,des1 = sift.detectAndCompute(img1,mask = test_mask)   cv2.error:/home/pyimagesearch/opencv_contrib/modules/xfeatures2d/src/sift.cpp:772:错误:( - 5)掩码在函数detectAndCompute中的类型不正确(!= CV_8UC1)

根据我的研究,uint8只是CV_8U的别名,与CV_8UC1相同。无法找到任何将掩码传递给Python中任何特征检测算法的代码示例。

1 个答案:

答案 0 :(得分:3)

感谢Miki,我设法找到了一个bug。

事实证明,我使用阈值操作创建的原始蒙版即使看起来是二进制的,也是一个3通道图像([rows], [cols], 3)。因此,它不能被接受作为面具。

检查类型和形状后(必须是uint8和[rows,cols,1]):

print(mask.dtype)
print(mask.shape)

如果遮罩仍为3通道,则将其转换为灰色:

mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)