OpenCV Python 特征检测:如何提供掩码? (筛)
OpenCV Python Feature Detection: how to provide a mask? (SIFT)
我正在 Python3 中构建一个简单的项目,使用 OpenCV3,尝试将拼图块与 "finished" 拼图图像匹配。我已经使用 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.
中找不到任何将掩码传递给任何特征检测算法的代码示例
感谢 Miki,我设法找到了一个错误。
事实证明,我使用阈值操作创建的原始蒙版虽然看起来是二进制的,但却是一个 3 通道图像 ([rows], [cols], 3)
。因此它不能被接受为面具。
检查类型和形状后(必须是 uint8 和 [rows,cols,1]):
print(mask.dtype)
print(mask.shape)
如果它仍然是 3 通道,则将蒙版转换为灰色:
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
我正在 Python3 中构建一个简单的项目,使用 OpenCV3,尝试将拼图块与 "finished" 拼图图像匹配。我已经使用 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.
中找不到任何将掩码传递给任何特征检测算法的代码示例感谢 Miki,我设法找到了一个错误。
事实证明,我使用阈值操作创建的原始蒙版虽然看起来是二进制的,但却是一个 3 通道图像 ([rows], [cols], 3)
。因此它不能被接受为面具。
检查类型和形状后(必须是 uint8 和 [rows,cols,1]):
print(mask.dtype)
print(mask.shape)
如果它仍然是 3 通道,则将蒙版转换为灰色:
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)