ov9650 實時顯示app 平臺:i.mx6ul linux 3.14.38

本文先簡單記錄:

1.ov9650採集 攝像頭輸出yuyv格式

2.寫入到framebuffer顯示

3.貼yuv2rgb.c的代碼如下:

tips: 查表法/bpp=32  table略

void yuv2rgb(unsigned char *pyuv,unsigned char *prgb,int width, int height)
{
        unsigned char *py = pyuv;
        //unsigned short *pb = prgb;
        unsigned char *pb = prgb;
        unsigned int y1,u,y2,v;
        int rdif, invgdif, bdif;
        int  r = 0,g = 0,b = 0;
        int x,y;
        for(y = 0; y < height; y++){
                        for(x = 0; x < width; x += 2){


                                        y1 = *py++ ;
                                        u = *py++ ;
                                        y2 = *py++ ;
                                        v = *py++;


                                        rdif = Table_fv1[v];
                                        invgdif = Table_fu1[u] + Table_fv2[v];
                                        bdif = Table_fu2[u];


                                        r = y1 + rdif;
                                        g = y1 - invgdif;
                                        b = y1 + bdif;
                                        r = (r > 255)?255:(r < 0)?0:r;
                                        g = (g > 255)?255:(g < 0)?0:g;
                                        b = (b > 255)?255:(b < 0)?0:b;
                                        //pb[x+0] = b;
                                        //pb[x+1] = g;
                                        //pb[x+2] = r;
                                        //pb[x+3] = 0;

                                        *pb++ = b;

                                        *pb++ = g;
                                        *pb++ = r;
                                        *pb++ = 0;
                                        //*pb++ = 0;
                                        //*pb++ = 0;
                                        //*pb++ = 200;
                                        //*pb++ = 0;


                                        //*pb++ = ((r >> 3)  << 11) | ((g >> 2) << 5) | (b >> 3) ;


                                        r = y2 + rdif;
                                        g = y2 - invgdif;
                                        b = y2 + bdif;


                                        r = (r > 255)?255:(r < 0)?0:r;
                                        g = (g > 255)?255:(g < 0)?0:g;
                                        b = (b > 255)?255:(b < 0)?0:b;
                                        //pb[x+4] = b;
                                        //pb[x+5] = g;
                                        //pb[x+6] = r;
                                        //pb[x+7] = 0;
                                        *pb++ = b;
                                        *pb++ = g;
                                        *pb++ = r;
                                        *pb++ = 0;


                                        //*pb++ = ((r >> 3)  << 11) | ((g >> 2) << 5) | (b >> 3);
                        }
                        pb = prgb + 800 * 4 * y;

        }

同樣也可以用移位去計算rgb:(像素編碼)

unsigned int *pb = prgb;

*pb++ = (r << 16) | ((g << 8) | b;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章