【问题标题】:Imgproc.drawContours(....) not showing upImgproc.drawContours(....) 没有出现
【发布时间】:2014-11-04 19:55:12
【问题描述】:

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

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

【问题讨论】:

  • 我还没有使用 android opencv,但我想我在某处读过他们使用 8UC4 图像?!?所以new Scalar(200,200,0) 也需要一个 alpha 值。否则它使用默认的 alpha 值,我猜这将是透明的。所以把Utils.bitmapToMat(bitm, mat);放在你的代码之前,然后把Scalar(200,200,0,255)或者Scalar(200,200,0,0)改成不透明的alpha值。
  • @Micka 谢谢!这就是它没有出现的原因。如果您留下您的评论作为答案,我一定会接受它:)

标签: java android opencv


【解决方案1】:

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),它将使用第四个通道,但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,但我不知道该怎么做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 2015-01-19
    • 2012-09-21
    • 2021-02-15
    • 2014-05-31
    • 2013-12-02
    • 2021-03-05
    • 2017-06-21
    相关资源
    最近更新 更多