2013-06-13 64 views
2

所以我想侵蝕二進制矩陣。 我創建使用此代碼矩陣:cv ::腐蝕錯誤與二進制cv ::墊

​​

下面是我使用的源圖片:

http://snag.gy/ZZzhw.jpg

這是什麼我與我的循環(它的TMP矩陣):

http://snag.gy/lhuR7.jpg

我想使用此代碼蠶食圖片,以便之後:

int erosion_elem = 1; 
int erosion_size = 8; 


int erosion_type; 
if(erosion_elem == 0){ erosion_type = MORPH_RECT; } 
else if(erosion_elem == 1){ erosion_type = MORPH_CROSS; } 
else if(erosion_elem == 2) { erosion_type = MORPH_ELLIPSE; } 

Mat element = getStructuringElement(erosion_type, 
            Size(2*erosion_size + 1, 2*erosion_size+1), 
            Point(erosion_size, erosion_size)); 

/// Apply the erosion operation 
erode(binary, erosion_dst, element);` 

所以它編譯好,但我得到的這條線的異常:

erode(binary, erosion_dst, element);` 

它說,它是一個不支持的數據類型。 有沒有人有一個想法,爲什麼我會得到這個異常?

我試圖改變矩陣tmp的數據類型,但我有同樣的錯誤。

感謝您的幫助! ( - 在8位> - CV_8U> 1個字節)

+3

你的二進制圖像與CV_8U(無符號字符)存儲在一起,你可以試試 'tmp.at <無符號字符>(i,j)= 255;'填充你的tmp Mat? – Marcassin

+0

@Marcassin是的,它的作品謝謝你! 昨天我改變了我的矩陣的數據類型,我忘了在我的填充中改變它。 我覺得很蠢! 再次感謝您! – Sherokan

+1

@Sherokan接受下面的答案來結束這個問題。 – William

回答

2

你的二進制圖像像素保存爲unsigned char, 你應該存儲,像素的值作爲unsigned char

cv::Mat tmp = cv::Mat::zeros(IMG->width, IMG->height, CV_8U); 

for(auto i = 0 ; i < IMG->width ; i++) 
{ 
    for (auto j = 0 ; j < IMG->height ; j++) 
    { 
     if( cv::pointPolygonTest(cv::Mat(contour),cv::Point(i,j),true) < 0) 
     { 
      tmp.at<unsigned char>(i,j) = 255; 
     } 
    } 

} 

(從評論做出了回答)