当前位置: 首页 > ops >正文

OpenCV图像基本操作:读取、显示与保存

    在图像处理项目中,图像的 读取(imread)显示(imshow)保存(imwrite) 是最基础也是最常用的三个操作。本文将详细介绍这三个函数的功能、用法和注意事项,并提供一个完整示例供读者上手测试。

一、cv::imread:读取图像文件

cv::Mat cv::imread(const std::string& filename, int flags = cv::IMREAD_COLOR);

参数说明:

  • filename: 要读取的图像文件路径(支持 jpg, png, bmp 等格式)。

  • flags: 指定图像的读取方式:

    • cv::IMREAD_COLOR:以 BGR 方式读取彩色图像(默认)。

    • cv::IMREAD_GRAYSCALE:读取为灰度图像。

    • cv::IMREAD_UNCHANGED:按原始数据读取,包括 alpha 通道。

返回值:

  • 成功时返回 cv::Mat 图像矩阵。

  • 如果读取失败(路径错误或文件不存在),返回空矩阵,即 img.empty() == true

二、cv::imshow:显示图像窗口

void cv::imshow(const std::string& winname, cv::InputArray mat);

 参数说明:

  • winname: 显示窗口的名称(如果不存在则创建)。

  • mat: 要显示的图像矩阵,通常是 cv::Mat 类型。

注意事项:

  • imshow 需要配合 cv::waitKey() 使用,否则窗口会一闪而过。

  • GUI 线程必须存在(某些远程终端不支持 GUI)。

三、cv::imwrite:保存图像到文件

bool cv::imwrite(const std::string& filename, cv::InputArray img);

参数说明:

  • filename: 要保存的图像路径及文件名(自动识别扩展名如 .png, .jpg 等)。

  • img: 要保存的图像矩阵。

返回值:

  • true 表示保存成功,false 表示保存失败(如路径错误或无写权限)。

四、完整示例代码

下面我们结合上述三个函数写一个完整的小程序,实现:

  1. 从文件读取图像;

  2. 显示图像;

  3. 将图像保存为新的文件。

#include <iostream>int main()
{// 读取图像,返回cv::Mat保存图像数据// IMREAD_COLOR:以三通道彩色图像读取,如果原始数据为灰度图,返回图像被转换为彩色图像// IMREAD_GRAYSCALE:以灰度图像读取,如果原数据为彩色图,使用加权方式转换:gray=red*0.299 + green*0.587 + blue*0.114// IMREAD_UNCHANGED:保持原数据通道数,如果包含alpha通道,同样保留std::string input_path = "1.jpg";cv::Mat img = cv::imread(input_path, cv::IMREAD_COLOR);if (img.empty()) {std::cerr << "图像读取失败,请确认路径是否正确:" << input_path << std::endl;return -1;}// 创建窗口,窗口命名为"图像显示",后续所有关于该窗口的操作均以字符串"图像显示"进行检索// WINDOW_NORMAL: 用户可调整窗口尺寸与位置,显示图像时图像被压缩到窗口尺寸进行显示// WINDOW_AUTOSIZE(默认参数): 窗口尺寸自动匹配图像大小,如果显示图像大于显示器分辨率,则无法完全呈现cv::namedWindow("图像显示", cv::WINDOW_NORMAL);// 调整窗口尺寸与位置cv::resizeWindow("图像显示", 640, 480);cv::moveWindow("图像显示", 0, 0);// 显示图像,原始图像被缩放与窗口尺寸一致后再显示cv::imshow("图像显示", img);std::cout << "图像已显示,请按任意键关闭窗口..." << std::endl;cv::waitKey(0);  // 必须等待,否则窗口会立即关闭// 设置jpg压缩质量,该压缩方式为有损压缩// 压缩质量:0 - 100,数值越大,细节保留越多,图像文件越大std::vector<int> compression_params;compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);compression_params.push_back(80); // 保存为jpg图像,当参数compression_params为空时,默认压缩质量为95std::string output_path = "output_saved.jpg";cv::imwrite(output_path, img, compression_params);// 设置png压缩等级为6,该压缩方式为无损压缩// 压缩等级:0-9,数值越大,压缩速度越慢,文件越小// 不管压缩等级为多少,解压后都不会丢失图像信息!std::vector<int> compression_params2;compression_params2.push_back(cv::IMWRITE_PNG_COMPRESSION);compression_params2.push_back(9);  // 压缩等级// 保存为png图像,当参数compression_params2为空时,默认压缩等级为3std::string output_path2 = "output_saved.png";cv::imwrite(output_path2, img, compression_params2);return 0;
}

http://www.xdnf.cn/news/15105.html

相关文章:

  • 《数据库》MySQL备份回复
  • AI加持的开源知识库新秀:PandaWiki,如何用它打造智能化文档系统?
  • 新作品:吃啥好呢 - 个性化美食推荐
  • [面试] 手写题-爬楼梯,斐波那契数列
  • 利用Claude code,只用文字版系统设计大纲,就能轻松实现系统~
  • Kafka——应该选择哪种Kafka?
  • 京东携手HarmonyOS SDK首发家电AR高精摆放功能
  • 【深度学习新浪潮】图像生成有哪些最新进展?
  • 光电耦合器在电冰箱开关电源的应用
  • pandas销售数据分析
  • Cesium实战:交互式多边形绘制与编辑功能完全指南(最终修复版)
  • 前端面试专栏-算法篇:23. 图结构与遍历算法
  • Java(7.11 设计模式学习)
  • python的社区残障人士服务系统
  • Grok 4全面解析:马斯克的多智能体AI如何颠覆技术边界
  • 格式规范公文处理助手:一键排版 标题 / 正文 / 页码一键调,Word 脚本自定义
  • 嵌入式学习笔记--MCU阶段--day03中断
  • 网安系列【16】之Weblogic和jboss漏洞
  • 二层环路避免-STP技术
  • Transformer架构:结构介绍
  • STM32F103C8T6单片机内部执行原理及启动流程详解
  • 使用Tensorflow和CNN进行猫狗图片训练的实战总结
  • 【CF】⭐Day96——2025武汉ICPC(AILF)
  • MyBatis插件机制揭秘:从拦截器开发到分页插件实战
  • 深度学习_全连接神经网络
  • 单片机基础(STM32-DAY2(GPIO))
  • 如何发现 Redis 中的 BigKey?
  • 【计算机网络】HTTP1.0 HTTP1.1 HTTP2.0 QUIC HTTP3 究极总结
  • STM32 中实现 Modbus RTU
  • OneCode AI注解框架:让传统软件15分钟升级为AI原生应用