NV12数据转OpenCV的Mat
// 将 NV12 转换为 BGR void nv12ToBgr(const unsigned char* yuvData, int width, int height, Mat& bgrImage) { // 计算每个平面的大小 int ySize = width * height; int uvSize = (width / 2) * (height / 2); // 创建一个包含 NV12 数据的 Mat 对象 Mat nv12(height + height / 2, width, CV_8UC1, const_cast<unsigned char*>(yuvData)); // 直接使用 OpenCV 的颜色转换函数进行 NV12 到 BGR 的转换 cvtColor(nv12, bgrImage, COLOR_YUV2BGR_NV12); }
#include <opencv2/opencv.hpp> #include <iostream> #include <fstream> #include <vector> using namespace std; using namespace cv; // 将 NV12 转换为 BGR void nv12ToBgr(const unsigned char* yuvData, int width, int height, Mat& bgrImage) { // 计算每个平面的大小 int ySize = width * height; int uvSize = (width / 2) * (height / 2); // 创建一个包含 NV12 数据的 Mat 对象 Mat nv12(height + height / 2, width, CV_8UC1, const_cast<unsigned char*>(yuvData)); // 直接使用 OpenCV 的颜色转换函数进行 NV12 到 BGR 的转换 cvtColor(nv12, bgrImage, COLOR_YUV2BGR_NV12); } int main() { // OpenCV 版本号 cout << "OpenCV_Version: " << CV_VERSION << endl; string filePath = "f.nv12"; ifstream file(filePath, ios::binary | ios::ate); if (!file.is_open()) { cerr << "无法打开文件: " << filePath << endl; return -1; } streamsize size = file.tellg(); file.seekg(0, ios::beg); vector<char> buffer(size); if (!file.read(buffer.data(), size)) { cerr << "无法读取文件: " << filePath << endl; return -1; } int width = 640; // 假设宽度为 640 int height = 480; // 假设高度为 480 Mat bgrImage; nv12ToBgr(reinterpret_cast<const unsigned char*>(buffer.data()), width, height, bgrImage); // 显示图像 imshow("NV12 to BGR", bgrImage); waitKey(0); return 0; }