[OpenCV] -- win7下配置OpenCV的Qt开发环境 - 小众知识

[OpenCV] -- win7下配置OpenCV的Qt开发环境

2013年01月27日 14:18:05 苏内容
  标签: OpenCV/win7
阅读:7328

OpenCV包含了大量的机器视觉处理算法,虽然也提供了highgui的界面功能,但实在有限(也就是一个窗口,加一些使用像素进行绘图的方法),与用户交互相关的功能极少(比如有Trackbar),貌似连个可视化的用户接口的button也没见过,而Qt正好能弥补OpenCV在这些方面的不足:通过OpenCV完成底层算法,用Qt完成上层的应用接口,哇咔,这不是完美组合么!本文原来的初衷是想通过Qt开发来实战练练C++,现在看来是要Qt与OpenCV一起搞了。这篇文章就是安装Qt及在Qt中配置OpenCV的开发环境。

安装Qt存在的一个普遍的问题是:低版本的gcc可能无法编译高版本的Qt。我参照了博客园中的一篇博客 ,搭配使用Qt4.8.6+QtCreator2.6.1+gcc4.9.2,这些软件的下载链接依次是:

  1. qt-everywhere-opensource-src-4.8.6.tar.gz: http://download.qt-project.org/official_releases/qt/4.8/4.8.6/
  2. qt-creator-linux-x86_64-opensource-2.6.1.bin: http://download.qt-project.org/official_releases/qtcreator/2.6/2.6.1/
  3. gcc-4.9.2: http://mirror.bjtu.edu.cn/gnu/gcc/

根据自己的机器环境选择下载,我的环境是:CentOS 6.5 64bit。qt-creator仅仅是Qt开发啊的IDE环境,qt是指包含相关程序的开发库,两者是不同的。在使用Qt开发的过程中完全可以通过vi+命令行的方式搞定,一开始为了能更深入一些,我也是这样做的。但在之后的实际开发中,由于qt-creator提供语法高亮,快速定位源码等很好用的功能,推荐直接使用qt-creator这个集成开发环境。上面gcc链接的镜像是来自北交大,也可以自己选择镜像下载(我用的是学校的ftp)。

1. 更新gcc到4.9.2

进入gcc解压包所在目录,

mkdir gccout                       " 新建一个目录用于保存编译gcc生成的文件
cd gccout                          " 在gccout目录中运行所有命令
../contrib/download_prerequisites  " 安装一些依赖项
../configure --prefix=/usr/local --mandir=/usr/local/share/man --enable-checking=release --enable-languages=c,c++,java --enalbe-java-awk=gtk --disable-multilib
make -j4                           " 编译,大约半个多小时吧,看机器性能了
make install                       " 安装,很快,几十秒

按上面的--prefix配置,gcc4.9.2会安装到/usr/local目录下,系统原来会有旧版本的gcc(要安装新版gcc必须要求系统中已经含有gcc,这样才能编译gcc源码),因此还要更新gcc到刚安装的4.9.2,则

su root                            " 切换到root
cd /usr/bin/
mv gcc gcc477                      " 将旧版本的gcc软链接重命名,还可以通过gcc477使用旧版gcc
mv g++ g++477                      " 将旧版本的g++软链接重命名,还可以通过g++477使用旧版g++
ln -s /usr/local/bin/gcc gcc       " 将gcc链接为gcc4.9.2
ln -s /usr/local/bin/g++ g++

2. 编译安装Qt-4.8.6

解压缩之后,进入Qt目录,

./configure
make                                     " 编译时间很长,2个多小时吧
make install

我第一次编译中途遇到一个error,提示没有gstream,我使用yum直接就更新了,

yum install gstream*

再接着make就成功了。接着要使用Qt还要配置Qt所在的路径(即环境变量),

cd /etc/profile.d/      " 这个目录中各种环境变量
vi qt4.sh               " 新建一个环境变量配置文件

在qt4.sh中添加如下的信息,当然,Qt默认安装目录是在/usr/local/Trolltech/Qt-4.8.6,我没有改(改过的修改QTDIR变量就好了),

export QTDIR=/usr/local/Trolltech/Qt-4.8.6
export PATH=$QTDIR/bin:$PATH
export MANPATH=$QTDIR/man:$MANPAT
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

最后通过source /etc/profile使配置的环境变量生效就OK了。

3. 安装qt-creator-2.6.1

因为下载的qtcreator是bin格式文件,因此直接在shell中运行,

./qt-creator-linux-x86_64-opensource-2.6.1.bin

安装过程同Windows下一样,提示安装目录,我保留默认的opt/qtcreator。安装好后在CentOS的启动栏菜单中就能看Qt-creator了。但要让qt-creator配合Qt4.8.6使用,则还要再qt-creator中进行一些配置,执行qt-creator菜单栏Tools->Option...,配置如下图:

在qt-creator中配置Qt路径

在qt-creator中配置Qt路径

配置用于编译的gcc

配置用于编译的gcc

这时就可以使用qt-creator新建Qt工程了。然而,我们下面的例子却不打算这么做。除非你是高手,否则我们应该使用命令行而非qt-creator来进行工程规划,qt-creator仅仅是为那些为了赶时间的设计师准备的!

4. Qt与OpenCV强强联合的牛刀小试

这时我们可以写个小程序小小体验一把了,我们来写个程序实现:通过Qt弹出文件选择对话框,然后用OpenCV中的imread函数读取图片,最后通过Qt界面将图片显示出来。

其中的困难点在于Qt的图片数据类型QImage格式与OpenCV的Mat格式不一致,因此要实现转换,这通过下面的函数实现Mat到QImage的转换,打开文件对话框和显示图片的代码都在main函数中,下面是源代码:

/*
 * FileName : main.cpp
 * Author   : xiahouzuoxin @163.com
 * Version  : v1.0
 * Date     : Sun 23 Nov 2014 04:29:47 PM CST
 * Brief    : 
 * 
 * Copyright (C) MICL,USTB
 */
#include <QApplication>
#include <QWidget>
#include <QImage>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QFileDialog>

#include <cv.h>
#include <highgui.h>

using namespace cv;

static QImage Mat2QImage(Mat& image)
{
    QImage img;

    if (image.channels()==3) {
        cvtColor(image, image, CV_BGR2RGB);
        img = QImage((const unsigned char *)(image.data), image.cols, image.rows,
                image.cols*image.channels(), QImage::Format_RGB888);
    } else if (image.channels()==1) {
        img = QImage((const unsigned char *)(image.data), image.cols, image.rows,
                image.cols*image.channels(), QImage::Format_ARGB32);
    } else {
        img = QImage((const unsigned char *)(image.data), image.cols, image.rows,
                image.cols*image.channels(), QImage::Format_RGB888);
    }

    return img;
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget *wn = new QWidget;
    wn->setWindowTitle("disp image");

    QString filename = QFileDialog::getOpenFileName(0, "Open File", "", "*.jpg *.png *.bmp", 0);
    if (filename.isNull()) {
        return -1;
    }

    Mat image = imread(filename.toAscii().data(), 1);
    QImage img = Mat2QImage(image); 

    QLabel *label = new QLabel("", 0);
    label->setPixmap(QPixmap::fromImage(img));

    QPushButton *bnt = new QPushButton("Quit");
    QObject::connect(bnt, SIGNAL(clicked()), &app, SLOT(quit()));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);
    layout->addWidget(bnt);
    wn->setLayout(layout);

    wn->show();

    return app.exec();
}

关键是上面的代码直接在Qt中能编译吗?肯定不行,用脚趾头想想就知道,Qt怎么能找到cv.h这些头文件呢,又怎么能找到imread这些OpenCV中的函数呢!

因此我们要在Qt中使用OpenCV,我们必需要将OpenCV头文件的路径和imread函数的库和库路径告知Qt,如果你一直像我一样使用的是Makefile来编译OpenCV工程,那将OpenCV集成到Qt中的那真是小菜一碟了。我们先用qmake -project命令生成pro文件,.pro文件在Qt工程中起重要作用。要在Qt中使用OpenCV,我们只要修改pro文件就好了,

opencv嵌入到Qt中

opencv嵌入到Qt中

从上图知,我们在pro文件的INCLUDEPATH变量中添加了OpenCV头文件所在路径,在LIBS变量中添加了库所在路径及所使用的库(-L指定库路径,-llib指定程序中用到的lib库)。修改完pro文件保存后,这个时候再使用qmake命令编译,就可以生成Makefile文件,执行make就得到可执行文件了。我们不妨看看执行显示图片的结果。

使用Qt中的label显示lyc美图

使用Qt中的label显示lyc美图

整理一下上面编译Qt程序依次用到的命令(其实就3个),

qmake -project         " 生成pro文件,修改后执行下面的命令
qmake                  " 生成Makefile文件
make                   " gcc编译生成目标可执行文件,可执行文件名默认为当前目录名

这个例子的cpp源码及pro文件下载。Email : hahayacoder@gmail.com



 

 

 

0 编译、配置OpenCV的工程相当曲折,编译OpenCV不下5次,一开始还以为是自己的配置、编译步骤有问题,后来发现原来是自己电脑装的Qt Creator版本有点低,里面的MingW版本较低,而OpenCV下载的是最新版本,最新版本的OpenCV需要高版本的MingW。最后果断换成高版本Qt Creator,终于编译成功。

 

1 下载所需工具

(1)Qt Creator 下载地址http://qt-project.org (建议下载最新版本,因为里面带的MinGW版本较高,我最开始使用Qt 4.7.4编译OpenCV-2.4.4一直报错,后来换成Qt 5.0.1编译成功)

(2)OpenCV 下载地址http://opencv.org/(不建议下载最新版本,最新版本的编译需要高版本的MinGW,不然在执行mingw32-make命令会报错)

(3)CMake 下载地址http://www.cmake.org/cmake/resources/software.html

 

2 安装Qt Creator,过程很简单,一直下一步就OK

 

3 安装OpenCV,设置解压路径就OK

 

4 安装CMake,过程同样很简单(注意:(1)安装路径不能有中文和空格(2)勾选加入所有境变量中)

 

5 目前最新的OpenCV版本,安装之后的目录下面有源码和个版本的lib和dll,不过为避免出现问题,还是自己编译

 

6 将C:\Qt\Qt5.0.1\Tools\MinGW\bin加入系统的Path环境变量(假设Qt Creator安装在C盘)

 

7 打开CMake,使用CMake编译OpenCV。配置源码路径与生成的目标路径

(1)源码路径:要选择OpenCV安装目录下含有如下文件的文件夹

 

(2)目标路径:可以随意设置

 

8 点击Configure配置按钮。在弹出的对话框中选择MinGW makefiles,其余选项保持默认,点击Finish按钮,开始编译

 

9 CMake编译结束界面如下图,勾选生成列表中的WITH_OPENGL和WITH_QT两项,其他项最好不要改动

 

10 再次点击Configure按钮,红色消失

 

11 点击Generate按钮,生成makefile文件,成功后,底下会提示Generating done

 

12 打开cmd,进入刚才设置的目标路径(C:\OpenCV),输入mingw32-make命令开始编译

 

13 此过程较为漫长,建议关掉杀毒软件可能会快些,在我的ThinkPad T420上耗时30分钟

 

14 执行mingw32-make install,此过程大约需要1到2分钟

 

15 下面开始配置Qt Creator的OpenCV开发环境,拷贝下面三个文件夹放在同一个文件夹下(只需这三个目录,其余生成的文件和文件夹可以删除,以节省磁盘空间)

(1)OpenCV-2.4.4安装目录下的build/include目录

 

(2)CMake目标路径下,MinGW编译后的bin目录

(3)CMake目标路径下,MinGW编译后的lib目录

 

 

16 拷贝三个目录到同一目录后的结构如下图(我删除了原来的CMake目标目录中的其他目录,拷贝进来了include目录)

 

17 将bin目录添加到系统环境变量

 

18 至此Qt Creator下的OpenCV开发环境已经配置好,下面在Qt Creator下测试是否已经配置成功

 

19 打开Qt Creator,新建一个空工程,然后添加一个cpp文件,任意命名

 

20 在pro文件中添加如下OpenCV的依赖文件

INCLUDEPATH+=C:\OpenCV\include\opencv\

                    C:\OpenCV\include\opencv2\

                    C:\OpenCV\include

 

LIBS+=C:\OpenCV\lib\libopencv_calib3d244.dll.a\

        C:\OpenCV\lib\libopencv_contrib244.dll.a\

        C:\OpenCV\lib\libopencv_core244.dll.a\

        C:\OpenCV\lib\libopencv_features2d244.dll.a\

        C:\OpenCV\lib\libopencv_flann244.dll.a\

        C:\OpenCV\lib\libopencv_gpu244.dll.a\

        C:\OpenCV\lib\libopencv_highgui244.dll.a\

        C:\OpenCV\lib\libopencv_imgproc244.dll.a\

        C:\OpenCV\lib\libopencv_legacy244.dll.a\

        C:\OpenCV\lib\libopencv_ml244.dll.a\

        C:\OpenCV\lib\libopencv_objdetect244.dll.a\

        C:\OpenCV\lib\libopencv_video244.dll.a

备注:其实有种简单的做法,但是有个缺点是可能包含链接库较多

INCLUDEPATH+=C:\OpenCV\include\opencv\

                    C:\OpenCV\include\opencv2\

                    C:\OpenCV\include

LIBS+=C:\OpenCV\lib

 

21 main.cpp文件中内容如下

#include"cv.h"

#include"cxcore.h"

#include"highgui.h"

 

intmain(intargc,char*argv[])

{

    //声明IplImage指针

    IplImage*pImg;

    //载入图片

    pImg=cvLoadImage("E:/OpenCV/FirstOpenCV/home.jpg",1);

    //创建窗口

    cvNamedWindow("Image",1);

    //显示图像

    cvShowImage("Image",pImg);

    //等待按键

    cvWaitKey(0);

    //销毁窗口

    cvDestroyWindow("Image");

    //释放图像

    cvReleaseImage(&pImg);

 

    return0;

}

 

22 运行程序,按键盘上任意键可以退出

扩展阅读