OpenCV Android 的 imwrite 函数生成了一张蓝色的图片

7

我使用了 CvCameraViewListener2 实现了一个相机,但是当我使用 imwrite 保存照片时,图片变成了蓝色。以下是我的代码:

public Mat onCameraFrame(final CvCameraViewFrame inputFrame) {
    img_rgb = inputFrame.rgba();

    return img_rgb;

}

public void captureImage(View v){
    Mat mInter= new Mat(img_rgb.width(),img_rgb.height(),CvType.CV_32FC3);
    File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    String filename = "temp.jpg";
    File file = new File(path, filename);
    Boolean bool = null;
    filename = file.toString();
    if(img_rgb.height() > img_rgb.width()){
        Core.flip(img_rgb,mInter,1);
        bool = Imgcodecs.imwrite(filename, mInter);
    }
    else{
    bool = Imgcodecs.imwrite(filename,mInter);}
    if (bool == true)
        Log.i(TAG, "SUCCESS writing image to external storage");
    else
        Log.i(TAG, "Fail writing image to external storage");
    String PathName = "";
    Intent i = new Intent(getApplication(),Result.class);
    i.putExtra(EXTRA_MESSAGE ,filename);
    startActivity(i); 

结果如下:

在此输入图片描述

我找不到问题所在,我尝试将 mat 转换为其他颜色,但没有结果。


1
mInter 应该是 CvType.CV_8UC4 类型。 - Miki
如果您的输入图像是RGB格式,您可能需要先将其转换为BGR。尝试使用cv :: cvtColor(input,input_bgr,CV_RGB2BGR)函数。 - Micka
我已经做了这两个,现在出现了一个新的错误,图片 - adams
我曾经遇到过同样的问题,使用cvtColor(input, input_bgr, COLOR_BGR2RGB)解决了它。 - cyber_raj
1个回答

1
  1. According to documentation for flip function : http://docs.opencv.org/java/2.4.2/org/opencv/core/Core.html#flip(org.opencv.core.Mat, org.opencv.core.Mat, int) mInter should have same type as img_rgb, which has type CvType.CV_32FC4. So correct initialization will be

    Mat mInter = new Mat(img_rgb.width(), img_rgb.height(), CvType.CV_32FC4);
    
  2. In case if(img_rgb.height() > img_rgb.width()) is false, mInter contains empty image. So you should save img_rgb :

    else bool = Imgcodecs.imwrite(filename, img_rgb);
    
  3. Imwrite docs http://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html:

只有8位(或16位无符号(对于PNG、JPEG 2000和TIFF))单通道或3通道(采用“BGR”通道顺序)图像可以使用此函数保存。如果格式、深度或通道顺序不同,请在保存之前使用Mat::convertTo()和cvtColor()进行转换。
因此,您需要使用convert将其从rgba转换为bgr:
cv::cvtColor (input, input_bgr, CV_RGBA2BGR)
  1. img_rgb可以从不同的线程中使用,因此需要添加同步。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接