当前位置:   article > 正文

OpenCV将BGR转换为NV12_opencv bgr转nv12

opencv bgr转nv12

NV12的格式为YYYYYYYY..UVUV..,OpenCV使用imread读出来的图像是BGR格式,但没有提供BGR直接转NV12的方法,只能先转成YUV_I420,再间接得到YUV_NV12。

  1. cv::Mat BGR2YUV_NV12(const cv::Mat &src) {
  2. auto src_h = src.rows;
  3. auto src_w = src.cols;
  4. cv::Mat dst(src_h * 1.5, src_w, CV_8UC1);
  5. cv::cvtColor(src, dst, cv::COLOR_BGR2YUV_I420); // I420: YYYY...UU...VV...
  6. auto n_y = src_h * src_w;
  7. auto n_uv = n_y / 2;
  8. auto n_u = n_y / 4;
  9. std::vector<uint8_t> uv(n_uv);
  10. std::copy(dst.data+n_y, dst.data+n_y+n_uv, uv.data());
  11. for (auto i = 0; i < n_u; i++) {
  12. dst.data[n_y + 2*i] = uv[i]; // U
  13. dst.data[n_y + 2*i + 1] = uv[n_u + i]; // V
  14. }
  15. return dst;
  16. }

可以使用如下代码将YUV_I420进行保存:

  1. FILE* outfile = fopen("img.yuv", "wb+");
  2. fwrite(dst.data, 1, dst.rows*dst.cols*3/2, outfile);
  3. fclose(outfile);

播放yuv图像,想得到正确结果,必须I420格式:

ffplay -f rawvideo -video_size 1920x1080 img.yuv

关于yuv的介绍可以参考这两篇文章:

  1. 图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
  2. https://blog.csdn.net/byhook/article/details/84037338
  3. 视音频数据处理入门:RGB、YUV像素数据处理
  4. https://blog.csdn.net/leixiaohua1020/article/details/50534150

作者简介

我是阿德,一名五年工作经验的软件开发工程师,985高校非科班程序员,热爱编程与开源,

此公众号【程序员阿德】专注于分享各种计算机干货,包括但不限于计算机组成原理、数据结构与算法、计算机网络、操作系统、数据库、Linux等。

相信你能够在这里有所收获,精进为一名优秀程序员,我们一起加油~

现在关注公众号 [程序员阿德] ,回复【书籍】可以获取我精心挑选的10本经典计算机电子书,加速你的成长。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/864088?site
推荐阅读
相关标签
  

闽ICP备14008679号