如果您的输入格式是 YUY2,那么它实际上是 YUYV,我下面的示例假设了这一点。但是,如果您的格式确实是 UYVY,只需更改我的示例或颜色空间中的顺序(请参阅下面的注释)。
您可以通过 2 通道 Mat 数组将此 YUY2/YUYV422 数据呈现给 OpenCV。
有两种方法可以填充 Mat img:通过复制和通过引用。根据您的应用程序,您可以选择其中任何一种。
两者都假设您在 char 数组中有 yuv 数据image_yuv
。
1a。通过参考原始数据(没有内存分配;快速):
Mat img(height, width, CV_8UC2, img_yuv);
1b。通过将数据复制到 Mat 中:
Mat img(height, width, CV_8UC2);
uchar *pix = img.ptr<uchar>(r); // first byte of the row in image
for (int r = 0, b=0; r < height; r++) {
for (int c = 0; c < width; c+=4) {
*pix++ = image_yuv[b++]; // y
*pix++ = image_yuv[b++]; // u
*pix++ = image_yuv[b++]; // y
*pix++ = image_yuv[b++]; // v
}
}
现在您在 Mat img 中有数据,您可以使用 cvtColor 将其转换为其他颜色空间:
2a. 更改为 BGR:
cvtColor(img, img_p, COLOR_YUV2BGR_YUY2);
imshow("window", img_p);
2b。更改为灰度:
cvtColor(img, img_p, COLOR_YUV2GRAY_YUY2);
imshow("window", img_p);
注意:如果您的格式是 UYVY,请更改复制顺序或更改颜色空间(COLOR_YUV2BGR_UYVY 或 COLOR_YUV2GRAY_UYVY)。请参阅 OpenCV 源代码中的 imgproc.hpp。