2013-05-04 1 views
1

J'ai un petit problème avec la taille de mes tampons dans un programme C++. Je prends des images YUYV à partir d'une caméra en utilisant V4L2 (un exemple est disponible here)Un malentendu de V4L2

Je veux prendre une image et la placer dans une structure d'image propre. Voici la mémoire tampon donnée par la structure V4L2 et sa taille

(uchar*)buffers_[buf.index].start, buf.bytesused 

Dans ma structure, je crée un nouveau tampon (MonBuffer) avec une taille de largeur * hauteur * bitSize (taille en octets est 4 depuis que je prends YUYV ou des images YUV422).

Le problème est que j'attendais le tampon buf être la même taille que celui que j'ai créé. Mais ce n'est pas le cas, par exemple quand je prends un 640 * 480 image buf = 614400 et mybuffer = 1228800 (deux fois plus gros).

Est-ce que quelqu'un a une idée de pourquoi c'est le cas?

+0

Comment obtenez-vous 32 bits/pixel de YUV422? –

+1

Le format YUYV est de 16 bits par pixel car vous avez deux Y, un U et un V pour chaque TWO (U et V sont sous-échantillonnés). – 6502

Répondre

1

YUV422 utilise 4 octets par 2 pixels

Dans le mode YUV422 les U ans V valeurs sont partagées entre deux pixels. Les octets de l'image sont commandés comme U0 Y0 V0 Y1 U2 Y2 V2 Y3 etc.

Giving pixels comme:

pixel 0 U0Y0V0 
pixel 1 U0Y1V0 
pixel 2 U2Y2V2 
pixel 3 U2Y3V2 
+0

Ok, je comprends cela, mais comme le type de mon buffer est unsigned char, comment représenterais-tu ce fait? En divisant la taille de mybuffer par deux quand j'allouer la mémoire? – Athanase

+0

Votre tampon doit être 640 * 480 * 2 = 614400 octets, non? Cela ne change pas car il est non signé char. sizeof (char) est nécessaire pour être 1 –

+0

Ok ma question était exactement cela: parce que YUV422 -> 4 octets par 2 pixels est-ce autorisé à écrire dans mon code que le nombre de canaux pour ce format est 2 (et pas 4)? – Athanase