因爲後面的圖像處理須要UI,OpenCV自帶也不怎麼會,MFC實在懶得學的。聽同窗說Qt不錯,就用Qt作UI了。ide
本文主要介紹三個內容:在Qt Creator中使用OpenCV二、Qt中自適應顯示圖片以及在Qt窗口中添加菜單函數
一直使用 Visual Studio做爲開發環境,OpenCV2在Visual Studio中也已經配置好了,並且Qt也有官方開發的Visual Studio的插件,因此就想着直接在Visual Studio中用OpenCV2+Qt5的。可是Qt在Visual Studio用着實在彆扭,特別是UI文件同步到VS中有必定的延遲,也就是你在UI上拖放了一個Button,可是要過一段時間VS的自動提示纔會有那個Button對象名的提示,而且改動UI後要首先編譯一次。因此,最後決定在Qt Creator中使用OpenCV2。佈局
網上看了很多Qt Creator中使用OpenCV2都是本身編譯OpenCV的源代碼生成庫文件,而後再Qt Creator中使用。我是直接使用OpenCV爲VS預先編譯好的庫文件,配置方法也很簡單,就是打開項目的pro文件,在該文件中添加以下內容:ui
INCLUDEPATH += E:/opencv/build/include\ E:/opencv/build/include/opencv2 win32:CONFIG(debug, debug|release): { LIBS += -LE:/opencv/build/x86/vc12/lib \ -lopencv_calib3d249d \ -lopencv_contrib249d \ -lopencv_core249d \ -lopencv_features2d249d \ -lopencv_flann249d \ -lopencv_gpu249d \ -lopencv_highgui249d \ -lopencv_imgproc249d \ -lopencv_legacy249d \ -lopencv_ml249d \ -lopencv_nonfree249d \ -lopencv_objdetect249d \ -lopencv_photo249d \ -lopencv_stitching249d \ -lopencv_ts249d \ -lopencv_video249d \ -lopencv_videostab249d } else:win32:CONFIG(release, debug|release): { LIBS += -LE:/opencv/build/x86/vc12/lib \ -lopencv_core249 \ -lopencv_imgproc249 \ -lopencv_highgui249 \ -lopencv_ml249 \ -lopencv_video249 \ -lopencv_features2d249 \ -lopencv_calib3d249 \ -lopencv_objdetect249 \ -lopencv_contrib249 \ -lopencv_legacy249 \ -lopencv_flann249 }
把上面文件的路徑以及版本號改爲本身機器上的便可。this
實現思路也挺簡單的,使用QLabel顯示圖片,把這個QLabel放在一個ScrollArea上面,這樣圖片過大的時候會自動的添加滾動條,最後窗體使用水平佈局,這樣ScrollArea的大小會隨着窗口的大小自動改變。下面上代碼spa
private: Ui::MainWindow *ui; QLabel *label ;
首先聲明一個QLabel用於圖片(ScrollArea在設計器上拖放到窗體上,並設置窗口的佈局方式爲水平佈局)。插件
設置QLabel的pixmap,並設置QLabel的大小和圖片一致,最後將該QLabel添加到ScrollArea上。 debug
QString fileName = QFileDialog::getOpenFileName(this,"Choose Image","x:/image",("Image File(*.*)")) ; QImage image ; image.load(fileName) ; label = new QLabel(); label->setPixmap(QPixmap::fromImage(image)); label->resize(QSize(image.width(),image.height())); ui->scrollImag->setWidget(label);
效果以下:設計
圖片比較大,自動的添加了滾動條。3d
改變了窗口的大小,圖片所有顯示出來,滾動條消失。
Qt中窗體上的菜單欄對象是QMenuBar,菜單欄上能夠有多個菜單(QMenu),每一個菜單能夠下拉多個選項(QAction)。
首先須要想窗體中添加一個QMenuBar(Qt5好像是默認添加的),而後一個個菜單,並添加到QMenuBar上。
fileMenu = ui->menuBar->addMenu(tr("File")); grayLevelTransMenu = ui->menuBar->addMenu(tr("LineTransform")) ;
menuBar的addMenu的返回值是QMenu的實例,這裏添加兩個菜單:File和LineTransform
接下來要建立菜單選項也就是Action,併爲這些Action綁定上槽函數,最後將建立好的Action添加到菜單上就完成了。
private: void createMenu(); void createAction(); private: Ui::MainWindow *ui; QLabel *imageLabel ; QMenu *fileMenu ; QMenu *grayLevelTransMenu ; QAction *openImageAction ; QAction *lineTransformAction ; QAction *logTransformAction ; QAction *powerTransfromAction ; QAction *expTransformAction; QAction *grayEqualizeAction; private slots: void openImageActionSlot(); void lineTransformActionSlot(); void logTransformActionSlot(); void powerTransfromActionSlot(); void expTransformActionSlot(); void grayEqualizeSlot();
聲明須要的菜單(QMenu)和菜單選項(QAction),而且聲明好了每一個QAction所使用的槽函數。CreateMenu和CreateAction用來建立菜單和菜單選項的。
openImageAction = new QAction(tr("Open Image"),this) ; QObject::connect(openImageAction,SIGNAL(triggered()),this,SLOT(openImageActionSlot()));
建立打開圖片的菜單選項,並綁定好了槽函數,其他的菜單選項於此相似。
fileMenu = ui->menuBar->addMenu(tr("File")); fileMenu->addAction(openImageAction);
建立File菜單,並將打開圖片的菜單選項添加到其下。
最終效果: