3 votes

Aperçu des tailles de sortie de Android Camera2

J'essaie de configurer la prévisualisation de la caméra via ImageReader (format YUV_420_888) en utilisant l'API Camera2. Tout d'abord, je dois choisir la taille d'aperçu prise en charge :

StreamConfigurationMap scmap = camCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size previewSizes[] = scmap.getOutputSizes(ImageReader.class);

Mon Nexus 5X supporte les tailles suivantes :

[4032x3024,4000x3000,3840x2160,3288x2480,3200x2400,2592x1944,2688x1512,2048x1536,1920x1080,1600x1200,1440x1080,1280x960,1280x768,1280x720,1024x768,800x600,864x480,800x480,720x480,640x480,640x360,352x288,320x240,176x144,160x120]

Préparez une instance d'ImageReader et démarrez CaptureSession avec une demande de capture répétitive :

mImageReader = ImageReader.newInstance(W,H, ImageFormat.YUV_420_888,1);

J'essaie ensuite de lire chaque image de prévisualisation (pour traitement ultérieur et affichage via GLES) dans le OnImageAvailableListener. Et ce que je veux savoir, c'est combien d'octets du canal Y j'ai reçu :

public void onImageAvailable(ImageReader reader) {
        ByteBuffer yBuffer = mImageReader.acquireNextImage().getPlanes()[0].getBuffer();
        Log.d("Camera2Debug","Y-channel bytes received: " + yBuffer.remaining());
        ...
    }

Le canal Y d'une image YUV_420_888 doit contenir LxH octets, où W - est la largeur, et H - est la hauteur de l'image considérée.

Problème : Pour certaines tailles d'aperçu supportées, la taille réelle de yBuffer ne correspond pas à la valeur attendue. ( LxH ).

Par exemple :

Preview Size  | Y-bytes received | Y-bytes expected  |   match
4032x3024     | 12 192 768       | 12 192 768        |    yes
1920x1080     |  2 073 600       |  2 073 600        |    yes
1440x1080     |  1 589 728       |  1 555 200        |    no
1280x960      |  1 228 800       |  1 228 800        |    yes
1280x768      |    983 040       |    983 040        |    yes
800x600       |    499 168       |    480 000        |    no
...
499168

En raison de ce problème, je ne peux pas utiliser la taille de prévisualisation nécessaire, même si elle est prise en charge par le périphérique.

Qu'est-ce que je fais de mal ?

3voto

Eddy Talvala Points 1655

Vous ne prenez probablement pas en compte [https://developer.Android.com/reference/Android/media/Image.Plane.html#getRowStride()](https://developer.android.com/reference/android/media/Image.Plane.html#getRowStride()) qui peut être plus grande que la largeur (mais qui est au moins égale à celle-ci). La taille réelle du tampon sera

size = rowStride * height - (rowStride - width)

avec la soustraction de (rowStride - width) parce que la dernière ligne ne comprend pas de remplissage au-delà du dernier pixel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X