OpenCV計算機視覺開發實踐:基于Qt C++ - 商品搜索 - 京東
下載安裝Qt:https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe
下載安裝OpenCV:https://opencv.org/releases/
下載安裝CMake:Download CMake
這些軟件安裝完成完成后,我們可以開始用Qt編寫OpenCV程序了。
【例2.2】第一個Qt開發的OpenCV程序
(1)在桌面上找到Qt Creator 4.11.1 (Community),雙擊打開Qt Creator,我們準備新建一個控制臺項目,項目名是hello。在Qt Creator主界面的Projects旁點擊New按鈕,如圖2-31所示。
圖2-31
然后在出現的“新建項目”,選中“Qt Console Application”,如圖2-32所示。
圖2-32
點擊Choose按鈕,然后輸入項目名稱和創建路徑,路徑建議用全英文路徑,如圖2-33所示。
圖2-33
隨后連續點擊下一步,直到向導結束出現編輯窗口,我們可以看到一個自動生成了一個main函數了。我們來簡單修改下程序,使之既能輸出圖形對話框,又能在命令窗口中輸出字符串,代碼如下:
#include <QApplication>
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication a(argc, argv); //定義應用程序對象QString text = "helloworld"; //定義一個字符串并賦值// 創建并顯示消息對話框QMessageBox::information(nullptr, "hi", text);puts("helloworld"); //在控制臺窗口輸出字符串return a.exec(); //進入事件循環
}
QApplication是Qt應用程序中必不可少的一部分,它負責管理應用程序的生命周期,處理事件循環,設置應用的整體樣式等。QString是Qt框架中處理文本數據的核心類之一。它提供了強大的字符串處理能力,支持多種文本編碼和操作,我們定義字符串text,并通過QMessageBox::information將其在消息對話框上輸出。然后,用C函數puts在控制臺上輸出字符串helloworld。程序很簡單,沒啥好講,若學過Qt,一看便懂。
由于這個項目原本是控制臺項目,因此如果要輸出圖形消息框,還需要在項目配置文件中進行一些修改,打開hello.pro,在文件開頭添加“QT+=widgets”,如下所示:
QT+=widgets
Widgets是在Qt中創建用戶界面的主要元素。Widgets可以顯示數據和狀態信息,接收用戶輸入,并為應該組合在一起的其他小部件提供容器。QT+的意思是加上widgets模塊。如果此時運行程序,則可以出現消息對話框并可以在控制臺上輸出字符串helloworld。
(2)Qt項目能運行了,但還不是一個OpenCV程序,下面我們加上OpenCV代碼。首先要在工程配置文件中添加OpenCV庫和頭文件的路徑,在hello.pro的末尾添加代碼如下:
INCLUDEPATH += D:/opencvBuild/install/include/LIBS += -L D:/opencvBuild/install/x64/mingw/lib/libopencv_*.a
宏INCLUDEPATH用來指定頭文件所在路徑,LIBS用來指定庫文件所在路徑,兩個宏都要用一個+,并且LIBS+=右邊要用-L來指定路徑,這個寫法和gcc指定庫路徑寫法類似。
下面我們添加源代碼,在Qt Creator中打開main.cpp,輸入代碼如下:
#include <QApplication>
#include <QMessageBox>
#include <opencv2/opencv.hpp>
#include <QDebug>
#include <QDir>
#include <iostream>using namespace cv; //所有OpenCV類都在命名空間cv下
using namespace std;void f() //自定義函數,實現兩幅圖片混合
{double alpha = 0.5; double beta; double input;Mat src1, src2, dst; //創建Mat對象,Mat用于存儲圖片的矩陣類,dst用于存放混合后的圖片//提示用戶輸入第一幅圖片的權值alphaqDebug() <<"線性混合:";qDebug() << "輸入第一幅圖片的權重alpha [0.0-1.0]: ";cin >> input; //用戶輸入//如果用戶輸入值介于0和1之間,則用該輸入值作為alpha的值if (input >= 0 && input <= 1)alpha = input;QString currentPath = QDir::currentPath(); //獲取當前路徑qDebug() <<"當前路徑是:"<< currentPath;//讀取兩幅大小必須一樣的JPG圖片src1 = imread("p1.jpg");src2 = imread("sbh.jpg");if (src1.empty()) { cout << "Error loading src1" << endl; return; }if (src2.empty()) { cout << "Error loading src2" << endl; return; }beta = (1.0 - alpha);addWeighted(src1, alpha, src2, beta, 0.0, dst);//將圖1與圖2線性混合imshow("res",dst); //顯示混合后的圖片waitKey(0); //等待按鍵響應后退出,0改為5000就是5秒后自動退出
}int main(int argc, char *argv[])
{QApplication a(argc, argv); //定義應用程序對象QString text = "helloworld"; //定義一個字符串并賦值cv::Mat image = cv::imread("d:/test.jpg"); //讀取d盤上test.jpg文件if (image.empty()) { //判斷文件是否為空return -1; //為空返回-1,結束程序}std::string strTitle = text.toStdString(); //把QString字符串轉為std::string字符串namedWindow(strTitle, cv::WINDOW_AUTOSIZE); //創建一個標題是strTitle窗口imshow(strTitle, image); //在標題為strTitle的窗口中顯示圖像waitKey(0); //等待用戶按鍵destroyWindow(strTitle); //銷毀標題是strTitle的窗口// 創建并顯示消息對話框QMessageBox::information(nullptr, "hi", text);f();return a.exec();
}
上述代碼的自定義函數f功能將圖片p1.jpg和sbh.jpg兩幅圖片進行混合,它們的大小必須一樣。這兩幅圖片必須復制到D:\ex\build-hello-Desktop_Qt_5_14_2_MinGW_64_bit-Debug目錄下。其中,OpenCV庫中的API函數imread用來從文件中讀取圖片。API函數addWeighted用于將兩張相同大小、相同類型的圖片進行融合,第二個參數alpha表示第一幅圖片所占的權重,第四個參數beta表示第2個圖片所占的權重。權重越大的圖片顯示得越多,比如我們輸入alpha為0.9,則主要顯示第一幅圖片。main中的代碼比較簡單,主要是從d盤讀取一個圖片文件test.jpg,然后調用f。
(2)復制動態鏈接庫到exe文件所在文件夾。首先我們打開以下路徑來查看exe文件:
D:\ex\build-hello-Desktop_Qt_5_14_2_MinGW_64_bit-Debug\debug
?
圖2-4
這個路徑是我們程序生成的hello.exe文件所在的路徑,hello.exe是一個Windows下的可執行文件,是不是覺得很神奇,MinGW能在編譯階段加載Linux下的靜態庫(.a)文件,最終生成了Windows下的.exe文件。但hello.exe還需要加載OpenCV源碼編譯出來的動態鏈接庫后才能運行。打開目錄D:\opencvBuild\install\x64\mingw\bin\,把該目錄下的libopencv_core4100.dll、libopencv_highgui4100.dll、libopencv_imgcodecs4100.dll和libopencv_imgproc4100.dll四個文件復制到hello.exe文件所在文件夾。
(3)運行程序,在Qt Creator中點擊點擊左下角的三角運行按鈕或直接按快捷鍵Ctrl+R來運行項目。運行結果如圖2-4所示。
隨便按一個鍵盤鍵,則會顯示helloworld信息框,關閉信息框,會讓我們在控制臺窗口上輸入權值,這里我們輸入0.9,可以看到輸入第一幅圖片權重是0.9后,sbh.jpg顯示的效果就淡了很多,如圖2-5所示。
圖2-5
如圖圖片不能加載,請確認p1.jgp和sbh.jpg是否復制到以下路徑:
D:\ex\build-hello-Desktop_Qt_5_14_2_MinGW_64_bit-Debug
以及,test.jpg是否復制到d盤。在這個程序中,我們即加載了絕對路徑下的圖片文件(test.jpg),也加載了當前路徑下的圖片文件(p1.jpg和sbh.jpg)。這3個文件平時可以到工程目錄的res文件夾下找到。
至此,基于Qt Creator的OpenCV的開發環境搭建起來了。