OpenCV Android imwrite给我一个蓝色图像

ada*_*ams 6 java android opencv

我已经实现了一个相机使用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); 
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述

我找不到问题,我已经尝试将垫子转换成其他颜色,但没有结果.

taa*_*aas 1

    \n
  1. 根据翻转函数的文档:http://docs.opencv.org/java/2.4.2/org/opencv/core/Core.html#flip (org.opencv.core.Mat (org.opencv.core.Mat, org.opencv.core.Mat , int)\nmInter 应该与 img_rgb 具有相同的类型,img_rgb 的类型为 CvType.CV_32FC4。\n因此正确的初始化将是

    \n\n
    Mat mInter = new Mat(img_rgb.width(), img_rgb.height(), CvType.CV_32FC4);\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 如果 if(img_rgb.height() > img_rgb.width()) 为 false,则 mInter 包含空图像。所以你应该保存 img_rgb :

    \n\n
    else bool = Imgcodecs.imwrite(filename, img_rgb);\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. Imwrite 文档http://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html

  6. \n
\n\n
\n

仅 8 位(或 16 位无符号 (CV_16U),如果是 PNG、JPEG 2000 和\n TIFF)单通道或 3 通道(具有 \xe2\x80\x98BGR\xe2\x80\x99 通道顺序)可以使用此功能保存图像。如果格式、深度或通道顺序不同,请在保存之前使用 Mat::convertTo() 和 cvtColor() 进行转换。

\n
\n\n

因此,您需要使用 Convert 将其从 rgba 转换为 bgr :

\n\n
cv::cvtColor (input, input_bgr, CV_RGBA2BGR)\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. img_rgb 可以在不同线程中使用,因此应该添加同步。
  2. \n
\n