本系列代码托管于:https://github.com/chintsan-code/opencv4-tutorials

本篇使用的项目为:image_read_show

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat src = imread("../sample/lena512color.bmp", IMREAD_GRAYSCALE);
	if (src.empty())
	{
		cout << "could not load image..." << endl;
		return -1;
	}
	namedWindow("input", WINDOW_FREERATIO);
	imshow("input", src);

	waitKey(0);
	destroyAllWindows();
	return 0;
}

imread:从文件中读取一张图像

cv::Mat cv::imread( const cv::String& filename, int flags = IMREAD_COLOR );
  • filename:文件路径
  • flag: 标识位,根据不同的标识位可以实现不同的效果,例如:
    • IMREAD_COLOR:总是将图像转换为BGR图像
    • IMREAD_GRAYSCALE:总是将图像转换为单通道灰度图像
    • IMREAD_UNCHANGED:不改变加载的图像,例如读取带有透明通道的PNG图像时应该使用这个标识位
    • IMREAD_ANYCOLOR:读取任意可能得图像格式,例如弹药读取HSL色彩模式的图像时应该使用这个标识位
    • IMREAD_ANYDEPTH:读取16-bit/32-bit深度的图像时可以使用此标识位返回对应深度的图像,如果读取其他深度的图像也使用了这个标识位,则会返回8-bit图像
    • ……
  • 返回值:Mat格式的图像

可以使用cv::Mat::empty()判断图像是否为空

namedWindow:创建一个窗口

void cv::namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
  • winname:窗口名称,该名称可以用于后续使用这个窗口的标识符
  • flags:标识位,根据不同的标识位可以实现不同的效果,例如:
    • WINDOW_AUTOSIZE:自动调整窗口大小以适应图像,无法手动更改窗口的大小
    • WINDOW_NORMAL: 自动调整窗口大小以适应图像,可以手动更改窗口的大小
    • WINDOW_FREERATIO:调整窗口大小 ,与要显示的图像的比例无关
    • WINDOW_KEEPRATIO :调整窗口大小,保持要显示的图像的比例
    • ……

当图像比较大的时候flags应该使用WINDOW_FREERATIOWINDOW_KEEPRATIO。并且flags可以使用位运算符,例如flags == WINDOW_AUTOSIZE | WINDOW_KEEPRATIO

imshow:在指定窗口中显示一张图像

void cv::imshow(const cv::String& winname, cv::InputArray mat);
  • winname:窗口名称,如果想要使用之前用namedWindow创建的串口,那么两个函数的winname应该保持一致
  • mat:要显示的图像

waitKey:阻塞等待用户键盘输入,用户按键盘任意键就会停止阻塞,继续执行直到程序正常退出

int cv::waitKey(int delay = 0);
  • delay:等待多久,单位ms,当delay为0是代表永久等待
  • 返回值:如果在delay时间段内按下了按键,则返回该按键的代码,否则返回-1

destroyAllWindows:销毁所有HighGUI 窗口

void cv::destroyAllWindows()

如果之前创建了HighGUI 窗口,在程序结束前应该使用该函数进行统一销毁