2013-07-23 161 views
3

我嘗試將cv :: bitwise_not添加到double值的cv :: Mat矩陣。我申請喜歡cv :: bitwise_not cv :: Mat矩陣

cv::bitwise_not(img, imgtemp); 

img是0和1,但imgtemp具有內部全是廢話數據CV_64F數據。 我期待img中的0爲1,imgtempimg中的1爲0,imgtemp。如何將bitwise_not應用於雙Mat矩陣? 謝謝

回答

3

我無法獲得按位而不是雙精度浮點值的感覺:您還將對指數進行按位運算(請參見here)。所有將被倒置,從0到1反之亦然。 function documentation也有這方面的說明。

對於浮點輸入數組,其機器專用位 表示(通常符合IEEE754標準)用於該操作。

如果你想零成爲的人,反之亦然,如建議,你可以這樣做:

cv::threshold(warpmask, warpmaskTemp,0.5,1.0,THRESH_BINARY_INV) 

(見documentation)(是的,你可以使用相同的矩陣輸入目的地)。

+0

是的,這是正確的答案。 – batuman

0

我認爲你要麼是方法簽名錯誤或錯誤地命名爲bitwise_not方法的參數。

根據[OpenCV的2.4.6文檔上bitwise_not()方法(http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#void bitwise_not(InputArray SRC,DST OutputArray,InputArray面罩))

void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray()) 

如果你打算使用任何面膜,它需要成爲最後一個參數,因爲mask是'bitwise_not'方法的可選項。

此外,爲避免混淆,所有數據類型都必須相同。我試圖暗示的是,源數據和目標數據格式以及任何臨時數據格式(如方法參數)必須採用相同的格式。你不能在CV_64F和其他人不一樣。如果我沒有在這裏丟失我的彈珠,爲簡單起見,按位操作可能會要求您將所有數據以無符號或有符號整數格式。儘管如此,你應該擁有所有類型。

關於你得到的垃圾,我認爲用一些合理的值初始化你的變量是一個普通而好的編程習慣。這有助於您逐步調試並確定失敗的詳細信息。

試試看。

+0

沒有warpmask是我想要應用的矩陣bitwise_not。是的,它有0和1的數據,但在這種情況下,我喜歡將其數據從0反轉爲1,並將1反轉爲0. – batuman

+0

順便說一句,如果我應用cv :: threshold(warpmask,warpmask,0.5,1,THRESH_BINARY_INV) ;在src和dst使用相同的Mat,是否有內存泄漏?任何想法? – batuman

+0

@batuman我真誠地建議您更新帖子並使用正確的參數名稱。您的參數名稱可能會讓其他用戶難以理解。對於'threshold'函數,我沒有看到使用'src'和'dst'的直接危險。但是,您必須小心,不要在同一位置寫入和讀取數據。使用不同的來源和目的地總是更安全。如果你不需要保留你的'src',我想你可以做到。我也認爲你應該在http://answers.opencv.org/上詢問OpenCV作爲SE的平行。 – ha9u63ar