原文: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,這些軟件的下載鏈接依次是:
- qt-everywhere-opensource-src-4.8.6.tar.gz: http://download.qt-project.org/official_releases/qt/4.8/4.8.6/
- qt-creator-linux-x86_64-opensource-2.6.1.bin: http://download.qt-project.org/official_releases/qtcreator/2.6/2.6.1/
- 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-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
文件就好了,
從上圖知,我們在pro
文件的INCLUDEPATH
變量中添加了OpenCV頭文件所在路徑,在LIBS
變量中添加了庫所在路徑及所使用的庫(-L指定庫路徑,-llib指定程序中用到的lib庫)。修改完pro
文件保存後,這個時候再使用qmake
命令編譯,就可以生成Makefile文件,執行make
就得到可執行文件了。我們不妨看看執行顯示圖片的結果。
整理一下上面編譯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文件下載。