您的位置:首页 > 运维架构

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

2017-05-07 13:13 561 查看

配置使用OpenCV库

在上节中我们已经生成了可用于VS2015或者QT5 with MinGW开发的OpenCV库,接下来我们写一个简单的程序测试一下。

因为我电脑上装了QT而没有装VS2015,所以后续笔记的示例程序可能都是使用Qt Creator进行编码展示,不过没关系,代码是通用的,使用VS2015配置OpenCV也很简单,无非是包含头文件,配置导入库。

下面给出QT上的代码示例,使用Qt Creator新建一个不使用QT库的C++控制台程序,如下图所示:



在.pro配置文件中内容如下:

TEMPLATE = app

CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

INCLUDEPATH += \
D:/opencv/build/include

LIBS += \
-LD:/opencv/build/mingw/lib \
-lopencv_world320.dll


具体的INCLUDEPATH 头文件路径和LIBS导入库路径大家按照自己电脑上OpenCV库所在路径设置好。没有使用过QT的需要说明下的是LIBS的写法类似Linux上链接库的语法,使用-L设置link路径,使用-l设置具体库,因为Linux上导入库是使用lib开头的,.a的后缀,所以opencv_world320.dll的全名是libopencv_world320.dll.a。

下面是main.cpp的代码:

#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char *argv[]){
printf("Start our first travel of OpenCV!\n");

Mat matSrc, matGray;
matSrc = imread("opencv-logo.png", IMREAD_UNCHAN
cba8
GED);
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;
}


包含了OpenCV的头文件opencv2/opencv.hpp,即全路径是D:/opencv/build/include/opencv2/opencv.hpp,这个头文件囊括了OpenCV各模块的其它头文件,所以我们只需要包括这个头文件就可以了,如果你的不行请到上篇笔记中下载我编译生成好的。

如果配置无误,则是可以正常编译生成.exe文件的,在.exe文件所在目录放一张opencv-logo.png图片,运行exe,可以看到如下的原图和灰度图,并且将灰度图写入了opencv-logo-gray.png文件中,如果提示找不到libopencv_world320.dll的小伙伴,是因为没有将这个动态库的路径配置到PAHT中,或者你也可以将libopencv_world320.dll拷贝到当前.exe目录或者C:/Windows目录下(
这样不用每次都拷贝都对应exe目录了,但是发行release版给别人用的时候还是需要把libopencv_world320.dll也提供出去的
):



API讲解

下面简单介绍一下上面例子中用到的几个OpenCV的API函数,opencv3使用了命名空间cv,以防止和其它库名字冲突。

1、 Mat

Mat是一种存储矩阵数据的结构体,位于OpenCV的Core模块中,是OpenCV最常用的数据结构,empty方法可以判断是否为空,Mat其它方法大家可以跳转(
Qt Creator使用F2即可
)到头文件中去看。

此外InputArray、OutputArray和ogl::Texture2D构造函数都可以直接接受Mat类型。这在imshow、imwrite、cvtColor的参数中都可以发现直接将Mat作为参数传入。

2、 imread、imwrite

这两个API 位于OpenCV的imgcodec模块中,即图片的编解码模块,OpenCV支持bmp、jpeg、png、tiff、webp等多种图片格式的读写,从上节编译OpenCV的过程中我们可以发现OpenCV使用了第三方libjpeg、libpng、libtiff、libwebp等图片编解码库。

imread的第二个参数可以指定将图片解码成什么格式存储在Mat中,IMREAD_UNCHANGED表示原图,其它还有IMREAD_GRAYSCALE单通道灰度图、IMREAD_COLOR三通道BGR图,更多的大家可以自行跳转到定义处。

3、 namedWindow、destroyAllWindows、imshow、waitKey

这些API位于OpenCV的highgui模块,该模块定义了和用户进行界面交互的接口,namedWindow指定名称来创建窗口,destroyAllWindows销毁所有OpenCV库创建的窗口,此外还有一个destroyWindow可以销毁指定名称窗口。imshow将一副图片显示在对应名称窗口中,WINDOW_AUTOSIZE宏即指窗口大小随显示图片大小变化。waitKey用于等待键盘输入,它可以有一个参数指定等待多少ms,默认0代表永远等下去,如果在给定等待时间内没有键盘输入则返回-1,否则返回按键的对应值。

4、cvtColor

这个API位于OpenCV的imgproc模块,即图片处理模块。cvt是convert转换的意思,cvtColor可以将图片数据从一种表示转换为另一种表示,例如例子中的COLOR_BGR2GRAY将BGR数据转换为GRAY灰度图(
灰度图实际上是YUV数据中的Y数据
),灰度图在后面的图像分析处理中大有用处。此为还有更多中颜色表示法的转换宏可以跳转过去自己看看。

总结

怎么样,学习OpenCV并不是很难吧,相反充满了乐趣,因为你能够实时看到你变换处理后的图片效果,然后向朋友炫耀你的新发现新成果。图像算法并没有你想的那么深奥晦涩,至少基本的算法OpenCV的API都帮我们封装好了,我们要做的只是使用这些API做出酷炫的效果。Follow me一起学习下去吧。。。



(
看程序累了,就看下OpenCV制作出来的美女轮廓图吧,嗯,不许流口水...
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐