使用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
}







