在我的Android应用程序中,我从图库中获取一个图像作为一个类似这样的位图
Bitmap bitm = getMyImage("Thanks!");
我有一个名为mat的mat,声明如下:
Mat mat = new Mat(bitm.getHeight(), bitm.getWidth(), CVType.CV_8UC3);
我试图从图像中获取轮廓区域,这是我成功获得的,然后将其绘制在原始图像上:
Imgproc.drawContours(mat, contours, -1, new Scalar(200,200,0), 2);
displayMat(mat);
如果我这样使用它,它可以工作,但轮廓是在空白图像上绘制的,这不是我想要的。我希望它能在原始图像上绘制。如果我使用
Utils.bitmapToMat(bitm, mat);
在上一段代码之前,显示的图片只是没有'绘制'轮廓。为什么呢?
答案 0 :(得分:2)
Asfaik Android使用带有Alpha值的图片,因此CV_8UC4
是正确的数据类型。
所以
Mat mat = new Mat(bitm.getHeight(), bitm.getWidth(), CVType.CV_8UC3);
Imgproc.drawContours(mat, contours, -1, new Scalar(200,200,0), 2);
displayMat(垫);
在空/空8UC3
图像上正确绘制轮廓(如果内存为空)。
但是,如果您想通过首先转换Utils.bitmapToMat(bitm, mat);
来绘制输入图像,那么您将覆盖8UC3
内存并将其替换为8UC4
数据。之后,您绘制Scalar(200,200,0)
将使用第4个频道,但cv::Scalar
会自动将这些频道添加到default zero values
,因此您可以透明地绘制轮廓。因此,请改用Scalar(200,200,0,255)
,它应该会给出您期望的结果。
Mat mat = new Mat(bitm.getHeight(), bitm.getWidth(), CVType.CV_8UC3);
Utils.bitmapToMat(bitm, mat);
Imgproc.drawContours(mat, contours, -1, new Scalar(200,200,0,255), 2);
displayMat(垫);
另一种方法是将位图转换为8UC3,但我不知道该怎么做。