配置在Qt中的OpenCV,看了很多“教程”,最终成功。记一下过程。
本机配置:
window7 32位系统;
qt-opensource-windows-x86-mingw492-5.5.1;
OpenCV2.4.10。
对于我来说配置过程比较难,因为目前我没用过Qt和Cmake,之前一直用VS编译C++,也没有用过MinGW,所以看教程中的各种命令或者执行文件都比较费时。这次各种尝试后成功。参考资料的连接在最后,其中帮助我最大的就是那一篇纯英文的,很详细。
前期准备
Qt5的opensource版使用的是MinGW,并且不同于Qt4,Qt5不能在QtCreater中更改库文件为vc。而OpenCV在2.4之后就仅仅提供VS版本的库文件,位置在%OpenCV%\build\x86 或 %OpenCV%\build\x64的“vc1x”文件夹中(%OpenCV%表示OpenCV的安装目录)。
上第一个图片为opencv2.4.10中build\x86\的内容;第二个图片为opencv2.3.1中build\x86\的内容。很明显oepencv2.3.1中有一个mingw的库文件夹而opencv2.4.10就仅仅支持vc库了。因为电脑同时有这两个版本的opencv库文件,所以第一次配置我直接使用的是2.3.1版本(不需要重新编译MinGW版本库文件嘛),但是经过下面的正确配置后,测试程序一直无法通过,现象在下面会细说。
基于以上原因,所以必须要在配置Qt前将OpenCV编译成一个MinGW的库文件版本。这也是为什么这么教程里要用一个CMake软件编译OpenCV。到这里,我可以列出在Qt5中配置OpenCV前需要准备的软件:
qt-opensource-windows-x86-mingw492-5.5.1;
cmake-3.6.0-rc3-win32-x86;
opencv2.4.10。
Qt5和cmake版本是我下载的最新版本,现在时间是2016-6-28。以下的内容不会详细讲述每一步配置步骤,在必要的地方我会附上相应的资料,这些资料已经解释地十分详细。这里我着重写的是我在配置中遇到的问题。
Qt5,CMake和OpenCV的安装
安装的教程数不胜数,这里不再赘述。注意windows中的环境变量的配置。
其中在Qt5的安装中注意安装MinGW。我这里的版本是4.9.2,如下图所示。
安装完成Qt5后,注意要将Qt5的路径加入环境变量中,在后面使用CMake编译OpenCV库时,CMake会调用MinGW组件程序,即在安装Qt中勾选的MinGW程序,并且还会调用Qt本身的编译程序qmake.exe,这两个文件的路径都要在环境变量中,具体为:
%Qt5%\Tools\mingw492_32\bin
%Qt5%\5.5\mingw492_32\bin
以上%Qt5%为我的Qt安装目录,例如我的是C:\Qt\Qt5.5.1,则将其代入以上路径后等价于:
C:\Qt\Qt5.5.1\Tools\mingw492_32\bin
C:\Qt\Qt5.5.1\5.5\mingw492_32\bin
OpenCV库的编译
将OpenCV库编译成MinGW版需要使用CMake软件,别的软件是否好用我没有用过。安装时要注意勾选将CMake的路径(Path)加到环境变量中,否则当后面使用控制台(cmd或者powershell)调用CMake编译安装命令时会出现 无效命令 的提示。
注意,在安装完成后先不要直接编译OpenCV的MinGW版本,要保证Qt已经安装完成。否则会缺少必要的执行程序导致无法编译成需要的MinGW库。
打开CMake,参考这篇资料选取OpenCV源文件位置和输出文件位置,点击configure。注意,这里我没有完全按照这一篇资料,而是根据另一篇资料的教程。傻瓜式的总结一下,这里需要点击“2次configure 和 1次generate”。
我这里自己选取了C和C++编译器,具体为下图步骤点:
我选取了"Specify native compilers",并在下一步选择了编译器,因为之前直接选取“Use default native compilers”时总是出错,我猜测我的默认编译器不对。
我自己选择的编译器就是Qt中的MinGW中的gcc和g++,如上图。 选取后finish,则进入其他教程中的正常步骤,如下图。
成功后,在第二次configue前,需要有两个地方勾选或者更改,第一个是下图处:
上图选取的地方是CMake生成的configure类型,可以填入Debug和Release,这样生成的库文件就可以指出上面两种版本的编译。
另外必须要勾选下图中的 WITH_QT,以使CMake编译出可以供Qt使用的库文件(我认为就是在这里才会需要cmake去调用qt中的qmake指令)。
至此,就可以点击generate进行生成了。
我在这之后出现了错误,经过查看得知,就是因为CMake会调用qmake执行文件,而我的环境变量的第一行是 C:\Python27\Lib\site-packages\PyQt4 (这是因为前人使用这台电脑是安装了PyQt),而这个目录下有一个qmake执行文件,但这个文件不满足本次编译的要求,所以总是出错。于是我将C:\Qt\Qt5.5.1\5.5\mingw492_32\bin 和 %OpenCV_MinGW%\bin 插入到前面即可。
这之后就打开控制台软件,依次键入 mingw32-make 和 mingw32-make install ,如之前配置无误,程序就会依次开始编译和安装,下图依次为相应结果:
Qt配置
opencv的MinGW库编译好后,就可以直接在Qt中配置了。Qt的配置是靠Qt工程创建后生成的那个pro文件,通过在pro文件中配置文本即可,pro文件的编写规则和技巧可以参考这篇资料,不再赘述,下面是我的配置文件内容,使用的测试实例是Qt的控制台应用:
QT += core QT -= gui TARGET = TestQt CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp INCLUDEPATH += F:/opencv2.4.10/build/include/opencv F:/opencv2.4.10/build/include/opencv2 F:/opencv2.4.10/build/include LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libcv2.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_calib3d2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_contrib2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_nonfree2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_ocl2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_gpu2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_photo2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_objdetect2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_legacy2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_ml2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_video2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_features2d2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_highgui2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_imgproc2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_flann2410.dll.a LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_core2410.dll.a
我写的很麻烦,路径都是复制粘贴好多遍,可以使用 -L 和 -l参数进行简化。在INCLUDEPATH中的文件目录分级斜杠很有意思,我这里用的都是 / (斜杠),根据测试和查阅资料,我发现 \(反斜杠)和 \\(双反斜杠)都可以使用。使用控制台应用作为测试的原因是这样编写测试文件比较简单,并且不会过多牵扯Qt编程的相关结构和知识,测试代码也很简单,如下:
#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> using namespace cv; int main() { std::cout<<"fuck"<<std::endl; Mat img; img = imread("D:/c.jpg"); imshow("test", img); waitKey();return 0; }
测试成功截图如下:
在配置过程中,原先使用opencv2.3.1,这个库中就有mingw版的库文件,无需用source文件重新编译(这个版本的opencv很奇怪的没有source文件夹,而2.4.x之后的版本与这个版本的文件组织结构差别很大)。原以为是一个方便,但实际使用QT时发现,就算我的.pro文件配置好也不能正常运行测试程序,即显示出一张图片(之所以认为我的配置文件配置好是由于在配置完pro文件后,编写代码过程中使用include时可以索引到opencv库中的头文件)。现象是只要使用opencv的函数就不能正常运行程序,程序开头的打印字符串都没有显示,末尾的打印字符串更是不能出现。另一个现象是,当使用Mat关键字创建一个Mat类而不进行其他相关opencv()函数调用时,不会出现错误,但只要使用别的函数,例如Mat img; img = imread(...);时就会出错。编译问题没有一条,但就是不能出结果。
参考资料
http://www.laganiere.name/opencvCookbook/chap1s1_2.shtml
http://blog.163.com/allegro_tyc/blog/static/337437682014102411829281/
http://stackoverflow.com/questions/14919186/qt-creator-5-0-1-with-opencv-2-3-4-on-windows/15268560#15268560
http://blog.sina.com.cn/s/blog_7edf527e0101359b.html
http://blog.chinaunix.net/uid-23592843-id-2495471.html
http://www.cnblogs.com/bolgofzjr/p/5623032.html