一、函数介绍:
1.imread
:
imread
函数是 OpenCV 库中的一个函数,用于从指定文件中加载图像并返回它。
a.函数原型:
-
CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );
b.参数:
(1)filename
:要加载的文件的名称。
(2)flags
(可选):读取模式的标志,其值可以是 cv::ImreadModes
枚举中的一个。默认值为 IMREAD_COLOR
,表示加载彩色图像。
(3)
flags中其他参数的选择:
IMREAD_UNCHANGED
= -1:如果设置此标志,将返回原始加载的图像(包括 alpha 通道,否则 alpha 通道会被裁剪)。忽略 EXIF 方向信息。IMREAD_GRAYSCALE
= 0:如果设置此标志,总是将图像转换为单通道灰度图像(使用编解码器内部转换)。IMREAD_COLOR
= 1:如果设置此标志,总是将图像转换为3通道 BGR 彩色图像。IMREAD_ANYDEPTH
= 2:如果设置此标志,当输入图像具有相应的深度时,返回16位/32位图像,否则将其转换为8位。IMREAD_ANYCOLOR
= 4:如果设置此标志,图像将以任何可能的颜色格式读取。IMREAD_LOAD_GDAL
= 8:如果设置此标志,使用 GDAL 驱动程序加载图像。IMREAD_REDUCED_GRAYSCALE_2
= 16:如果设置此标志,总是将图像转换为单通道灰度图像,并将图像大小减少到1/2。IMREAD_REDUCED_COLOR_2
= 17:如果设置此标志,总是将图像转换为3通道 BGR彩色图像,并将图像大小减少到1/2。IMREAD_REDUCED_GRAYSCALE_4
= 32:如果设置此标志,总是将图像转换为单通道灰度图像,并将图像大小减少到1/4。IMREAD_REDUCED_COLOR_4
= 33:如果设置此标志,总是将图像转换为3通道 BGR彩色图像,并将图像大小减少到1/4。IMREAD_REDUCED_GRAYSCALE_8
= 64:如果设置此标志,总是将图像转换为单通道灰度图像,并将图像大小减少到1/8。IMREAD_REDUCED_COLOR_8
= 65:如果设置此标志,总是将图像转换为3通道 BGR彩色图像,并将图像大小减少到1/8。IMREAD_IGNORE_ORIENTATION
= 128:如果设置此标志,不要根据 EXIF 的方向标志旋转图像。
c.返回值:
- 返回一个
cv::Mat
对象,它是一个矩阵,用于存储图像数据。如果图像无法读取(例如,文件缺失、权限不当、格式不支持或无效),则返回一个空矩阵(Mat::data==NULL
)。
2.imshow:
imshow
函数是 OpenCV 库中用于在窗口中显示图像的函数 。
a.函数原型:
-
CV_EXPORTS_W void imshow(const String& winname, InputArray mat);
b.参数:
winname
:窗口的名称。如果窗口已经创建,函数将在该窗口中显示图像。mat
:要显示的图像,可以是cv::Mat
类型或其他支持的输入数组类型。
c.功能描述:
imshow
函数将图像显示在指定的窗口中。如果窗口之前已经创建,并且使用了cv::WINDOW_AUTOSIZE
标志,图像将以原始大小显示,但仍然受屏幕分辨率的限制。否则,图像将被缩放到适应窗口大小。- 函数可能会根据图像的深度进行缩放处理:
- 如果图像是8位无符号类型,它将按原样显示。
- 如果图像是16位无符号类型,像素值将被除以256。也就是说,值范围 [0, 255*256] 被映射到 [0, 255]。
- 如果图像是32位或64位浮点类型,像素值将乘以255。也就是说,值范围 [0, 1] 被映射到 [0, 255]。
- 32位整数图像不再被处理,因为所需的转换不明确。需要将其转换为8位无符号矩阵,并使用针对图像上下文的特定预处理。
- 如果在调用
imshow
之前窗口尚未创建,它将假定创建一个使用cv::WINDOW_AUTOSIZE
的窗口 - 如果你需要显示一个大于屏幕分辨率的图像,你需要在
imshow
之前调用namedWindow("", WINDOW_NORMAL)
。 - 要移除窗口,使用
cv::destroyWindow
。
二、代码示例:
#include <opencv2/core/utils/logger.hpp>//隐藏日志
#include <opencv2/highgui/highgui_c.h>
#include<opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/objdetect.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//1-OPENCV读取图片并显示
int main()
{
// 设置日志级别为不输出任何日志信息(通过隐藏日志的方式,不打印此信息)
utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);
//读取图片地址并存放在src
Mat src = imread("C:\\Users\\86173\\Desktop\\TI\\Q版阿离.png");
if (src.empty())//用于判断图像有没有正常读取到
{
printf("coule not load image...\n");//如果src.empty()为空则打印无法加载图像
return -1;//函数为int型需要一个返回值
}
//设置窗口的名字为test opencv setup
//CV_WINDOW_AUTOSIZE 表示窗口的大小将自动调整以适应显示的图像的大小。
namedWindow("test opencv setup", CV_WINDOW_AUTOSIZE);//不写也可以。
//imshow函数中可以设置窗口名字,窗口设置为默认。
imshow("test opencv setup", src);//显示图片
//显示图片,必须要加waitKey(),否则无法显示图像
//waitKey(0),无限地显示窗口,直到任何按键按下
//如果是其他数字,如waitKey(5000)表示5000毫秒,然后关闭。
waitKey(0);
destroyAllWindows();//关闭所有窗口
return 0;
}