首页 > 编程笔记 > C++笔记 阅读:1

OpenCV imread():读取图像文件(附带实例)

函数 imread() 用于读取图像文件(或叫作加载图像文件)。该函数声明如下:
Mat cv::imread (const String & filename,  int  flags = IMREAD_COLOR );
参数说明如下:
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) 保存工程并运行,结果如下图所示:

相关文章