我有以下格式的一维图像数据
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,我的操作系统是 Ubuntu 16.04。
正如有人在评论中提到的,这些数据(代码中的 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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句