[Format image YuYV] Image Verte lors du rendu
Bonjour,
Mon problème est que la librairie utilisé me renvoie un format d'image YUYV sur ma webcam. Des fonctions sont mises à disposition dans le code de celle-ci. Le rendu de l'image après conversion en RGB puis passage sous JAVA:
http://img651.imageshack.us/img651/9994/capturehu.png
Voici les faits:
- j'ai une librairie "lti-civil" qui accède en C++ à la webcam et me transmet bien une image par appel et non un flux.
- voici un lien expliquant le format sur lequel je travail : http://v4l2spec.bytesex.org/spec/r4339.htm
- Voici le code permettant d'avoir un image malheureusement en vert :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
//Ceci est une fonction qui permet de remettre une valeur correspondante dans tous les cas au RGB.
//
// YUV to RGB conversion:
//
unsigned char clip(int value)
{ if (value <= 0)
return 0;
else if (value >= 255)
return 255;
else
return (unsigned char) (value);
}
//Première méthode d'encodage je pense que le problème se situe ici
//
void yuv2rgb_buf(unsigned char *src, int width, int height, unsigned char *dst)
{
int u_offset = width * height;
int v_offset = u_offset + width * height / 4; // TODO: handle rows not divisible by 2.
int uv_width = width / 2;
int i;
for ( i = 0; i < ( width * height ); i++ )
{
int px = i % width;
int py = i / width;
int uv_x = px / 2; // x in u/v planes
int uv_y = py / 2; // y in u/v planes
unsigned char y, u, v;
unsigned char r, g, b;
y = src[i];
u = src[u_offset + uv_width * uv_y + uv_x];
v = src[v_offset + uv_width * uv_y + uv_x];
yuv2rgb(y, u, v, &r, &g, &b);
*dst++ = b;
*dst++ = g;
*dst++ = r;
}
}
// Le coeur de l'encodage
//
/**
* Converts a yuv into RGV, using only integer (no double).
*/
inline void yuv2rgb(unsigned char y, unsigned char u, unsigned char v, unsigned char *pr, unsigned char *pg, unsigned char *pb)
{
int C = 298 * (y - 16);
int D = u - 128;
int E = v - 128;
int r = ( C + 409 * E + 128) >> 8;
if (r < 0)
r = 0;
else if (r > 255)
r = 255;
int g = ( C - 100 * D - 208 * E + 128) >> 8;
if (g < 0)
g = 0;
else if (g > 255)
g = 255;
int b = ( C + 516 * D + 128) >> 8;
if (b < 0)
b = 0;
else if (b > 255)
b = 255;
*pr = r;
*pg = g;
*pb = b;
} |
On peut voir que la dernière fonction correspond à une des très nombreuses formules présentent sur ce site: http://www.fourcc.org/fccyvrgb.php
Après avoir modifié la deuxième fonction afin de correspondre aux autres formules j'obtiens soit un résultat rose, noir et blanc ou avec plus de moi à l'écran (cf image jointe on me voit 2 fois dessus)
Merci beaucoup de votre réponse et de votre aide.
HqSeO