2013-04-09 83 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; 

}