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);
我有以下格式的一维图像数据
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);