0


OpenCV将BGR转换为NV12

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本经典计算机电子书,加速你的成长。


本文转载自: https://blog.csdn.net/baidu_36639782/article/details/128937387
版权归原作者 程序员阿德 所有, 如有侵权,请联系我们删除。

“OpenCV将BGR转换为NV12”的评论:

还没有评论