我正在使用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中的任何特徵檢測算法的代碼示例。
如果'img1'是一個彩色圖像,它有3個通道,所以你的掩碼最終是'CV_8UC3'類型,因爲你使用'img1.shape',這就像'[rows,cols,3]'。你需要建立一個單通道掩碼。 – Miki
我還使用了用不同方法創建的二進制掩碼,我認爲它是[rows,cols,1],但是由於您的回答,我發現它在某處沿途被轉換爲3通道圖像。謝謝!對於這個問題感到抱歉(仍然試圖找出Python中的類型控制)。有沒有辦法讓我接受你的評論作爲答案? – m3h0w
很高興幫助。只需用正確的代碼和解釋自己寫一個答案 – Miki