OpenCV学习笔记--第一个OpenCV程序:图片读写显示

配置使用库
在上节中我们已经生成了可用于或者QT5 with MinGW开发的库,接下来我们写一个简单的程序测试一下 。
因为我电脑上装了QT而没有装,所以后续笔记的示例程序可能都是使用Qt 进行编码展示,不过没关系,代码是通用的,使用配置也很简单,无非是包含头文件,配置导入库 。
下面给出QT上的代码示例,使用Qt 新建一个不使用QT库的C++控制台程序,如下图所示:

OpenCV学习笔记--第一个OpenCV程序:图片读写显示

文章插图
在.pro配置文件中内容如下:
TEMPLATE = appCONFIG += console c++11CONFIG -= app_bundleCONFIG -= qtSOURCES += main.cppINCLUDEPATH += \D:/opencv/build/includeLIBS += \-LD:/opencv/build/mingw/lib \-lopencv_world320.dll
具体的 头文件路径和LIBS导入库路径大家按照自己电脑上库所在路径设置好 。没有使用过QT的需要说明下的是LIBS的写法类似Linux上链接库的语法,使用-L设置link路径,使用-l设置具体库,因为Linux上导入库是使用lib开头的,.a的后缀,所以.dll的全名是.dll.a 。
下面是main.cpp的代码:
#include #include using namespace cv;int main(int argc, char *argv[]){printf("Start our first travel of OpenCV!\n");Mat matSrc, matGray;matSrc = http://www.kingceram.com/post/imread("opencv-logo.png", IMREAD_UNCHANGED);if (matSrc.empty()){printf("imread failed \n");return -1;}namedWindow("src", WINDOW_AUTOSIZE);imshow("src", matSrc);cvtColor(matSrc, matGray, COLOR_BGR2GRAY);namedWindow("gray", WINDOW_AUTOSIZE);imshow("gray", matGray);imwrite("opencv-logo-gray.png", matGray);waitKey();destroyAllWindows();return 0;}
包含了的头文件/.hpp,即全路径是D://build///.hpp,这个头文件囊括了各模块的其它头文件,所以我们只需要包括这个头文件就可以了,如果你的不行请到上篇笔记中下载我编译生成好的 。
如果配置无误,则是可以正常编译生成.exe文件的,在.exe文件所在目录放一张-logo.png图片,运行exe,可以看到如下的原图和灰度图,并且将灰度图写入了-logo-gray.png文件中,如果提示找不到.dll的小伙伴,是因为没有将这个动态库的路径配置到PAHT中,或者你也可以将.dll拷贝到当前.exe目录或者C:/目录下(这样不用每次都拷贝都对应exe目录了,但是发行版给别人用的时候还是需要把.dll也提供出去的):
OpenCV学习笔记--第一个OpenCV程序:图片读写显示

文章插图
API讲解
下面简单介绍一下上面例子中用到的几个的API函数,使用了命名空间cv,以防止和其它库名字冲突 。
1、 Mat
Mat是一种存储矩阵数据的结构体,位于的Core模块中,是最常用的数据结构,empty方法可以判断是否为空,Mat其它方法大家可以跳转(Qt 使用F2即可)到头文件中去看 。
此外、和ogl::构造函数都可以直接接受Mat类型 。这在、、的参数中都可以发现直接将Mat作为参数传入 。
2、 、
这两个API 位于的模块中,即图片的编解码模块,支持bmp、jpeg、png、tiff、webp等多种图片格式的读写,从上节编译的过程中我们可以发现使用了第三方、、、等图片编解码库 。
的第二个参数可以指定将图片解码成什么格式存储在Mat中,表示原图,其它还有单通道灰度图、三通道BGR图,更多的大家可以自行跳转到定义处 。
3、 、、、
这些API位于的模块,该模块定义了和用户进行界面交互的接口,指定名称来创建窗口,销毁所有库创建的窗口,此外还有一个可以销毁指定名称窗口 。将一副图片显示在对应名称窗口中,宏即指窗口大小随显示图片大小变化 。用于等待键盘输入,它可以有一个参数指定等待多少ms,默认0代表永远等下去,如果在给定等待时间内没有键盘输入则返回-1,否则返回按键的对应值 。