【问题标题】:Using method convertTo in opencv java wrapper在opencv java包装器中使用方法convertTo
【发布时间】:2013-04-07 23:02:31
【问题描述】:

请任何人帮助我了解如何在 JavaCV 中使用方法 convertTo。我尝试并搜索了很多时间,但没有找到正确的答案。 所以我的问题是,当我尝试将垫子类型从灰色图像转换为 CV_32F 并尝试在 android 屏幕上显示它时,它不会给我任何结果。这是我的来源:

    Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGBA2GRAY, 1); // dst is gray image
    dst.convertTo(dst_f, CvType.CV_32F, 1./255, 0); //convert dst to CV_32F with optional scale
    Imgproc.cvtColor(dst_f, src, Imgproc.COLOR_GRAY2RGBA, 4); // to display it in android before convert to bitmap

我也在 opencv C++ 中尝试使用此代码,它运行顺利:

    imshow("dst", image);
    cvtColor(image, dst, CV_BGR2GRAY);
    dst.convertTo(dst_f, CV_32F, 1.0/255, 0);
    imshow("dst_f", dst_f);

更新:

当我尝试在 Android 屏幕上在线显示图像时,我认为我错了。我不知道如何显示它,尽管我知道 android 需要 4 通道才能在屏幕上显示图像。但是当我将灰色转换为 CV_32F 图像类型并尝试使用与上面相同的代码进行显示时,它运行平稳,没有没有结果。

【问题讨论】:

    标签: java android opencv wrapper javacv


    【解决方案1】:

    经过一些研究和实验,我得到了我的黄金答案,这里是:

    Android 只能在屏幕上显示 4 通道图像,因此您需要将其转换为 4 通道 (RGBA),但在转换为 RGBA/BGRA 之前,您必须将 Mat 图像更改为具有相同比例的 CV_8U。看看这个例子:

    Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGBA2GRAY, 1); 
    dst.convertTo(dst_f, CvType.CV_32F, 1./255, 0);    
    dst_f.convertTo(final, CvType.CV_8U, 255, 0); 
    Imgproc.cvtColor(final, src, Imgproc.COLOR_GRAY2RGBA, 4);
    

    使用上面的代码,您的代码将在 Android 屏幕上完美运行,但如果您尝试将其保存为 jpg 图像或其他图片扩展名,它会给您一张损坏的图片。如果你想把它保存到 sdcard 你可以使用这个来源:

    Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2GRAY, 1);
    dst.convertTo(dst_f, CvType.CV_32F, 1.0/255, 0); // Convert Mat image to CV_32F and scale it to 1.0/255
    dst_f.convertTo(final, CvType.CV_32F, 255, 0); //Convert it Back to Default type before
    Imgproc.cvtColor(final, roi, Imgproc.COLOR_GRAY2RGB, 0);
    Imgproc.cvtColor(roi, roi, Imgproc.COLOR_RGB2RGBA, 0);
    

    以上是我自己的实验,如果你想问我什么,我会尽量回答。谢谢。希望这对其他人有很大帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 2014-06-06
      • 1970-01-01
      • 2015-09-12
      • 2016-12-31
      相关资源
      最近更新 更多