- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
从内存缓冲区读取图像。
imdecode 函数从指定的内存缓冲区读取图像。如果缓冲区太短或包含无效数据,函数将返回一个空矩阵 (Mat::data==NULL
)。
参见 cv::imread 了解支持的格式和标志的描述。
注意
在处理彩色图像的情况下,解码后的图像将按 B G R 顺序存储通道。
函数原型1
Mat cv::imdecode
(
InputArray buf,
int flags
)
参数1
- 参数buf:包含图像数据的字节数组。通常是一个 std::vector 类型的对象。
- 参数flags:解码图像的标志,可以是以下值之一:
- IMREAD_COLOR(默认):加载彩色图像。任何 alpha 通道都会被忽略。
- MREAD_GRAYSCALE:以灰度模式加载图像。
- MREAD_UNCHANGED:加载图像,包括 alpha 通道(如果有的话)。
- IMREAD_ANYDEPTH:假设任何深度。
- IMREAD_ANYCOLOR:假设任何颜色模式。
- IMREAD_LOAD_GDAL:当从文件加载时,如果设置了此标志,则会使用 GDAL 库。
- IMREAD_REDUCED_COLOR_2:加载图像,并将其缩小到原来的 1/2。
- IMREAD_REDUCED_COLOR_4:加载图像,并将其缩小到原来的 1/4。
- IMREAD_REDUCED_COLOR_8:加载图像,并将其缩小到原来的 1/8。
- IMREAD_REDUCED_GRAYSCALE_2:加载图像,并将其缩小到原来的 1/2,并转换为灰度。
- IMREAD_REDUCED_GRAYSCALE_4:加载图像,并将其缩小到原来的 1/4,并转换为灰度。
- IMREAD_REDUCED_GRAYSCALE_8:加载图像,并将其缩小到原来的 1/8,并转换为灰度。
- IMREAD_IGNORE_ORIENTATION:忽略 EXIF 中的 Orientation 字段
函数原型2
函数原型1的重载函数,仅仅是参数的不同
Mat cv::imdecode
(
InputArray buf,
int flags,
Mat * dst
)
参数2
- 参数buf 输入数组或字节向量。
- 参数flags 与
cv::imread
中相同的标志,参见cv::ImreadModes
。 - 参数dst 可选的输出占位符,用于存放解码后的矩阵。当函数反复调用且图像大小相同时,它可以节省图像重新分配的开销。
返回值
解码后的图像。如果解码失败,则返回空的 cv::Mat 对象。
代码示例
#include <fstream>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
int main()
{
// 图像文件路径
std::string filename = "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg";
// 读取图像文件到内存缓冲区
std::ifstream file( filename, std::ios::binary );
if ( !file.is_open() )
{
std::cout << "Failed to open file." << std::endl;
return -1;
}
std::vector< unsigned char > buffer( ( std::istreambuf_iterator< char >( file ) ), std::istreambuf_iterator< char >() );
file.close();
// 使用 cv::imdecode 解码图像数据
cv::Mat img = cv::imdecode( buffer, cv::IMREAD_COLOR );
if ( img.empty() )
{
std::cout << "Failed to decode image data." << std::endl;
return -1;
}
// 显示图像
cv::imshow( "Decoded Image", img );
cv::waitKey( 0 );
return 0;
}