Je suis en converting
une image au format YUV420
en image RGB
opencv
mais je reçois une image de couleur Orange
après la conversion.
J’ai utilisé le code suivant pour le faire. Y at-il un problème dans mon code ??
int step = origImage->widthStep; uchar *data = (uchar *)origImage->imageData; int size = origImage->width * origImage->height; IplImage* img1 = cvCreateImage(cvGetSize(origImage), IPL_DEPTH_8U, 3); for (int i = 0; iheight; i++) { for (int j=0; jwidth; j++) { float Y = data[i*step + j]; float U = data[ (int)(size + (i/2)*(step/2) + j/2) ]; float V = data[ (int)(size*1.25 + (i/2)*(step/2) + j/2)]; float R = Y + (int)(1.772f*V); float G = Y - (int)(0.344f*V + 0.714f*U); float B = Y + (int)(1.402f*U); if (R < 0){ R = 0; } if (G < 0){ G = 0; } if (B 255 ){ R = 255; } if (G > 255) { G = 255; } if (B > 255) { B = 255; } cvSet2D(img1, i, j,cvScalar(B,G,R)); } }
origImage -> image YUV,
img1 -> image RVB,
http://upload.wikimedia.org/wikipedia/en/0/0d/Yuv420.svg
Existe-t-il une fonction permettant de convertir un pixel
au format YUV420 en pixel RVB correspondant? (pas l’image entière)
J’ai eu la réponse en modifiant la formule de calcul des valeurs RVB, ce code fonctionne bien
int step = origImage->widthStep; uchar *data = (uchar *)origImage->imageData; int size = origImage->width * origImage->height; IplImage* img1 = cvCreateImage(cvGetSize(origImage), IPL_DEPTH_8U, 3); for (int i = 0; iheight; i++) { for (int j=0; jwidth; j++) { float Y = data[i*step + j]; float U = data[ (int)(size + (i/2)*(step/2) + j/2) ]; float V = data[ (int)(size*1.25 + (i/2)*(step/2) + j/2)]; float R = Y + 1.402 * (V - 128); float G = Y - 0.344 * (U - 128) - 0.714 * (V - 128); float B = Y + 1.772 * (U - 128); if (R < 0){ R = 0; } if (G < 0){ G = 0; } if (B < 0){ B = 0; } if (R > 255 ){ R = 255; } if (G > 255) { G = 255; } if (B > 255) { B = 255; } cvSet2D(img1, i, j,cvScalar(B,G,R)); } }
Le 1er problème est d’utiliser la c-api obsolète (c’est mort et c’est parti. Merci d’utiliser c ++ à la place).
le deuxième problème est l’écriture de vos propres boucles de pixels (lentes et sujettes aux erreurs)
pourquoi ne pas utiliser:
cvtColor(crs,dst, CV_YUV2BGR); // or CV_YUV2BGR_I420
au lieu ?