NV12的格式为YYYYYYYY..UVUV..,OpenCV使用imread读出来的图像是BGR格式,但没有提供BGR直接转NV12的方法,只能先转成YUV_I420,再间接得到YUV_NV12。
cv::Mat BGR2YUV_NV12(const cv::Mat &src) {
auto src_h = src.rows;
auto src_w = src.cols;
cv::Mat dst(src_h * 1.5, src_w, CV_8UC1);
cv::cvtColor(src, dst, cv::COLOR_BGR2YUV_I420); // I420: YYYY...UU...VV...
auto n_y = src_h * src_w;
auto n_uv = n_y / 2;
auto n_u = n_y / 4;
std::vector<uint8_t> uv(n_uv);
std::copy(dst.data+n_y, dst.data+n_y+n_uv, uv.data());
for (auto i = 0; i < n_u; i++) {
dst.data[n_y + 2*i] = uv[i]; // U
dst.data[n_y + 2*i + 1] = uv[n_u + i]; // V
}
return dst;
}
可以使用如下代码将YUV_I420进行保存:
FILE* outfile = fopen("img.yuv", "wb+");
fwrite(dst.data, 1, dst.rows*dst.cols*3/2, outfile);
fclose(outfile);
播放yuv图像,想得到正确结果,必须I420格式:
ffplay -f rawvideo -video_size 1920x1080 img.yuv
关于yuv的介绍可以参考这两篇文章:
图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
https://blog.csdn.net/byhook/article/details/84037338
视音频数据处理入门:RGB、YUV像素数据处理
https://blog.csdn.net/leixiaohua1020/article/details/50534150
作者简介
我是阿德,一名五年工作经验的软件开发工程师,985高校非科班程序员,热爱编程与开源,
此公众号【程序员阿德】专注于分享各种计算机干货,包括但不限于计算机组成原理、数据结构与算法、计算机网络、操作系统、数据库、Linux等。
相信你能够在这里有所收获,精进为一名优秀程序员,我们一起加油~
现在关注公众号 [程序员阿德] ,回复【书籍】可以获取我精心挑选的10本经典计算机电子书,加速你的成长。
版权归原作者 程序员阿德 所有, 如有侵权,请联系我们删除。