2015-01-16 66 views
1

我剛剛學習OpenCV,因爲我有一些Matlab的邏輯索引的經驗,我真的很感興趣看到矩陣方法setTo。我最初的嘗試雖然不起作用,但我無法弄清楚爲什麼,所以我會非常感謝您的幫助!爲什麼setTo不能工作(斷言失敗)?

我有一個包含圖像數據的Mat,並且想要將所有大於10的值設置爲零。所以,我所做的:

Mat not_relevant = abs(difference - frame2) > 10; 

difference = difference.setTo(0, not_relevant); 

然而,這給了我:

OpenCV Error: Assertion failed (mask.empty() || mask.type() == CV_8U) in 
cv::Mat::setTo, file 
C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\core\src\copy.cpp, line 347 

我曾嘗試這樣做使用前轉換not_relevant,差異和幀2,如:

frame2.convertTo(frame2, CV_8UC1); 

但是,這並不修復錯誤,所以我不知道我還能嘗試什麼。有誰知道什麼可能是錯的?

謝謝你的幫助!

回答

1

我覺得這個錯誤很明顯,你的面具圖片的類型應該是CV_8U

因此您需要將not_relevent轉換爲灰度。

Mat not_relevant = abs(difference - frame2) > 10; 
cv::cvtColor(not_relevant, not_relevant, CV_BGR2GRAY); 
difference = difference.setTo(0, not_relevant); 

爲什麼convertTo在這裏不起作用?

CV_8U(或CV_8UC1)是UCHAR值一個信道類型的圖像。

convertTo無法更改圖像中的通道數量。

因此,使用convertTo將具有多個頻道的圖像轉換爲CV_8U不起作用。 查詢this answer以獲得更詳細的解釋。

+0

謝謝omid,它的工作原理!也謝謝你指出我的錯誤 - 我確實沒有意識到convertTo在這裏不起作用。 – noctilux