我正在尝试将像素数据转换为 OpenCV Mat 对象

Posted

技术标签:

【中文标题】我正在尝试将像素数据转换为 OpenCV Mat 对象【英文标题】:I'm trying to convert pixel data to an OpenCV Mat object 【发布时间】:2015-02-25 05:48:18 【问题描述】:

我有想要通过 opencv cvShowImage() 函数输出的原始像素数据。

我有以下代码:

#include <opencv2/highgui/highgui.hpp>

// pdata is the raw pixel data as 3 uchars per pixel
static char bitmap[640*480*3];
memcpy(bitmap,pdata,640*480*3);
cv::Mat mat(480,640,CV_8UC3,bitmap);

std::cout << mat.flags << ", "
          << mat.dims  << ", "
          << mat.rows  << ", "
          << mat.cols  << std::endl;

cvShowImage("result",&mat);

哪些输出:

1124024336, 2, 480, 640

到控制台,但无法使用 cvShowImage() 输出图像。而是用消息抛出异常:

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat

我怀疑问题出在我创建 mat 对象的方式上,但我很难找到有关我应该如何做的更具体的信息。

我认为 CV_8UC3 不足以描述它来呈现数据数组。不是要知道数据是RGB还是YUY2等?如何设置?

【问题讨论】:

尝试cv::imshow("result", mat),而不是混合使用旧的 C 和新的 C++ API。我希望将Mat 转换为CvArr* 是问题所在。 @Roger,在最初误读您的评论后,我终于发现这个解决方案解决了我的问题,如果您将此作为答案,我会接受。 【参考方案1】:

尝试cv::imshow("result", mat),而不是混合使用旧的 C 和新的 C++ API。我希望将Mat 转换为CvArr* 是问题的根源。

所以,是这样的:

#include <opencv2/highgui/highgui.hpp>

// pdata is the raw pixel data as 3 uchars per pixel
static char bitmap[640*480*3];
memcpy(bitmap,pdata,640*480*3);
cv::Mat mat(480,640,CV_8UC3,bitmap);

std::cout << mat.flags << ", "
          << mat.dims  << ", "
          << mat.rows  << ", "
          << mat.cols  << std::endl;

cv::imshow("result", mat);

【讨论】:

我相信 imshow() 函数总是期望 mat 对象为灰色(在 8UC1 中)或 bgr(在 8UC3 中)。

以上是关于我正在尝试将像素数据转换为 OpenCV Mat 对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 giflib 将 opencv mat 编码为 gif

OpenCV 访问 MAT 对象中的 RGB 值

OpenCV - 无法访问 Mat 中的所有像素

OpenCV 使用 stride 从数组生成 cv::Mat

OpenCV 从 YUYV 像素格式视频帧创建 YUV420 或灰度 Mat 对象

将vector<Mat>转换为矢量文件Opencv