首页 文章

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

提问于
浏览
3

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

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

1 回答

  • 2

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

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

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

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

    如果它仍然是3通道,则将掩码转换为灰色:

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

相关问题