OpenCV Python Feature Detection: how to provide a mask? (SIFT)

大兔子大兔子 提交于 2019-12-22 06:42:14

问题


I am building a simple project in Python3, using OpenCV3, trying to match jigsaw pieces to the "finished" jigsaw image. I have started my tests by using SIFT.

I can extract the contour of the jigsaw piece and crop the image but since most of the high frequencies reside, of course, around the piece (where the piece ends and the floor starts), I want to pass a mask to the SIFT detectAndCompute() method, thus forcing the algorithm to look for the keypoints only within the piece.

test_mask = np.ones(img1.shape, np.uint8)
kp1, des1 = sift.detectAndCompute(img1, mask = test_mask)

After passing a test mask (to make sure it's uint8), I get the following error:

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

From my research, uint8 is just an alias for CV_8U, which is the same as CV_8UC1. Couldn't find any code sample passing a mask to any feature detection algorithm in Python.


回答1:


Thanks to Miki I've managed to find a bug.

It turned out that my original mask that I created using threshold operations, even though looked binary, was a 3-channel image ([rows], [cols], 3). Thus it couldn't be accepted as a mask.

After checking for type and shape (has to be uint8 and [rows,cols,1]):

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

Convert the mask to gray if it's still 3-channel:

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


来源:https://stackoverflow.com/questions/42346761/opencv-python-feature-detection-how-to-provide-a-mask-sift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!