YUV、RGB、BGR用途:
YUV、RGB、BGR还有其他的一些都属于颜色的色彩空间,大家最熟悉的应该就是RGB了,但是Opencv 中的Mat的是BGR的,如果将RBG赋值后会有颜色变蓝等问题,亲测,亲自踩的坑。。单YUV的颜色表示也有很多种,种类我就不这里说了,很多我也没有接触过。这里我们只对YUV420做实例,但是Opencv也对YUV其他编码有做转换算法。后面会提一下。
YUV 我见过的两个场景,一个就是海康和宇视的摄像机的码流,我接触到的都是YUV420的,另一个就是“网易云信SDK实时音视频”(webRTC)取到的码流也是YUV420的,RGB 和 BGR 前面说过一种就是Opencv里面Mat数据格式为BGR,常见的*.png的数据格式为:图片头信息+图片信息(即buffer),其中buffer 的格式就是RGBA的格式
Opencv 则是开源的图像处理中重要的类库了,这里就不解释了。。
YUV420 数据格式
这里引用一个博客地址:https://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html
这里详细解释,我再说一下YUV420的格式大概为:Y分量全部+U分量全部+V分量全部,Y分量全部为w*h,U和V加起来为w*h/2,那么YUV加起来长度应该为w*h*3/2,即w*h*1.5。如果你拿到一个Buffer 想做转化数据格式那一定要准确单独取到Y、U、V,三个分量。
如果你已经取到YUV三个分量,那么Opencv就会帮你做好剩下的事情啦。
Opencv YUV 转 BGR
废话不多说直接上代码
//码流入口.. do something...
//y分量
buffer_vec.insert(buffer_vec.end(), pPictureData->pucData[0], pPictureData->pucData[0]+ data0_size);
//u分量
buffer_vec.insert(buffer_vec.end(), pPictureData->pucData[1], pPictureData->pucData[1] + data1_size);
//v分量
buffer_vec.insert(buffer_vec.end(), pPictureData->pucData[2], pPictureData->pucData[2] + data2_size);
//创建一个相同大小单通道Mat
cv::Mat src(h * 3 / 2, w, CV_8UC1, buffer_vec.data());
//创建一个3通道的BGR大小为W*H
cv::Mat dst(h, w, CV_8UC3);
从YUV420转换到BGR空间
cv::cvtColor(src, dst, CV_YUV2BGR_IYUV);
cv::imshow("bgr", dst);
//因为不止一张,所以我这里设置为1了。
cv::waitKey(1);
OK END~~