NV12转rgb24



void NV21_T_RGB(unsigned int width , unsigned int height , unsigned char *yuyv)// , unsigned char *rgb
{
const int nv_start = width * height ;
test_rgb = calloc(width*height*3, 1);
    u32  i, j, index = 0, rgb_index = 0;
    u8 y, u, v;
    int r, g, b, nv_index = 0;
    for(i = 0; i <  height ; i++)
    {
        for(j = 0; j < width; j++){
            //nv_index = (rgb_index / 2 - width / 2 * ((i + 1) / 2)) * 2;
            nv_index = i / 2  * width + j - j % 2;


            y = yuyv[rgb_index];
            u = yuyv[nv_start + nv_index ];
            v = yuyv[nv_start + nv_index + 1];


            r = y + (140 * (v-128))/100;  //r
            g = y - (34 * (u-128))/100 - (71 * (v-128))/100; //g
            b = y + (177 * (u-128))/100; //b
            if(r > 255)   r = 255;
            if(g > 255)   g = 255;
            if(b > 255)   b = 255;
            if(r < 0)     r = 0;
            if(g < 0)     g = 0;
            if(b < 0)     b = 0;


            index = rgb_index % width + (height - i - 1) * width;
            test_rgb[index*3+0] = b;
            test_rgb[index*3+1] = g;
            test_rgb[index*3+2] = r;
            rgb_index++;
            //printf("11111111111111111110\n");
        }
    }
}


int v4l_get_capture_data(struct v4l2_buffer *buf)//�õ������ݣ���ѹ��
{
unsigned char picture_bianbei1_uv[540*1920]={0};
unsigned char picture_bianbei1_y[1080*1920*3/2]={0};

memset(buf, 0, sizeof(struct v4l2_buffer));
buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf->memory = V4L2_MEMORY_MMAP;
if (ioctl(camera_fd, VIDIOC_DQBUF, buf) < 0) {
err_msg("VIDIOC_DQBUF failed\n");
return -1;

if(open_camera == camera_5640)
{
memcpy(pic_track_5640,  cap_buffers[buf->index].start, cap_buffers[buf->index].length-2560);

if(Cap_Uart2_FK.dianzibianbei==1)
{
fujie_data.xiangyuan_hor=1920;
fujie_data.xiangyuan_ver=1080;
fujie_data.enc_horpixeel=1920;
fujie_data.enc_verpixeel=1088;
memcpy(pic_track_5640_pai,pic_track_5640,sizeof(pic_track_5640));
//process_image_5640(pic_track_5640_pai,sizeof(pic_track_5640));
if(test_flag==0)
{
NV21_T_RGB(1920,1080,pic_track_5640_pai);
///test_rgb =test_rgb666;
printf("2=%d\n",test_rgb[1]);
printf("2=%d\n",pic_track_5640_pai[2]);
// printf("3=%d\n",test_rgb[2]);
// jpg_fd666 = fopen("nihao666.jpg", "w");
// fwrite( test_rgb, 1920*1080*3,1,jpg_fd666);
//close(jpg_fd666);
process_image_5640(test_rgb,1920*1080*3);
test_flag=1;
}
}

你可能感兴趣的:(ubuntu,imx6q)