2017-02-20 199 views
1

我正在使用OpenCV3在Python3中构建一个简单的项目,尝试将拼图碎片匹配到“完成的”拼图图像。我已经通过使用SIFT开始了我的测试。OpenCV Python特征检测:如何提供掩码? (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: error: (-5) mask has incorrect type (!=CV_8UC1) in function detectAndCompute

从我的研究,UINT8仅仅是CV_8U,这是一样的别名CV_8UC1。无法找到任何将掩码传递给Python中的任何特征检测算法的代码示例。

+0

如果'img1'是一个彩色图像,它有3个通道,所以你的掩码最终是'CV_8UC3'类型,因为你使用'img1.shape',这就像'[rows,cols,3]'。你需要建立一个单通道掩码。 – Miki

+0

我还使用了用不同方法创建的二进制掩码,我认为它是[rows,cols,1],但是由于您的回答,我发现它在某处沿途被转换为3通道图像。谢谢!对于这个问题感到抱歉(仍然试图找出Python中的类型控制)。有没有办法让我接受你的评论作为答案? – m3h0w

+0

很高兴帮助。只需用正确的代码和解释自己写一个答案 – Miki

回答

1

感谢Miki我设法找到了一个错误。

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

检查类型和形状之后(必须是UINT8和[行,COLS,1]):

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

转换掩模为灰色如果它仍然3通道:

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