读入图片
读入图片使用imread
函数,信息如下:
参数1:filename,图片路径(绝对路径或相对路径,中文路径会报错)
参数2:flags,标志位
支持的图片格式有:
标志 | 含义 | 缩写 |
---|---|---|
IMREAD_UNCHANGED | 原样返回加载的图像(使用 Alpha 通道,否则会被裁剪)。忽略 EXIF 方向。 | -1 |
IMREAD_GRAYSCALE | 将图像转换为单通道灰度图像(编解码器内部转换)。 | 0 |
IMREAD_COLOR | 将图像转换为 3 通道 BGR 彩色图像。 | 1 |
IMREAD_ANYDEPTH | 输入具有相应的深度时返回 16 位/32 位图像,否则将其转换为 8 位。 | 2 |
IMREAD_ANYCOLOR | 以任何可能的颜色格式读取图像。 | 4 |
IMREAD_LOAD_GDAL | 使用 gdal 驱动程序加载映像。 | 8 |
IMREAD_REDUCED_GRAYSCALE_2 | 将图像转换为单通道灰度图像,并且图像尺寸减小 1/2。 | 16 |
IMREAD_REDUCED_COLOR_2 | 将图像转换为 3 通道 BGR 彩色图像,图像尺寸减小 1/2 | 17 |
IMREAD_REDUCED_GRAYSCALE_4 | 将图像转换为单通道灰度图像,并且图像尺寸减小 1/4。 | 32 |
IMREAD_REDUCED_COLOR_4 | 将图像转换为 3 通道 BGR 彩色图像,图像尺寸减小 1/4。 | 33 |
IMREAD_REDUCED_GRAYSCALE_8 | 将图像转换为单通道灰度图像,并且图像尺寸减小 1/8。 | 64 |
IMREAD_REDUCED_COLOR_8 | 将图像转换为 3 通道 BGR 彩色图像,图像尺寸减小 1/8。 | 65 |
IMREAD_IGNORE_ORIENTATION | 请勿根据 EXIF 的方向标志旋转图像。 | 128 |
常用的标志有IMREAD_GRAYSCALE(灰度图像读入)、IMREAD_COLOR(BGR彩色图像读入),可依次用数字 -1,0,1代替。
以该图片salute.png为例,保存在代码路径下
代码示例
Mat img = imread("salute.png"); // 标志位默认为彩色图片读入
显示图片
图像显示使用imshow
函数,信息如下:
参数1:winname,窗体名称
参数2:mat,显示的图像变量名
- 如果图像是 8 位无符号的,则按原样显示。
- 如果图像是 16 位无符号,则像素除以 256。也就是说,值范围 [0,255*256] 映射到 [0,255]。
- 如果图像是 32 位或 64 位浮点,则像素值将乘以 255。也就是说,值范围 [0,1] 映射到 [0,255]。
- 由于所需转换的歧义,不再处理 32 位整数图像。使用特定于图像上下文的自定义预处理转换为 8 位无符号矩阵。
该函数后应调用waitKey
函数,否则它不会显示图像。
例如,waitKey(0)
将无限显示窗口,waitKey(25)
显示一帧并等待25ms,适用于逐帧显示视频。
销毁窗口可调用destoryWindow
函数销毁指定窗口或destoryAllWindows
函数销毁所有窗口。
waitKey
函数的信息如下:
参数1:delay,延迟(以毫秒为单位)
当延迟≤0时,将会无期限地等待键盘事件。
destroyWindow
函数的信息如下:
参数1:winname,窗体名称
根据窗体名称进行销毁
代码示例:
imshow("salute",img);
waitKey();
destroyAllWindows();
保存(写入)图片
保存图片有两种方法:
- Windows系统可在
imshow
函数显示的窗体通过快捷键 Ctrl+C复制图片到剪贴板,Ctrl+S保存图片。 - 使用
imwrite
函数
imwrite
函数信息如下:
参数1:filename,保存的文件名
参数2:img,保存的图片变量名
参数3:params ,不常使用
一般该函数只能保存8位无符号(CV_8U)单通道,或3通道(具有BGR通道顺序)图像。但是用其他编码器的情况除外,此处仍不作介绍。
代码示例:
imwrite("another_salute.png",img);
总代码如下:
#include<opencv.hpp>
using namespace cv;
int main(){
// 读入图片
Mat img = imread("salute.png");
// 保存图片
imwrite("another_salute.png",img);
// 显示图片
imshow("salute",img);
waitKey();
destroyAllWindows();
return 0;
}
运行结果如下:
异常处理
若运行代码产生如下异常信息:cv::Exception,位于内存位置0x00000处
可能是由于读入图片的路径错误,导致没有图片被读入,可将总体代码修改如下:
#include<opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(){
// 读入图片
Mat img = imread("salute.png");
// 判断是否正确读入图片
if (img.empty()){
cout<<"图片路径错误,没有图片被读入"<<endl;
return 0;
}
// 保存图片
imwrite("another_salute.png",img);
// 显示图片
imshow("salute",img);
waitKey();
destroyAllWindows();
return 0;
}