【问题标题】:OpenCV Python Feature Detection: how to provide a mask? (SIFT)OpenCV Python 特征检测:如何提供掩码? (筛)
【发布时间】:2017-07-09 20:41:29
【问题描述】:

我正在 Python3 中构建一个简单的项目,使用 OpenCV3,尝试将拼图块与“完成的”拼图图像匹配。我已经使用 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) 掩码在函数detectAndCompute中的类型不正确(!=CV_8UC1)

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

【问题讨论】:

  • 如果img1 是彩色图像,它有3 个通道,所以你的掩码最终是CV_8UC3 类型,因为你使用img1.shape,类似于[rows, cols, 3]。您需要构建一个单通道掩码。
  • 我还使用了以不同方法创建的二进制掩码,我认为它是 [rows, cols, 1] 但感谢您的回答,我发现它在转换为的过程中的某个地方3 通道图像。谢谢!很抱歉给您带来麻烦(仍在尝试找出 Python 中的类型控制)。有什么方法可以让我接受您的评论作为答案?
  • 很高兴它有帮助。用正确的代码和解释自己写一个答案
  • THIS ANSWER。这可能会有所帮助。
  • 感谢@JeruLuke - 不完全是我想要的,但感谢 Miki,我确实解决了这个问题。谢谢你们!

标签: python opencv types feature-detection sift


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 2013-04-28
    • 2021-07-29
    • 2014-04-04
    • 1970-01-01
    • 2016-05-19
    • 2012-02-26
    • 2018-08-10
    • 2011-07-11
    相关资源
    最近更新 更多