搭建Qt界面的OpenCV開發環境(轉)

原文:http://blog.csdn.net/xiahouzuoxin/article/details/41692891

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解壓包所在目錄,

<code style="margin: 0px; padding: 0.5em; font-stretch: normal; line-height: normal; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; color: rgb(51, 51, 51); border: none; display: block; background: rgb(248, 248, 255);">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                       " 安裝,很快,幾十秒</code>

按上面的--prefix配置,gcc4.9.2會安裝到/usr/local目錄下,系統原來會有舊版本的gcc(要安裝新版gcc必須要求系統中已經含有gcc,這樣才能編譯gcc源碼),因此還要更新gcc到剛安裝的4.9.2,則

<code style="margin: 0px; padding: 0.5em; font-stretch: normal; line-height: normal; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; color: rgb(51, 51, 51); border: none; display: block; background: rgb(248, 248, 255);">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++</code>

2. 編譯安裝Qt-4.8.6

解壓縮之後,進入Qt目錄,

<code style="margin: 0px; padding: 0.5em; font-stretch: normal; line-height: normal; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; color: rgb(51, 51, 51); border: none; display: block; background: rgb(248, 248, 255);">./configure
make                                     " 編譯時間很長,2個多小時吧
make install</code>

我第一次編譯中途遇到一個error,提示沒有gstream,我使用yum直接就更新了,

<code style="margin: 0px; padding: 0.5em; font-stretch: normal; line-height: normal; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; color: rgb(51, 51, 51); border: none; display: block; background: rgb(248, 248, 255);">yum install gstream*</code>

再接着make就成功了。接着要使用Qt還要配置Qt所在的路徑(即環境變量),

<code style="margin: 0px; padding: 0.5em; font-stretch: normal; line-height: normal; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; color: rgb(51, 51, 51); border: none; display: block; background: rgb(248, 248, 255);">cd /etc/profile.d/      " 這個目錄中各種環境變量
vi qt4.sh               " 新建一個環境變量配置文件</code>

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中運行,

<code style="margin: 0px; padding: 0.5em; font-stretch: normal; line-height: normal; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; color: rgb(51, 51, 51); border: none; display: block; background: rgb(248, 248, 255);">./qt-creator-linux-x86_64-opensource-2.6.1.bin</code>

安裝過程同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個),

<code style="margin: 0px; padding: 0.5em; font-stretch: normal; line-height: normal; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; color: rgb(51, 51, 51); border: none; display: block; background: rgb(248, 248, 255);">qmake -project         " 生成pro文件,修改後執行下面的命令
qmake                  " 生成Makefile文件
make                   " gcc編譯生成目標可執行文件,可執行文件名默認爲當前目錄名</code>

這個例子的cpp源碼及pro文件下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章