算法 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这种硬件并行去转!