OpenCV中BGR转NV12
1.opencv代码jpg转换yuv420sp(nv12)
#include <stdio.h> #include <opencv2/opencv.hpp> int main(int argc, char **argv) { // 检查输入参数 if(argc != 2){ std::cout << "Usage: img2yuv <image_path>" << std::endl; return -1; } // 读取输入图像 cv::Mat image = cv::imread(argv[1]); int image_h = image.rows; int image_w = image.cols; int image_c = image.channels(); cv::imshow("image", image); cv::waitKey(); // 转换到I420 cv::Mat I420; // I420格式图像 cv::cvtColor(image, I420, cv::COLOR_BGR2YUV_I420); // 转换I420格式 uint8_t *pI420 = I420.ptr<uint8_t>(); // I420数据指针 int32_t I420_y_s = image_h * image_w; // I420中 Y长度 int I420_uv_h = image_h / 2; // I420中UV高度 int I420_uv_w = image_w / 2; // I420中UV宽度 // 转换到NV12 cv::Mat NV12 = cv::Mat(image_h * 3 / 2, image_w, CV_8UC1); // NV12格式图像 uint8_t *pNV12 = NV12.ptr<uint8_t>(); // NV12数据指针 memcpy(pNV12, pI420, I420_y_s); // 拷贝I420中的Y数据到NV12中 uint8_t *pI420_U = pI420 + I420_y_s; // 移动I420中U分量指针到U数据头部 uint8_t *pI420_V = pI420_U + I420_uv_h * I420_uv_w; // 移动I420中V分量指针到V数据头部 pNV12 = pNV12 + I420_y_s; // 移动NV12指针到U数据头部 for(int i = 0; i < I420_uv_h * I420_uv_w; i++){ // 遍历I420中UV分量数据,复制到NV12中 // 把I420中U数据复制到NV12中U数据对应位置 *pNV12 = *pI420_U; pNV12++; pI420_U++; // 把I420中V数据复制到NV12中V数据对应位置 *pNV12 = *pI420_V; pNV12++; pI420_V++; } // 保存转换图像 FILE *fp = fopen("output/result.yuv", "wb"); int image_len = image_w * image_h * 3 / 2; fwrite(NV12.ptr<uint8_t>(), image_len, 1, fp); fclose(fp); // 读取转换图像 fp = fopen("output/result.yuv", "rb"); unsigned char *image_buf = new unsigned char[image_len]; fread(image_buf, image_len, 1, fp); fclose(fp); // 显示转换图像 cv::Mat image2 = cv::Mat(image_h * 3 / 2, image_w, CV_8UC1, image_buf); cv::cvtColor(image2, image2, cv::COLOR_YUV2BGR_NV12); cv::imshow("image2", image2); cv::waitKey(); return 0; }
2.ffmpeg jpg转换yuv420sp(nv12)
ffmpeg -i data/1_2688_1520.jpg -pix_fmt nv12 output/1_2688_1520.yuv ffmpeg -y -s 2688x1520 -pix_fmt nv12 -i output/1_2688_1520.yuv output/1_2688_1520.jpg
参考地址:
https://blog.csdn.net/nodototao/article/details/120649916
https://www.cnblogs.com/dxscode/p/16196396.html
http://www.javashuo.com/article/p-znuvnhtl-dy.html
https://blog.csdn.net/zfjBIT/article/details/127395512
https://blog.csdn.net/u014613270/article/details/123448481
https://blog.51cto.com/u_15764210/5616675
https://www.fangwenw.com/soft/view-7624.html
https://www.jb51.cc/faq/1292067.html
https://blog.csdn.net/denghp83/article/details/37936643
https://www.cnblogs.com/chenpi/p/5128233.html
https://www.cnblogs.com/arthurchn/p/13489815.html
https://www.ancii.com/ay1xlqzn/
https://blog.csdn.net/smilestone_322/article/details/21104871
https://blog.csdn.net/weixin_38427663/article/details/107106092
https://blog.csdn.net/weixin_45736829/article/details/108382920
https://blog.csdn.net/laoyouji/article/details/100051158