使用opencv将nv21 yuv yuyv数据转换为rgb 数据
网上有太多的yuv数据转换rgb数据的方法,但是用户自己写的程序真没有opencv 的快。
两种方法的比较如下
gettimeofday(&tv, NULL); printf("millisecond: %ld \n", (tv.tv_sec * 1000 + tv.tv_usec / 1000)); // 毫秒 #if 1// MTH1 use opencv convert need 1-2ms after test Mat nv12(480 *3 /2,640, CV_8UC1,(unsigned char*)frame);//from camera reading a frame format is NV12 Mat bgr;//define a mat in rgb datas cvtColor(nv12,bgr,CV_YUV2BGR_NV12);//converto nv12 to bgr #endif #if MTH2 //user custom define need 4ms after test //yuvtorgb0((unsigned char *)frame, 640, 480); NV12_or_NV21_to_rgb24(1, (unsigned char *)frame,(unsigned char *) rgbbuf,640, 480);//one frame to rgb buffer Mat bgr(480,640,CV_8UC3,(uchar*)rgbbuf);//rgb buffer to mat // dump_raw((uchar*)rgbbuf,640, 480); #endif //opencv is faster 4times than user custom define gettimeofday(&tv, NULL); printf("millisecond: %ld \n", (tv.tv_sec * 1000 + tv.tv_usec /1000)); // 毫秒
方法1是将nv12转换为bgr的,肥肠的方便,并且速度还是肥肠的快,时间是自定义的4倍多。
yuv420 nv12 yv12都可以借助此类方法实现转换RGB 或者bgr.
// Mat src(Height, width, CV_8UC2, (unsigned char*)srcdata); // Mat dst(Height, width, 16, (unsigned char*)dstdata); // cvtColor(src, dst, COLOR_YUV2RGB_UYVY); //yuyv to bgr data 这里通常是USB CAMERA的摄像头 YUV422 DEBUG(LOG_DEBUG,"i422 enc yuv start\n"); Mat yuyv(480 ,640, CV_8UC2,(unsigned char*)frame);//from camera reading a frame format is NV12 Mat bgr;//define a mat in rgb datas cvtColor(yuyv,bgr,CV_YUV2BGR_YUYV);//converto bgr from yuyv //注意长度发生变化 bgr.data的长度是 640*480*3 Mat temp; if(fra_che_cnt++ >= 10) { DEBUG(LOG_DEBUG,"detection start \n"); fra_che_cnt =0; detectAndDisplay(bgr); DEBUG(LOG_DEBUG,"detection end \n"); cvtColor(bgr,temp,COLOR_BGR2YUV_I420); picture_buf = temp.data; pPic_in->img.plane[0] = picture_buf; //Y pPic_in->img.plane[1] = picture_buf+y_size; //U pPic_in->img.plane[2] = picture_buf+(y_size*5/4);//V }else { cvtColor(bgr,temp,COLOR_BGR2YUV_I420); picture_buf = temp.data; pPic_in->img.plane[0] = picture_buf; //Y pPic_in->img.plane[1] = picture_buf+y_size; //U pPic_in->img.plane[2] = picture_buf+(y_size*5/4);//V }