gpt4 book ai didi

java - Imgproc.drawContours(....) 未显示

转载 作者:行者123 更新时间:2023-12-02 05:28:28 27 4
gpt4 key购买 nike

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

在前面的代码 fragment 之前,显示的图像只是经过预处理的图像,没有“绘制”轮廓。为什么?

最佳答案

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

显示Mat(垫);

在空/空白 8UC3 图像上正确绘制轮廓(如果内存为空)。

但是,如果您想通过首先转换 Utils.bitmapToMat(bitm, mat); 在输入图像上绘图,您将覆盖 8UC3 内存并将其替换为8UC4 数据。之后,您绘制将使用第四个 channel 的 Scalar(200,200,0),但 cv::Scalar 会自动添加具有默认零值的这些 channel >,这样你就可以用透明的方式绘制轮廓。因此,请使用 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);

显示Mat(垫);

另一种方法是将位图转换为 8UC3,但我不知道该怎么做。

关于java - Imgproc.drawContours(....) 未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25777746/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com