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

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

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

cpp 复制代码
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:显示图像窗口

cpp 复制代码
void cv::imshow(const std::string& winname, cv::InputArray mat);

参数说明:

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

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

注意事项:

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

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

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

cpp 复制代码
bool cv::imwrite(const std::string& filename, cv::InputArray img);

参数说明:

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

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

返回值:

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

四、完整示例代码

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

  1. 从文件读取图像;

  2. 显示图像;

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

cpp 复制代码
#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为空时,默认压缩质量为95
    std::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为空时,默认压缩等级为3
    std::string output_path2 = "output_saved.png";
    cv::imwrite(output_path2, img, compression_params2);

	return 0;
}
相关推荐
晨间晓1 天前
图片里的高频和低频是什么?用华为云码道开发 OpenCV 傅里叶频谱分析工具
opencv·计算机视觉·华为云
晨间晓1 天前
图片里的阴影能不能减弱?用华为云码道开发 OpenCV 光照校正工具
人工智能·opencv·华为云
晨间晓2 天前
图片里的细小噪点怎么平滑?用华为云码道开发 OpenCV 图像滤波对比工具
人工智能·opencv·华为云
偷吃米饭2 天前
图片特征怎么描述?用华为云码道开发 OpenCV ORB 特征提取工具
人工智能·opencv·华为云
晨间晓2 天前
图片里的关键点怎么找?用华为云码道开发 OpenCV FAST 特征点检测工具
人工智能·opencv·华为云
晨间晓2 天前
二值图里的噪点怎么去掉?用华为云码道开发 OpenCV 形态学操作工具
人工智能·opencv·华为云
晨间晓2 天前
图片里的角点在哪里?用华为云码道开发 OpenCV Harris 角点检测工具
人工智能·opencv·华为云
晨间晓2 天前
图片细节丰富不丰富?用华为云码道开发 OpenCV 纹理复杂度分析工具
人工智能·opencv·华为云
richard_yuu3 天前
OpenCV 实战第 15 篇:G-API 图计算,工业流水线的 CPU/GPU 混合执行
人工智能·opencv·计算机视觉
老唐7773 天前
OpenCV5实测:纯CPU跑YOLO26目标检测
图像处理·人工智能·opencv·yolo·目标检测·计算机视觉