Преобразование YUV в RGB в C++

у меня есть код для чтения файла YUV 4:2:0. Я хочу преобразовать цветовое пространство YUV в RGB. Ниже мой пробный код:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct _IMAGE_BUF
{
int             width;
int             height;
int             Total;
unsigned char*  buf;
}IMAGE_BUF;


int clamp(int val){
if(val>255) return 255;
if(val<0) return 0;
return val;
}


int main(){
FILE        *f_img,*f_out;
FILE        *f_y,*f_u,*f_v,*f_buff,*f_RGB;
int         i, j;
IMAGE_BUF   y,u,v,buff,RGB;
int         frm, numfrm;
int         face_num;
FILE        *f_outy, *f_outu, *f_outv;
int         width, height;


width = 416;
height = 240;


f_img=fopen("RaceHorses_416x240_30.yuv","rb");
f_RGB=fopen("RGB_416x240_30.rgb","wb");
f_buff=fopen("buff_416x240_30.yuv","wb");

fseek(f_img,0,SEEK_END);
numfrm = ftell(f_img);
numfrm /= ((width * height * 3)>> 1);
fseek(f_img,0,SEEK_SET);

buff.buf = (unsigned char*)malloc(width * height *1.5*sizeof(unsigned  char));
RGB.buf = (unsigned char*)malloc(width * height *sizeof(unsigned char));


for(frm = 0 ; frm < numfrm ; frm++)
{

    fread(buff.buf, sizeof(unsigned char), (width * height)*1.5, f_img);

    for (int j=0;j<height;j++)
    {
        for (int i=0;i<width;i++)
        {

            unsigned int y=buff.buf[j*width+i];
            unsigned int u=buff.buf[(j/2)*(width/2)+(i/2)+(width*height)];
            unsigned int v=buff.buf[(j/2)*(width/2)+(i/2)+(width*height)+((width*height)/4)];
            //printf("%d, %d,%d  ", y,u,v);

            //convert to RGB


            unsigned int R=clamp(y + (1.370705 * (v-128)));
            unsigned int G=clamp( y - (0.698001 * (v-128)) - (0.337633 * (u-128)));
            unsigned int B=clamp(y + (1.732446 * (u-128)));
            unsigned int RGBval= (0xFF << 24) | ((unsigned int) R << 16) |  ((unsigned int) G << 8) | B;
            RGB.buf[j*width+i]=RGBval;
        }

    }



    fwrite(buff.buf,sizeof(unsigned char), (width * height)*1.5, f_buff);
    fwrite(RGB.buf,sizeof(unsigned char), (width * height), f_RGB);




}


fclose(f_buff);
fclose(f_RGB);

free(buff.buf);
free(RGB.buf);

fclose(f_img);
return 0;

}

Тем не менее, я получаю изображение разницы между исходным и видеовыходом RGB. Возможно, кто-нибудь знает о моей проблеме или каких-либо исправлениях кода выше. Спасибо.


person Matrixwira    schedule 15.12.2015    source источник
comment
Возможно, связано с stackoverflow.com/questions/7041172 /   -  person Mark Ransom    schedule 15.12.2015
comment
Возможно, вы захотите сравнить свой код с лучшим ответом на stackoverflow.com/questions/9098881/   -  person Prateek    schedule 15.12.2015
comment
Можно ли использовать ИПП? Проверьте следующее: software.intel.com/en-us/node/503962   -  person Rotem    schedule 23.06.2016