在第一部分教程之后,我們建立了一個Qt Widget在GUI中顯示OpenCV圖像,接下來我們要看看如何使用它。
現在我們建立一個簡單的應用來繪制從網絡攝像頭中獲取的流媒體視頻,這是每一個OpenCV應用的基礎。
本教程需要Qt Creator和Qt的基礎知識,如果你覺得哪一步不清楚或是沒有被充分的說明,請不要猶豫,立刻通過email聯系我(原作者)。
讓我們從打開Qt Creator開始。Qt也能在其他工作環境下使用( Eclipse, Visual Studio, ...) ,但是說實話我更喜歡在原汁原味的環境下使用它,為Qt專門設計的環境能更好的利用Qt的所有特性。
首先新建一個工程,選擇 “Qt Widget Project” -> “Qt GUI Application”。
譯者注:類名QtGLWebcamDemo,基類選擇QMainWindow。
然后將第一部分教程建立的文件拷貝到工程文件夾中。
在工程中“添加現有文件”,“cqtopencvviewergl.h” 和 “cqtopencvviewergl.cpp”。
之后向我們的GUI中添加一個OpenGL-OpenCV 的部件。
- 打開界面文件
- 從左側“Containers”中拖入一個標准的Widget
- 將這個widget命名為“openCVviewer”
- 選中這個widget,之后右鍵選擇“提升為” (“Promote to”)
- 在“提升的類名稱”中輸入“CQtOpenCVViewerGl”
- 在窗體上右鍵,選擇“布局”中的“柵格布局”,使得widget布滿可用區域
基本的接口就准備好了,現在我們需要配置工程文件讓其可以使用OpenCV:
- 打開“pro”文件,添加:INCLUDEPATH += 你的OpenCV目錄 (對於Linux: INCLUDEPATH += /usr/local/opencv2/)
- 再添加 LIBS += -lopencv_core -lopencv_highgui
譯者注:如果你是按照譯者之前關於Qt&OpenCV的博客中配置的開發環境,可按如下格式修改pro文件:
INCLUDEPATH += D:\opencv_mingw\install\include
LIBS += "D:\opencv_mingw\bin\libopencv_*.dll"
現在這個程序已經准備好應用OpenCV了,我們可以開始寫代碼來顯示攝像頭的圖像了。
在窗體中的菜單欄中插入一個“Start”項:
- 選擇菜單欄,點擊“在這里輸入”,輸入“Camera”
- 選擇“Camera”,在下拉菜單中的“在這里輸入”中,輸入“Start”
在“Action Editor”欄中的“actionStart” 項上右鍵,選擇“轉到槽”->”triggered()”。
Qt Creator 會自動生成一個函數,當用戶點擊 “Camera”中的”Start”時就會調用這個函數。
在這里,我們的函數很簡單:
void QtGLWebcamDemo::on_actionStart_triggered()
{
if( !mCapture.isOpened() )
if( !mCapture.open( 0 ) )
return;
startTimer(50);
}
mCapture 是我們的GUI中的一個私有變量:
cv::VideoCapture mCapture;
要記住,為了使用VideoCapture ,必須在程序中包含OpenCV的 “HighGUI” 模塊。
#include <opencv2/highgui/highgui.hpp>
這個應用要使用定時器,我們每一個50ms獲取新的攝像頭圖像,並且將圖像傳遞給我們的OpenGL widget。
在主要的類中添加定時器函數。
protected:
void timerEvent(QTimerEvent *event);
它包含了如下的簡單代碼:
void QtGLWebcamDemo::timerEvent(QTimerEvent *event)
{
cv::Mat image;
mCapture >> image;
// Show the image
ui->openCVviewer->showImage( image );
}
這個使用了Qt、OpenCV、OpenGL來顯示攝像頭圖像的簡單應用就准備好了,你只需要編譯運行就可以看看效果了。
完整代碼可在Github上獲取:
