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

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.dtcms.com/a/274969.html

相关文章:

  • OpenLLMetry 助力 LLM 应用实现可观测性
  • 1-Git安装配置与远程仓库使用
  • uniapp---入门、基本配置了解
  • springboot-2.3.3.RELEASE升级2.7.16,swagger2.9.2升级3.0.0过程
  • 猿人学js逆向比赛第一届第十九题
  • 大数据在UI前端的应用深化:用户行为数据的跨渠道整合分析
  • MinIO配置项速查表【五】
  • CentOS 安装 Redis 简明指南
  • linux中cmake编译项目
  • 深度学习14(循环神经网络)
  • Cocos游戏开发中,检测两个物体碰撞,并实现物理反弹逻辑
  • JAVA——选择结构、循环结构、随机数、嵌套循环、数组(一维、二维)
  • 亚古数据:澳大利亚公司的ABN和ACN号码是什么?
  • PyInstaller打包完整指南1
  • Java语言基础
  • 从硬件层面上限制电脑用户只能上网访问特定的网址
  • 知识就是力量——STM32(低功耗芯片方向)
  • ROS系统如何接管工业机械臂?
  • U2Fusion: A Unified UnsupervisedImage Fusion Network
  • 2025 js——面试题(7)——ajax相关
  • Linux自动化构建工具(一)
  • AI技术与大模型对比分析:发展趋势、应用场景及挑战
  • UI前端与数字孪生融合新领域:智慧环保的垃圾分类与回收系统
  • LLM场景下的强化学习【GRPO】
  • PCIE set_property问题
  • Java synchronized 锁机制深度解析与实战指南 - 银行转账案例
  • 深度学习超参数调优指南
  • Scrapy入门实战指南:从零开始打造高效爬虫系统
  • 每日算法刷题Day45 7.11:leetcode前缀和3道题,用时1h40min
  • 机器学习之线性回归(七)