在第一部分教程之后,我们建立了一个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上获取: