2

任何人请帮助我了解如何在 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 图像类型并尝试使用与上面相同的代码进行显示时,它运行平稳而没有任何结果。

4

1 回答 1

4

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

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

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

于 2013-04-28T15:17:59.890 回答