2016-10-10 67 views
0

在我正在開發的應用程序中,我使用OpenCV4Android使用CameraBridgeViewBase.CvCameraViewListener2打開相機,當我觸摸屏幕時,我將該幀設置爲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

您在圖片轉換不正確。

如果要位圖爲彩色圖像,則不需要cvtColorinputFrame.rgba()返回RGBA墊,這是您需要的輸入Utils.matToBitmap(請參閱JavaDoc)。

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

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

如果需要使用位圖Bitmap.Config.ARGB_8888工作添加trueUtils.matToBitmap第三個參數,所以墊被轉換成alpha預乘格式(請參見JavaDoc)。

final Bitmap bitmap = 
     Bitmap.createBitmap(mRGBT.cols(), mRGBT.rows(), Bitmap.Config.ARGB_8888); 
Utils.matToBitmap(mRGBT, bitmap, true); 
相關問題