有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java OpenCV Android imwrite给我一个蓝色图像

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

结果是:

enter image description here

我找不到问题,我试着把垫子换成其他颜色,但没有结果


共 (1) 个答案

  1. # 1 楼答案

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

      Mat mInter = new Mat(img_rgb.width(), img_rgb.height(), CvType.CV_32FC4);
      
    2. 如果(仪表板高度)(>;img_rgb。width())为false,mInter包含空图像。因此,您应该保存img_rgb:

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

    Only 8-bit (or 16-bit unsigned (CV_16U) in case of PNG, JPEG 2000, and TIFF) single-channel or 3-channel (with ‘BGR’ channel order) images can be saved using this function. If the format, depth or channel order is different, use Mat::convertTo() , and cvtColor() to convert it before saving.

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

    cv::cvtColor (input, input_bgr, CV_RGBA2BGR)
    
    1. img_rgb可以从不同的线程使用,因此应该添加同步