python - OpenCV Python 特征检测 : how to provide a mask? (SIFT)

标签 python opencv types feature-detection sift

我正在使用 OpenCV3 在 Python3 中构建一个简单的项目,试图将拼图 block 与“完成的”拼图图像匹配。我已经使用 SIFT 开始了我的测试。

我可以提取拼图 block 的轮廓并裁剪图像,但是由于大部分高频当然位于拼图周围(拼图结束和地板开始的地方),我想将 mask 传递给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 中找不到任何将掩码传递给任何特征检测算法的代码示例。

最佳答案

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

事实证明,我使用阈值操作创建的原始掩码虽然看起来是二进制的,但却是一个 3 channel 图像 ([rows], [cols], 3)。因此它不能被接受为掩码。

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

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

如果它仍然是 3 channel ,则将蒙版转换为灰色:

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

关于python - OpenCV Python 特征检测 : how to provide a mask? (SIFT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42346761/

相关文章:

c++ - "int f(int(fn)())"和 "int f(int(*fn)())"之间的区别?

python - 是否有针对 bool 列表的元素明智 bool 运算符的内置函数?

python - 如何在 Python 中编写一个在 20 个不同的 csv 文件上运行该函数的函数?

c++ - 为什么?具体的像素处理应该是process (h, w) not (w, h) or (x, y)

c++ - 在Windows上使用Qt和opencv构建问题

generics - 未确定的泛型类型在 ghci 的运行时如何表示

types - 有没有办法在 Perl 6 程序中获取所有已知类型的列表?

python - 如何使用 ansi 转义码为 python 中的特定字符单元着色,其中字符单元位置由变量确定

python - 使用掩码移动知道新坐标的二维数组的值

opencv - OpenCV 中的人脸检测