imdecode 加载图片失败

imdecode fails to load the image

我有以下格式的一维图像数据

cv::Mat TestIm(400,400,CV_8UC1,cv::Scalar(0));
cv::putText(TestIm,"Hello !",cv::Point(100,200),CV_FONT_HERSHEY_COMPLEX,1,cv::Scalar(255));
QByteArray ImData = QByteArray((char *)TestIm.data,TestIm.total()); //this is 1D image data

现在假设我想从此数据中获取原始图像,我使用以下代码片段:

 cv::Mat rawData  =  cv::Mat( 1, ImData.size(), CV_8UC1, ImData.data() );

 cv::Mat decodedImage  =  cv::imdecode( rawData , CV_LOAD_IMAGE_GRAYSCALE );
 if ( decodedImage.data == NULL )
 {
     qDebug()<<"Error in decompression !";
 }

正如 opencv 文档中所述,它将猜测图像尺寸并创建输出。但在这种情况下,它总是写

    "Error in decompression !"

这里有什么问题吗?我在不同的项目中多次使用这个代码片段,但我不知道为什么它在这里失败了!

如果我将第二部分更改为这个假设我知道它有效的图像尺寸:

  cv::Mat decodedImage = cv::Mat(400,400,CV_8UC1,ImData.data());

但我不想要这个,因为在实际场景中我有一个一维图像数据数组(维度未知),我想获得完整的二维图像。

我也不喜欢使用第三方库,例如 libjpeg。我只想用OpenCV来解决

我有 OpenCV 3.0.0 和 Qt 5.7,我的 OS 是 Ubuntu 16.04.

我已经使用已知尺寸解决了这个问题,详情请参阅此post:

更好的解决方案是使用数据流 serialize/parse 数据,请参阅:

另一方面,如果您想避免固定值,您可以这样做:

定义:

struct memoryStruct {
char *memory;
size_t size;
};

在 imdecode 初始化之前:

memoryStruct temp;
temp.memory = NULL;
temp.size = 0;

将 temp 分配给您的 QByteArray 然后调用 imdecode

cv::imgTmp = cv::imdecode(cv::Mat(1, temp.size, CV_8UC1, temp.memory), CV_LOAD_IMAGE_UNCHANGED);

您可以轻松删除该结构的使用。

正如评论中有人提到的,这些数据(代码中的 ImData 变量)未编码!它们只是一些解码后的像素值!

为了使cv::imdecode工作,您必须将初始数据编码为一些已知格式,例如“.jpg”,然后使用函数获取原始数据。

cv::Mat DecodedImage = TestIm;
std::vector<uchar> OutputBuffer;
cv::imencode(".jpg",DecodedImage,OutputBuffer);
cv::Mat rawData  =  cv::Mat( 1, OutputBuffer.size(), CV_8UC3, OutputBuffer.data() );
cv::Mat Output  =  cv::imdecode( cv::Mat(rawData) , CV_LOAD_IMAGE_COLOR);