我是靠谱客的博主 长情钻石,最近开发中收集的这篇文章主要介绍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本经典计算机电子书,加速你的成长。

 

最后

以上就是长情钻石为你收集整理的OpenCV将BGR转换为NV12的全部内容,希望文章能够帮你解决OpenCV将BGR转换为NV12所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部