OpenCV图像文件读写(4)解码图像数据函数imdecode()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

从内存缓冲区读取图像。

imdecode 函数从指定的内存缓冲区读取图像。如果缓冲区太短或包含无效数据,函数将返回一个空矩阵 (Mat::data==NULL)。

参见 cv::imread 了解支持的格式和标志的描述。

注意

在处理彩色图像的情况下,解码后的图像将按 B G R 顺序存储通道。

函数原型1

cpp 复制代码
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的重载函数,仅仅是参数的不同

cpp 复制代码
Mat cv::imdecode	
(
	InputArray 	buf,
	int 	flags,
	Mat * 	dst 
)	

参数2

  • 参数buf 输入数组或字节向量。
  • 参数flags 与 cv::imread 中相同的标志,参见 cv::ImreadModes
  • 参数dst 可选的输出占位符,用于存放解码后的矩阵。当函数反复调用且图像大小相同时,它可以节省图像重新分配的开销。

返回值

解码后的图像。如果解码失败,则返回空的 cv::Mat 对象。

代码示例

cpp 复制代码
#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;
}

运行结果

相关推荐
ctrlworks11 分钟前
楼宇自控核心功能:实时监控设备运行,快速诊断故障,赋能设备寿命延长
人工智能·ba系统厂商·楼宇自控系统厂家·ibms系统厂家·建筑管理系统厂家·能耗监测系统厂家
BFT白芙堂1 小时前
睿尔曼系列机器人——以创新驱动未来,重塑智能协作新生态(上)
人工智能·机器学习·机器人·协作机器人·复合机器人·睿尔曼机器人
aneasystone本尊1 小时前
使用 MCP 让 Claude Code 集成外部工具
人工智能
静心问道1 小时前
SEW:无监督预训练在语音识别中的性能-效率权衡
人工智能·语音识别
羊小猪~~1 小时前
【NLP入门系列五】中文文本分类案例
人工智能·深度学习·考研·机器学习·自然语言处理·分类·数据挖掘
xwz小王子1 小时前
从LLM到WM:大语言模型如何进化成具身世界模型?
人工智能·语言模型·自然语言处理
我爱一条柴ya1 小时前
【AI大模型】深入理解 Transformer 架构:自然语言处理的革命引擎
人工智能·ai·ai作画·ai编程·ai写作
静心问道1 小时前
FLAN-T5:规模化指令微调的语言模型
人工智能·语言模型·自然语言处理
李师兄说大模型1 小时前
KDD 2025 | 地理定位中的群体智能:一个多智能体大型视觉语言模型协同框架
人工智能·深度学习·机器学习·语言模型·自然语言处理·大模型·deepseek
静心问道1 小时前
SqueezeBERT:计算机视觉能为自然语言处理在高效神经网络方面带来哪些启示?
人工智能·计算机视觉·自然语言处理