Qt中添加OpenCV库

  配置在Qt中的OpenCV,看了不少“教程”,最终成功。记一下过程。html

  本机配置:ios

  window7 32位系统;shell

  qt-opensource-windows-x86-mingw492-5.5.1;编程

  OpenCV2.4.10。windows

 

  对于我来讲配置过程比较难,由于目前我没用过Qt和Cmake,以前一直用VS编译C++,也没有用过MinGW,因此看教程中的各类命令或者执行文件都比较费时。此次各类尝试后成功。参考资料的链接在最后,其中帮助我最大的就是那一篇纯英文的,很详细。app

前期准备

  Qt5的opensource版使用的是MinGW,而且不一样于Qt4,Qt5不能在QtCreater中更改库文件为vc。而OpenCV在2.4以后就仅仅提供VS版本的库文件,位置在%OpenCV%\build\x86 或 %OpenCV%\build\x64的“vc1x”文件夹中(%OpenCV%表示OpenCV的安装目录)。ide

                                                                           

上第一个图片为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;ui

  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

相关文章
相关标签/搜索