您的位置:程序门 -> vc/mfc -> 图形处理/算法



yuv420转rgb


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


yuv420转rgb
发表于:2007-05-30 11:53:56 楼主
如下的函数,我用来进行yuv420转rgb,但是转换后的图像颜色很有问题,如果把,v,u置0,灰度图像可以出来,我推测可能是u,v读出来有问题,但我实在找不出怎么修改,请各位大虾指点!!!感谢万分!!!

void   cyuv2rgbdlg::yuv2rgb(unsigned   char   *src,   unsigned   char   *dest,   int   cx,   int   cy)
{
int   i,   j;
unsigned   char *bufy,   *bufu,   *bufv,   *bufrgb;

bufy   =   src;
bufu   =   src   +   cx   *   cy;
bufv   =   src   +   int(cx   *   cy*   5/4);

unsigned   char   y,   u,   v,   r,   g,   b;

for(   j   =   0;   j   <   cy;   j++   )
{
bufrgb   =   dest   +   cx   *   (cy   -   1   -   j)   *   3   ;
for(   i   =   0;   i   <   cx;   i++   )
{
y   =   *(bufy   +   i   +   j   *   cx);

u   =   *(bufu   +   (i> > 1)   +(   j> > 1)*cx/2   )   -   128;
v   =   *(bufv   +   (i> > 1)   +   (j> > 1)*cx/2   )   -   128;

r   =   y   +   1.402   *   v;
g   =   y   -   0.344   *   u   -   0.714   *   v;
b   =   y   +   1.717   *   u;

*(   bufrgb++   )   =   max(   0,   min(   r,   255   )   );
*(   bufrgb++   )   =   max(   0,   min(   g,   255   )   );
*(   bufrgb++   )   =   max(   0,   min(   b,   255   )   );
}
}
}
发表于:2007-05-30 14:13:171楼 得分:0
bufy   =   src;
bufv   =   src   +   cx   *   cy;
bufu   =   src   +   int(cx   *   cy*   5/4);
把指针换换,应该就   ok   了   ,我原来也遇到过这样的问题。试试把先
发表于:2007-05-30 14:51:202楼 得分:0
void   yuv_rgb   (byte   *buffer,byte   *pbr,byte   *pbg,byte   *pbb)
{

const   int   bmp_wd   =352;
const   int   bmp_ht=288;
unsigned   char   *bufy   ,   *bufu   ,   *bufv;

short   int   r,   c,r,   g,   b,   y,   u,   v;
byte*   yuvbuf;
yuvbuf=buffer;

bufy   =   yuvbuf;
bufu   =   yuvbuf   +   bmp_wd   *   bmp_ht;
bufv   =   yuvbuf   +   bmp_wd   *   bmp_ht   *   3/2;

long   iindex=0;

for   (r   =   0;   r   <   bmp_ht;   r++)   {

for   (c   =   0;   c   <   bmp_wd;   c++)   {
y   =   bufy   [c];
u   =   bufu   [c   > >   1]   -   128;

v   =   bufv   [c   > >   1]   -   128;

r   =   y   +   1.375   *   v;
g   =   y   -   0.34375   *   u   -   0.703125   *   v;
b   =   y   +   1.734375   *   u;
r   =   max   (0,   min   (255,   r));
g   =   max   (0,   min   (255,   g));
b   =   max   (0,   min   (255,   b));

pbr[iindex+c]=r;
pbg[iindex+c]=g;
pbb[iindex+c]=b;
}


bufy   +=   bmp_wd;
bufu   +=   bmp_wd/2;
bufv   +=   bmp_wd/2;
iindex+=bmp_wd;
}
}
发表于:2007-05-30 15:52:193楼 得分:0
我发现了问题所在,u,v是unsigned   char   型,减128可能会下溢,把减128移到下面的公式中,图像就基本上出来了,只是还有一点暗。。
发表于:2007-07-04 17:30:354楼 得分:0
我来
发表于:2007-07-06 16:57:495楼 得分:0
“u,v是unsigned   char   型,减128可能会下溢,把减128移到下面的公式中,图像就基本上出来了”

原来是这么回事,又学了一点
发表于:2007-07-30 14:35:566楼 得分:0
min(   r,   255   )有问题,r本来就是unsigned   char,其范围是0-255
min(   r,   255   ),没有任何意义

把r   g   b   声明成unsigned   long   试试

另外用浮点数计算有点浪费时间,可以优化的


快速检索

最新资讯
热门点击