Imgproc.drawContours(....)没有显示出来

时间:2014-09-11 01:46:42

标签: java android opencv

在我的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);

在上一段代码之前,显示的图片只是没有'绘制'轮廓。为什么呢?

1 个答案:

答案 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,但我不知道该怎么做。