Java Imgproc.绘制轮廓(..)未显示
在我的安卓应用程序中,我从图库中得到一个位图图像,类似这样Java Imgproc.绘制轮廓(..)未显示,java,android,opencv,Java,Android,Opencv,在我的安卓应用程序中,我从图库中得到一个位图图像,类似这样 Bitmap bitm = getMyImage("Thanks!"); 我有一个叫做Mat的Mat,声明如下: Mat mat = new Mat(bitm.getHeight(), bitm.getWidth(), CVType.CV_8UC3); 我正在尝试从图像中获取轮廓区域,我已经成功获取了轮廓区域,然后使用以下方法将其绘制回原始图像: Imgproc.drawContours(mat, contours, -1, new
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);
在前面的代码片段之前,显示的图像只是预浏览的图像,没有“绘制”的轮廓。为什么?Asfaik Android使用带有alpha值的图像,因此
CV_8UC4
是正确的数据类型
所以
显示垫(mat)
在空/空白8UC3
图像上正确绘制轮廓(如果内存为空)
但是如果您想通过首先转换Utils.bitmapToMat(bitm,mat)来绘制输入图像
您将覆盖8UC3
内存,并将其替换为8UC4
数据。之后,您将绘制Scalar(200200,0)
,它将使用第四个通道,但是cv::Scalar
会自动添加那些带有默认零值的通道,因此您将以透明的方式绘制轮廓。因此,使用Scalar(200200,0255)
代替,它应该会给出您期望的结果
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);
显示垫(mat)
另一种方法是将位图转换为8UC3,但我不知道该怎么做。我还没有使用android opencv,但我想我已经在某个地方读到他们使用8UC4图像?!?所以新标量(200200,0)
也需要一个alpha值。否则它会使用默认的alpha值,我想它是透明的。所以把Utils.bitmapToMat(bitm,mat)代码>在您的代码之前,并更改为标量(200200,0255)
或标量(200200,0,0)
,以非透明alpha值为准。@Mika谢谢!这就是它没有出现的原因。如果你留下你的评论作为回答,我一定会接受:)
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);