2016-10-10 24 views
0

私が開発中のアプリケーションでは、CameraBridgeViewBase.CvCameraViewListener2を使用してOpenCV4Androidを使用してカメラを開きます。画面に触れると、コード内に次のようにImageViewの画像としてそのフレームを設定しました。 imageviewに設定されている画像は、画像のように常にカメラのプレビューとは異なる色です。この問題は、以下のコードに記載されている変換と関係があると考えています。Matオブジェクトをビットマップに変換するにはどうすればいいですか?

私の質問はMatオブジェクトをBitmapに変換する方法です。

PIC

enter image description here コード

@Override 
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { 
    Log.w(TAG, "onCameraFrame"); 
    if (mRGBT != null) { 
     mRGBT.release(); 
    } 

    mRGBT = inputFrame.rgba().t(); 
    Core.flip(mRGBT, mRGBT, 1); 
    Imgproc.resize(mRGBT, mRGBT, inputFrame.rgba().size()); 

    if (touched) { 
     touched = false; 
     Imgproc.cvtColor(mRGBT, mRGBT, CvType.CV_8U); 
     final Bitmap bitmap = Bitmap.createBitmap(mRGBT.cols(), mRGBT.rows(), Bitmap.Config.RGB_565); 
     Utils.matToBitmap(mRGBT, bitmap); 

     getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       mIV.setImageBitmap(bitmap); 
      } 
     }); 
    } 

    return mRGBT; 
} 
+0

OpenCVはBGR画像で動作します。フレームをRGBに変換します。 –

+0

Danが色順が正しくないと述べているので、赤と青のチャンネルの順番が異なります。 – EdChum

+0

@DanMašekはこの行を意味しますか?Bitmap.createBitmap(mRGBT.cols()、mRGBT.rows()、Bitmap.Config.RGB_565 ); ..それがあなたが意味するものなら、BGRのオプションはありません!! – user2121

答えて

0

私はこれを使用していますし、それが正常に動作します:

Mat mat = inputFrame.rgba(); 
Bitmap bm = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888); 
Utils.matToBitmap(mat, bm); 
+0

実際に私はBitmap.Config.ARGB_8888を使用して同じ問題を抱えています – user2121

+0

@ user2121前のコードをステップバイステップで削除し、問題点を見つけようとします –

1

あなたは間違って画像を変換しています。

ビットマップをカラーイメージにする場合は、cvtColorは不要です。 inputFrame.rgba()は、RGBA Matを返します。これはUtils.matToBitmapJavaDocを参照)に必要な入力です。

if (touched) { 
    touched = false; 
    final Bitmap bitmap = 
      Bitmap.createBitmap(mRGBT.cols(), mRGBT.rows(), Bitmap.Config.RGB_565); 
    Utils.matToBitmap(mRGBT, bitmap); 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      mIV.setImageBitmap(bitmap); 
     } 
    }); 
} 

あなたはビットマップはグレーの画像利用Imgproc.COLOR_BGRA2GRAYになりたい場合は:あなたはマットがに変換されるので、Utils.matToBitmapで三番目のパラメータとしてtrueを追加Bitmap.Config.ARGB_8888ビットマップで作業する必要がある場合は

if (touched) { 
    touched = false; 
    Imgproc.cvtColor(mRGBT, mRGBT, Imgproc.COLOR_BGRA2GRAY); 
    final Bitmap bitmap = 
      Bitmap.createBitmap(mRGBT.cols(), mRGBT.rows(), Bitmap.Config.RGB_565); 
    Utils.matToBitmap(mRGBT, bitmap); 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      mIV.setImageBitmap(bitmap); 
     } 
    }); 
} 

アルファプレマルチプライドフォーマット(JavaDocを参照)。

final Bitmap bitmap = 
     Bitmap.createBitmap(mRGBT.cols(), mRGBT.rows(), Bitmap.Config.ARGB_8888); 
Utils.matToBitmap(mRGBT, bitmap, true); 
関連する問題