2013-04-09 44 views
2

我想將一些OpenCV Mat轉換爲灰度等高線檢測算法。出於某種原因,轉換後的圖像全是黑色的。我的代碼(b是Android位圖):Android上的OpenCV轉換爲灰度不起作用

Mat tmp = new Mat (b.getWidth(), b.getHeight(), CvType.CV_8UC1); 
Utils.bitmapToMat(b, tmp); 
Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_BGR2GRAY); 
//there could be some processing 
Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_GRAY2BGRA, 4); 
Utils.matToBitmap(tmp, b); 

現在我正在繪製這個位圖,它全黑。當我將輪廓檢測應用到這個位圖(代替評論)時,沒有匹配,所以我認爲問題在於轉換。刪除轉換後(只需調用bitmapToMat和matToBitmap),位圖並非全是黑色,因此轉換爲Mat也可以使用。位圖位於ARGB_8888中,沒有錯誤,只是輸出位圖全部爲黑色。

編輯:只是爲了確保我試圖挽救一個位圖與OCV imwrite - 它仍然是全黑的,所以這個問題是在cvtColor 100%......

回答

6

如果位b爲從Android設備,然後嘗試使用COLOR_RGB2GRAY而不是COLOR_BGR2GRAY,因爲BGR是OpenCV圖像的默認像素格式,而不是所有圖像。

試試這個代碼:

Mat tmp = new Mat (b.getWidth(), b.getHeight(), CvType.CV_8UC1); 
Utils.bitmapToMat(b, tmp); 
Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_RGB2GRAY); 
//there could be some processing 
Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_GRAY2RGB, 4); 
Utils.matToBitmap(tmp, b); 
+0

誒,它仍然是相同的:/輸出位是黑色 – Pax0r 2013-04-10 08:15:59

+0

嘗試使用'ARGB',而不是'RGB'。 – 2013-04-10 13:35:45

+0

好的,我覺得自己很愚蠢,畢竟它與RGB協同工作,但是由於某種原因,當我在白色背景上畫黑色筆畫時,背景也變成了黑色。因此黑色背景上的黑色筆觸使圖像變黑。當我嘗試白色筆畫時,它可以工作... – Pax0r 2013-04-12 18:04:43

0

這個方法我試過和它完美的作品,首先必須將其轉換爲灰度,然後到康力,最後以位圖。

該函數返回黑白圖像。

public static Bitmap edgesim(Mat img1) { 

Bitmap image1; 

//mat gray img1 holder 
Mat imageGray1 = new Mat(); 

//mat canny image 
Mat imageCny1 = new Mat(); 

//mat canny image 
Mat imageCny2 = new Mat(); 

///////////////////////////////////////////////////////////////// 

//Convert img1 into gray image 
Imgproc.cvtColor(img1, imageGray1, Imgproc.COLOR_BGR2GRAY); 

//Canny Edge Detection 
Imgproc.Canny(imageGray1, imageCny1, 10, 100, 3, true); 

/////////////////////////////////////////////////////////////////// 

//////////////////Transform Canny to Bitmap///////////////////////////////////////// 
image1= Bitmap.createBitmap(imageCny1.cols(), imageCny1.rows(), Bitmap.Config.ARGB_8888); 
Utils.matToBitmap(imageCny1, image1); 

return image1; 

}