OpenCV 图像读取与显示
一、知识点:
1、读取图像
(1)、Mat imread( const String & filename, int flags = IMREAD_COLOR_BGR );
(2)、返回值: Mat,返回读取的图像。 若读取图像失败,则返回一个空的对象,对象.empty()为true。
(3)、参数filename: String是std::string别名,要读取图像的文件名,带文件后缀。
(4)、参数flags: 用于选择读取图像的方式,即用什么颜色格式读取图像,默认IMREAD_COLOR_BGR。
IMREAD_UNCHANGED //按原样返回加载的图像
IMREAD_GRAYSCALE //将图像转换为单通道灰度图像
IMREAD_COLOR_BGR //将图像转换为3通道BGR彩色图像
IMREAD_COLOR //同IMREAD_COLOR_BGR
IMREAD_ANYDEPTH //当输入具有相应的深度时,返回16位/32位图像,否则将其转换为8位
IMREAD_ANYCOLOR //以任何可能的颜色格式读取图像
IMREAD_LOAD_GDAL //使用gdal驱动程序加载图像
IMREAD_REDUCED_GRAYSCALE_2 //将图像转换为单通道灰度图像,图像大小减小1/2
IMREAD_REDUCED_COLOR_2 //将图像转换为3通道BGR彩色图像,并将图像大小减小1/2
IMREAD_REDUCED_GRAYSCALE_4 //将图像转换为单通道灰度图像,图像大小减小1/4
IMREAD_REDUCED_COLOR_4 //将图像转换为3通道BGR彩色图像,并将图像大小减小1/4
IMREAD_REDUCED_GRAYSCALE_8 //将图像转换为单通道灰度图像,图像大小减小1/8
IMREAD_REDUCED_COLOR_8 //将图像转换为3通道BGR彩色图像,图像大小减小1/8
IMREAD_IGNORE_ORIENTATION //不要根据EXIF的方向标志旋转图像
IMREAD_COLOR_RGB //将图像转换为3通道RGB彩色图像
2、显示图像
(1)、void imshow(const String & winname, InputArray mat);
(2)、参数winname: 用于显示图像的窗口名称,自定义。
(3)、参数mat: 需要被显示的图像。
(4)、默认情况下,imshow会自动调整窗口大小,将图片按原始大小显示,但当图片尺寸超过屏幕分辨率时,会发生图片显示不全问题。
(5)、解决办法: 在imshow()之前调用namedWindow()。
3、创建窗口
(1)、void namedWindow(const String & winname, int flags = WINDOW_AUTOSIZE);
(2)、参数winname: 创建的窗口名称,自定义,用于标识窗口。 如果同名窗口已存在,则该函数不执行任何操作。
(3)、参数flags: 窗口标志,默认WINDOW_AUTOSIZE。
WINDOW_NORMAL //用户可调整窗口大小,可将全屏窗口切换到正常大小
WINDOW_AUTOSIZE //用户无法调整窗口大小,大小受显示的图像限制
WINDOW_OPENGL //支持OpenGL的窗口
WINDOW_FULLSCREEN //将窗口设为全屏
WINDOW_FREERATIO //图像尽可能地扩展,无比例限制
WINDOW_KEEPRATIO //遵守图像比例
WINDOW_GUI_EXPANDED //状态栏和工具栏
WINDOW_GUI_NORMAL //老式的时尚方式
(4)、窗口可以用作图像和轨迹条。
4、销毁窗口
(1)、void destroyAllWindows();
(2)、销毁所有打开的窗口。
5、等待按键
(1)、int waitKey(int delay = 0);
(2)、返回值: int型,返回按键代码。 若没有按键,指定时间过去,返回-1。
(3)、参数delay: 等待时间,单位毫秒ms。 默认0,表示一直等待。
二、示例代码:
#include <iostream>
#include <opencv2/opencv.hpp>int main()
{cv::Mat src = cv::imread("C:\\Users\\ml\\Desktop\\Test\\MyOpenCVTest\\images\\1.png", cv::IMREAD_UNCHANGED);if (src.empty()){std::cout << "Could not load image..." << std::endl;return -1;}cv::namedWindow("加载图像", cv::WINDOW_FREERATIO);cv::imshow("加载图像", src);//辅助作用,如果不等待,代码会继续往后执行,销毁窗口、返回,程序会一闪而过,人眼看不到图像显示。cv::waitKey(0);cv::destroyAllWindows();return 0;
}