2017-02-20 273 views
1

我正在使用OpenCV3在Python3中構建一個簡單的項目,嘗試將拼圖碎片匹配到「完成的」拼圖圖像。我已經通過使用SIFT開始了我的測試。OpenCV Python特徵檢測:如何提供掩碼? (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中的任何特徵檢測算法的代碼示例。

+0

如果'img1'是一個彩色圖像,它有3個通道,所以你的掩碼最終是'CV_8UC3'類型,因爲你使用'img1.shape',這就像'[rows,cols,3]'。你需要建立一個單通道掩碼。 – Miki

+0

我還使用了用不同方法創建的二進制掩碼,我認爲它是[rows,cols,1],但是由於您的回答,我發現它在某處沿途被轉換爲3通道圖像。謝謝!對於這個問題感到抱歉(仍然試圖找出Python中的類型控制)。有沒有辦法讓我接受你的評論作爲答案? – m3h0w

+0

很高興幫助。只需用正確的代碼和解釋自己寫一個答案 – Miki

回答

1

感謝Miki我設法找到了一個錯誤。

事實證明,我使用閾值操作創建的原始遮罩,即使看起來是二進制的,也是3通道圖像([rows], [cols], 3)。因此它不能被接受爲一個面具。

檢查類型和形狀之後(必須是UINT8和[行,COLS,1]):

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

轉換掩模爲灰色如果它仍然3通道:

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