OpenCV imread():读取图像文件(附带实例)
函数 imread() 用于读取图像文件(或叫作加载图像文件)。该函数声明如下:
Imread() 支持常见的图像格式,某些图像格式需要(免费提供的)第三方类库。在 Windows 操作系统下,OpenCV 的 imread() 函数支持如下类型的图像载入:
如果读取失败,通常可以用两种方式来判断:直接判断是否为 NULL,或者调用 Mat::empty() 函数,比如:
另外,imread() 的第一个参数一般是图像文件的绝对路径或相对路径。对于绝对路径,imread() 除了不支持单右斜线(\)形式外,其他斜线形式都支持,比如双右斜线(\\)形式、双左斜线(//)形式、单左斜线(/)形式等。通常相对路径更加方便,只要把图像文件放在工程目录下即可。下面来看一个例子。
【实例】多种路径读取图像文件。
1) 打开 Qt Creator,新建一个控制台工程,工程名是 test。
2) 在 IDE 中打开 main.cpp,输入如下代码:
如果在工程中运行程序,相对路径就是把图像文件放到构建目录 build-test-Desktop_Qt_5_14_2_MinGW_64_bit-Debug 下;如果是直接双击生成的可执行程序 test.exe,则要把图像文件和 test.exe 放在同一路径下。
另外,为了叙述方便,以后只说构建目录,不再把目录名称写出来,因为构建目录是可以设置的,在 Qt Creator 的左边单击“项目”,就可以在右边看到“构建目录”的设置。
注意,第 6 种命令行参数法需要打开工程属性进行设置,在 IDE 上左侧单击“项目”→“Run”,在“运行设置”页上的“Command line arguments:”的右边输入 p1.jpg,如下图所示。
再回到编辑窗口,把下面两行代码中的第一行注释掉,去掉第二行的注释:
3) 在工程配置文件 test.pro 的第一行添加 QT+=widgets,末尾添加如下代码:
另外,为了叙述简洁,以后第 3 步的这些内容不在每个范例中讲述,默认后面每个范例都会这么做,如果有变化,再单独说明。此外,后续范例都在 test 项目上实现,这样省得每次都去新建项目并做拷贝库的重复工作了。
4) 保存工程并运行,结果如下图所示:
Mat cv::imread (const String & filename, int flags = IMREAD_COLOR );参数说明如下:
- filename:表示要读取的图像文件名。
- flags:表示读取模式,可以从枚举 cv::ImreadModes 中取值,默认值是 IMREAD_COLOR,表示始终将图像转换为三通道 BGR 彩色图像。如果从指定文件加载图像成功,就返回 Mat 矩阵;如果无法读取图像(由于缺少文件、权限不正确、格式不受支持或无效),函数就返回空矩阵(Mat::data==NULL)。
Imread() 支持常见的图像格式,某些图像格式需要(免费提供的)第三方类库。在 Windows 操作系统下,OpenCV 的 imread() 函数支持如下类型的图像载入:
JPEG文件 - *.jpeg, *.jpg, *.jpe JPEG 2000文件- *.jp2 PNG图片 - *.png 便携文件格式- *.pbm, *.pgm, *.ppm Sun rasters光栅文件 - *.sr, *.ras TIFF 文件 - *.tiff, *.tif Windows位图- *.bmp,*.dib
如果读取失败,通常可以用两种方式来判断:直接判断是否为 NULL,或者调用 Mat::empty() 函数,比如:
Mat img; ... // 开始判断是否加载成功 if (img.data == NULL) puts("load failed"); // if (img.empty()) puts("load failed");值得注意的是,函数 imread() 根据内容而不是文件扩展名来确定图像的类型,比如我们把某个 BMP 文件的后缀名改为 .jpg,imread() 依然能探测到这个文件是 BMP 图像文件。
另外,imread() 的第一个参数一般是图像文件的绝对路径或相对路径。对于绝对路径,imread() 除了不支持单右斜线(\)形式外,其他斜线形式都支持,比如双右斜线(\\)形式、双左斜线(//)形式、单左斜线(/)形式等。通常相对路径更加方便,只要把图像文件放在工程目录下即可。下面来看一个例子。
【实例】多种路径读取图像文件。
1) 打开 Qt Creator,新建一个控制台工程,工程名是 test。
2) 在 IDE 中打开 main.cpp,输入如下代码:
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char* argv[]) { Mat img; // string imgpath = "D:\\我的图片\\p1.jpg"; // --1--双右斜线法,路径中含有中文 // string imgpath = "D://test//p1.jpg"; // -- 2 --双左斜线法 // string imgpath = "D:/test/p1.jpg"; // -- 3 --单左斜线法 // string imgpath = "D:/test/test2/test3/test4/p1.jpg"; // -- 4 -- 以上 3 种混合法 string imgpath = "p1.jpg"; // -- 5 --相对路径法,放在工程目录下 // string imgpath = argv[1]; // -- 6 --命令行参数法 img = imread(imgpath, 1); if (img.data == NULL) // 或 img.empty() puts("load failed"); else imshow("img", img); waitKey(0); return 0; }我们对上面 6 种路径进行了测试,任何一种 Qt 都是支持的,都可以成功读取并显示图片。较常用的是相对路径方式。
如果在工程中运行程序,相对路径就是把图像文件放到构建目录 build-test-Desktop_Qt_5_14_2_MinGW_64_bit-Debug 下;如果是直接双击生成的可执行程序 test.exe,则要把图像文件和 test.exe 放在同一路径下。
另外,为了叙述方便,以后只说构建目录,不再把目录名称写出来,因为构建目录是可以设置的,在 Qt Creator 的左边单击“项目”,就可以在右边看到“构建目录”的设置。
注意,第 6 种命令行参数法需要打开工程属性进行设置,在 IDE 上左侧单击“项目”→“Run”,在“运行设置”页上的“Command line arguments:”的右边输入 p1.jpg,如下图所示。

再回到编辑窗口,把下面两行代码中的第一行注释掉,去掉第二行的注释:
// string imgpath = "p1.jpg";// // -- 5 --相对路径法,放工程目录下 string imgpath = argv[1];// -- 6 --命令行参数法再运行工程,此时 argv[1] 的值是字符串 p1.jpg。另外,调用imread后,判断文件是否加载成功,比如调用 img.data == NULL 或 img.empty()。
3) 在工程配置文件 test.pro 的第一行添加 QT+=widgets,末尾添加如下代码:
INCLUDEPATH += D:/opencvBuild/install/include/ LIBS += -L D:/opencvBuild/install/x64/mingw/lib/libopencv_*.a再把目录 D:\opencvBuild\install\x64\mingw\bin\ 下的 libopencv_core4100.dll、libopencv_highgui4100.dll、libopencv_imgcodecs4100.dll 和 libopencv_imgproc4100.dll 四个文件复制到 test.exe 文件所在的文件夹。
另外,为了叙述简洁,以后第 3 步的这些内容不在每个范例中讲述,默认后面每个范例都会这么做,如果有变化,再单独说明。此外,后续范例都在 test 项目上实现,这样省得每次都去新建项目并做拷贝库的重复工作了。
4) 保存工程并运行,结果如下图所示:
