web-dev-qa-db-fra.com

Traitement Android cadres de caméra en temps réel

J'essaie de créer une Android qui traitera les images de la caméra en temps réel. Pour commencer, je veux simplement afficher une version en niveaux de gris de ce que la caméra voit. J'ai réussi pour extraire les valeurs appropriées du tableau d'octets dans la méthode onPreviewFrame. Ci-dessous est juste un extrait de mon code:

byte[] pic;
int pic_size;
Bitmap picframe;
public void onPreviewFrame(byte[] frame, Camera c)
{
    pic_size = mCamera.getParameters().getPreviewSize().height * mCamera.getParameters().getPreviewSize().width;
    pic = new byte[pic_size];
    for(int i = 0; i < pic_size; i++)
    {
        pic[i] = frame[i];
    }
    picframe = BitmapFactory.decodeByteArray(pic, 0, pic_size);
}

La première [width*height] valeurs de byte[] frame array sont les valeurs de luminance (niveaux de gris). Une fois que je les ai extraits, comment les afficher à l'écran sous forme d'image? Ce n'est pas un tableau 2D également, alors comment spécifier la largeur et la hauteur?

26
NavMan

Vous pouvez obtenir des instructions détaillées à partir du OpenCV4Android SDK . Consultez leurs exemples disponibles, en particulier Tutorial 1 Basic. 0 Android Camera

Mais, comme c'était le cas dans mon cas, pour un traitement d'image intensif, cela deviendra plus lent que ce qui est acceptable pour une application de traitement d'image en temps réel. Un bon remplacement pour la conversion du tableau d'octets de leur onPreviewFrame en YUVImage:

YuvImage yuvImage = new YuvImage(frame, ImageFormat.NV21, width, height, null);

Créez un rectangle de la même taille que l'image.

Créez un ByteArrayOutputStream et passez ceci, le rectangle et la valeur de compression à compressToJpeg ():

ByteArrayOutputStream baos = new ByteArrayOutputStream();yuvimage.compressToJpeg(imageSizeRectangle, 100, baos);

byte [] imageData = baos.toByteArray();

Bitmap previewBitmap = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);

Le rendu de ces previewFrames sur une surface et les meilleures pratiques impliquées est une nouvelle dimension. =)

10
Heartache

Ce très vieux message a attiré mon attention maintenant.

L'API disponible en 2011 était beaucoup plus limitée. Aujourd'hui, on peut utiliser SurfaceTexture (voir exemple ) pour prévisualiser le flux de la caméra après (certaines) manipulations.

1
Alex Cohn