我有一个来自相机(PAL)的数据流,我从回调函数获得的数据类型的格式如下:U0-Y0-V0-Y1 U2-Y2-V2-Y3 U4-Y4-V4-Y5 .... ..
我需要使用 OpenCV 的 cvCvtColor() 函数将颜色格式更改为 RGB(或 BGR)。该函数的用法为 cvCvtColor(YCrCb, dst, CV_YCrCb2BGR); 现在(实际上是之前)出现了问题,dst 是一个 3 通道 8U 图像,没关系,但是如何将来自回调函数的数据直接存储在 IplImage 中?如果我可以正确存储它,我可以使用 cvCvtColor() 来转换图像。有什么函数,还有其他库吗?如果我在每一帧中使用 RGB<->YUV 数学转换,则会导致 CPU 使用率达到 70%++,所以我不想使用它们,我正在寻找一种更简单的 CPU 方法。
小智 5
如果您的输入格式是 YUY2,那么它实际上是 YUYV,我下面的示例是假设的。但是,如果您的格式确实是 UYVY,只需更改我的示例或颜色空间中的顺序(请参阅下面的注释)。
您可以通过 2 通道 Mat 数组将此 YUY2/YUYV422 数据呈现给 OpenCV。
有两种方法可以填充 Mat img:通过复制和通过引用。根据您的应用程序,您可以选择其中之一。
两者都假设您在 char 数组中有 yuv 数据image_yuv。
1a. 参考原始数据(没有mem alloc;快):
Mat img(height, width, CV_8UC2, img_yuv);
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
现在您已经在 Mat img 中获得了数据,您可以使用 cvtColor 将其转换为其他颜色空间:
2a. 更改为 BGR:
cvtColor(img, img_p, COLOR_YUV2BGR_YUY2);
imshow("window", img_p);
Run Code Online (Sandbox Code Playgroud)
2b. 更改为灰度:
cvtColor(img, img_p, COLOR_YUV2GRAY_YUY2);
imshow("window", img_p);
Run Code Online (Sandbox Code Playgroud)
注意:如果您的格式为 UYVY,请更改复制顺序,或更改色彩空间(COLOR_YUV2BGR_UYVY 或 COLOR_YUV2GRAY_UYVY)。请参阅 OpenCV 源代码中的 imgproc.hpp。
| 归档时间: |
|
| 查看次数: |
12812 次 |
| 最近记录: |