2012-07-04 17 views
4

J'essaie d'utiliser OpenCV dans Android. J'ai donc testé OpenCV pour la première fois en plaçant deux SurfaceView côte à côte. Un SurfaceView est utilisé pour prévisualiser la sortie (le format de sortie est clairement NV21) de la caméra. L'autre SurfaceView montre le même aperçu après le passage par OpenCV comme indiqué dans le code ci-dessous:Conversion de NV21 en RVB en utilisant OpenCV dans Android

public void onPreviewFrame(byte[] data, Camera camera) { 
    // TODO Auto-generated method stub 

    if(mYuv != null) mYuv.release(); 
    mYuv = new Mat(height + height/2, width, CvType.CV_8UC1); 
    mYuv.put(0, 0, data); 
    Mat mRgba = new Mat(); 

    Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV2RGB_NV21, 4); 

    Bitmap map = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

    Utils.matToBitmap(mRgba, map); 

    preview.setBackgroundDrawable(new BitmapDrawable(map)); 
    mRgba.release(); 

} 

Mais l'image résultante après le passage par OpenCV est un vert, staticy ... chose:

green, staticy thing

Des idées?

Edit:

Code modifié un peu comme par commentaire.

public void onPreviewFrame(byte[] data, Camera camera) { 
    // TODO Auto-generated method stub 

    if(mYuv != null) mYuv.release(); 
    mYuv = new Mat(height + height/2, width, CvType.CV_8UC1); 
    mYuv.put(0, 0, data); 
    Mat mRgba = new Mat(); 

    Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4); 

    Bitmap map = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

    Utils.matToBitmap(mRgba, map); 

    preview.setBackgroundDrawable(new BitmapDrawable(where.getResources(), map)); 
    mRgba.release(); 

} 

qui se traduit par ceci: Ugly green thing again.

+0

Essayez de convertir RGB en RGBA avant de l'afficher. IL semble que vous manquez ce bype supplémentaire par pixel. – Sam

+0

@vasile Merci pour le conseil, mais il semble ne pas fonctionner. Voir édité. Il semble avoir ajouté une barre de plus. – vsector

Répondre

7

D'accord, je me suis où je suis allé détraqué.

J'ai d'abord fait quelque chose comme ceci:

public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 

    this.width = width; this.height = height; 
    params.setPreviewSize(width, height); 
    camera.setParameters(params); 
    camera.startPreview(); 

} 

Le problème est, les caméras sur Android prend en charge que les résolutions de prévisualisation spécifiques. Par conséquent, la résolution spécifique que je définissais ne fonctionnait pas. Donc, je l'ai changé à ceci:

public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 

    Size size = params.getPreviewSize(); 
    this.height = size.height; 
    this.width = size.width; 
    camera.setParameters(params); 
    camera.startPreview(); 

} 

Et puis tout fonctionne A-OK! Honnêtement, ce n'était pas là où je m'attendais à ce que l'erreur soit, alors ce n'était pas une question bien formulée.

+0

Merci! Je me suis cassé la tête pendant des heures! –

+0

Pouvez-vous poster plus de détails sur le code? Je me demande quelle vue vous avez utilisée et comment vous avez accès à la caméra membre/champ? – Matthias

Questions connexes