2016-10-10 3 views
0

Dans l'application que je développe, j'ouvre la caméra en utilisant OpenCV4Android en utilisant CameraBridgeViewBase.CvCameraViewListener2 et quand je touche l'écran, j'ai placé cette image comme une image à l'intérieur d'un ImageView comme indiqué ci-dessous dans le code. le problème est l'image définie à la imageview est toujours de couleur différente de l'aperçu sur l'appareil photo comme indiqué dans l'image. Je crois que ce problème a quelque chose à voir avec la conversion que j'ai faite qui est indiqué dans le code ci-dessousComment convertir l'objet Mat en bitmap tout en conservant la couleur?

Ma question est de savoir comment convertir l'objet Mat en un Bitmap en préservant la même couleur?

pic

enter image description here Code:

@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 fonctionne avec les images BGR. Vous convertissez le cadre en RVB. –

+0

Comme Dan a déclaré que l'ordre des couleurs est incorrect, les canaux rouge et bleu sont dans un ordre différent. – EdChum

+0

@ DanMašek voulez-vous dire cette ligne: Bitmap.createBitmap (mRGBT.cols(), mRGBT.rows(), Bitmap.Config.RGB_565); .. si c'est ce que vous voulez dire, il n'y a pas d'option pour BGR !! – user2121

Répondre

0

J'utilise cela et il fonctionne très bien:

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

effectivement j'ai le même problème quand j'utilise Bitmap.Config.ARGB_8888 – user2121

+0

@ user2121 Essayez de supprimer le code précédent étape par étape et de découvrir quel est le problème –

1

vous convertissez l'image de manière incorrecte. Si vous souhaitez que l'image bitmap soit une image couleur, vous n'avez pas besoin de cvtColor. inputFrame.rgba() renvoie un mat RVBA et l'entrée dont vous avez besoin pour Utils.matToBitmap (voir 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); 
     } 
    }); 
} 

Si vous voulez que le bitmap soit une utilisation d'image grise 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); 
     } 
    }); 
} 

Si vous avez besoin de travailler avec des bitmaps Bitmap.Config.ARGB_8888 ajouter true comme troisième paramètre Utils.matToBitmap, de sorte que le tapis est converti en format alpha prémultiplié (Voir JavaDoc).

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