欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > yuv420转 nv12

yuv420转 nv12

2025/2/26 13:37:52 来源:https://blog.csdn.net/qianbo042311/article/details/141676690  浏览:    关键词:yuv420转 nv12

算法 show me the code

这个算法特别简单,就是把两个平面得数据合并为1个平面

void convertYUV420toNV12(uint8_t* yuv420Data, uint8_t* nv12Data, int width, int height) {int ySize = width * height;int uvSize = ySize / 4;// Copy Y componentmemcpy(nv12Data, yuv420Data, ySize);// Interleave U and V componentsfor (int i = 0; i < uvSize; i++) {nv12Data[ySize + i * 2] = yuv420Data[ySize + i];nv12Data[ySize + i * 2 + 1] = yuv420Data[ySize + uvSize + i];}
}

过程就是先拷贝y品面,再把uv平面从两个平面转到1个平面上,让uv交错分布,而nv12 是交错分布得。看到了很多写得代码写得巨复杂,就知道很多人没有理解两个平面得概念

做个试验

int main()
{cv::Mat bgr = cv::imread("F:/stitcher_client_ago/jpg/111.png");if (bgr.empty()) {std::cerr << "Error loading image!" << std::endl;return -1;}// Convert BGR to NV12int w = bgr.cols;int h = bgr.rows;cv::Mat yuv;cv::cvtColor(bgr, yuv, cv::COLOR_BGR2YUV_I420);cv::Mat NV12mat(h * 3 / 2,w, CV_8UC1);//uint8_t* nv12data = new uint8_t[w * h * 3 / 2];convertYUV420toNV12(yuv.data, NV12mat.data, w, h);// 转换 NV12 到 BGRcv::Mat bgrImg;cv::cvtColor(NV12mat, bgrImg, cv::COLOR_YUV2BGR_NV12);cv::imshow("s", bgrImg);cv::waitKey(0);
}

bgr 转成I420,再把I420 转成nv12,使用opencv特别简单,如何保证实时性就是问题了,老实用cuda这种硬件并行去转!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com