我正在尝试将像素数据转换为 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 使用 stride 从数组生成 cv::Mat