opencvbgr转nv12
时间: 2023-11-15 13:00:45 浏览: 120
LINUX UVC支持NV12格式
在OpenCV中,使用imread读取的图像是BGR格式,但是没有提供BGR直接转NV12的方法,只能先转成YUV_I420,再间接得到YUV_NV12。可以使用以下代码实现BGR转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;
}
以上代码将BGR格式的图像转换为YUV_NV12格式的图像,并返回一个cv::Mat类型的图像。可以使用以下代码将YUV_NV12格式的图像保存到文件中:
FILE* outfile = fopen("img.yuv", "wb+");
fwrite(dst.data, 1, dst.rows*dst.cols*3/2, outfile);
fclose(outfile);
其中,dst是BGR2YUV_NV12函数返回的图像。
阅读全文