5

我正在尝试将一些 OpenCV Mat 转换为灰度用于轮廓检测算法。由于某种原因,转换后的图像全黑。我的代码(b是Android位图):

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 保存位图 - 它仍然是全黑的,所以问题是 100% 在 cvtColor ...

4

2 回答 2

7

如果位图 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);
于 2013-04-10T02:16:52.600 回答
0

这个方法我试过了,效果很好,先转成灰度,再转Canny,最后转Bitmap。

这个函数返回一个黑白图像。

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;

}

于 2016-12-23T23:51:56.363 回答