Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Imgproc.绘制轮廓(..)未显示_Java_Android_Opencv - Fatal编程技术网

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);