7
votes

Comment convertir Yuy2 en bitmap en C ++

J'utilise une DLL de la caméra de sécurité pour retrouver l'image de la caméra. La DLL appelle une fonction de mon programme qui passe sur le tampon d'image en tant que paramètre, mais l'image est au format YUY2. J'ai besoin de convertir ce tampon en RVB, mais j'ai essayé toutes les formules que j'ai trouvées sur Internet sans succès. Tout exemple que j'ai essayé (y compris http: // msdn. microsoft.com/en-us/library/aa904813(vs.80).aspx#yuvformats_2 ) me donne des couleurs erronées.

Je suis capable de convertir le tampon en une image BW en utilisant uniquement le composant Y du pixel, mais j'ai vraiment besoin de la couleur de la couleur. J'ai débogué (assemblée uniquement) la DLL qui affiche l'image à l'écran et utilise DirectDraw pour le faire.


2 commentaires

Je devine juste -> N'est-ce pas par exemple un problème de bit-ordre?


À quiconque qui s'est confondu comme je l'ai fait. Yuy2 est un format macropixel sous la forme Y0 | U0 | Y1 | V0. Tous les 4 octets représentent deux pixels RVB. y est connu sous le nom de luma, u est appelé cb et v est appelé cr.


4 Réponses :


0
votes

Vous devrez écrire votre propre convertisseur. GDI + ne sait pas comment traiter avec Yuy2 Bitmaps.

look ici .

Veuillez noter que 2 pixels partagent les mêmes valeurs de couleur et avoir des valeurs de luminance différentes.

ici sont des formules pour vous aider à écrire votre convertisseur.


0 commentaires

1
votes

Si vous utilisiez déjà DirectShow pour obtenir des données vidéo hors de la caméra de sécurité, vous pouvez simplement ajouter le " filtre de convertisseur d'espace de couleur " à votre graphique DirectShow. Mais si vous n'utilisez pas DirectShow déjà (il semble que vous n'êtes pas), il sera beaucoup plus simple de convertir les données en RGB vous-même en utilisant les formules que Daniel est liée. Ajouter DirectShow à un projet est très compliqué.


2 commentaires

Si vous ouvrez votre lien, vous verrez que ce filtre ne fonctionne qu'avec RVB.


Ouais, le filtre de convertisseur d'espace de couleur ne fait que RVB -> Conversion RVB.




3
votes

Cette formule a fonctionné:

rgbbuffer[rgbindex] = (char)b;
rgbbuffer[rgbindex + 1] = (char)g;
rgbbuffer[rgbindex + 2] = (char)r;


1 commentaires

Ma réponse avait la commande correcte pour BGR, voir les commentaires du code. Désolé je n'ai pas fait le point explicitement. C'est toujours le premier Gotcha pour quelqu'un de travail avec Windows Bitmaps, le second étant que les rangées sont à l'envers.