最近想试试在Qt5上调用opencv库来实现摄像头的采集显示,不过要使用opencv库下载后要先进行处理,如何处理可以参考下别人的文章(过程有点小麻烦)。处理完后所得到的库可以用于给Qt5调用实现相关图像处理功能。
建立Qt工程后,要在项目文件中加入库,如下所示(参考各自存放具体路径):
INCLUDEPATH +=D:\opencv4\opencvbulid\install\include\
D:\opencv4\opencvbulid\install\include\opencv2
LIBS +=D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_calib3d400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_core400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_features2d400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_highgui400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_imgcodecs400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_imgproc400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_videoio400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_video400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_stitching400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_photo400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_objdetect400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_dnn400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_flann400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_gapi400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_ml400.dll\
D:\opencv4\opencvbulid\install\x86\mingw\bin\libopencv_ffmpeg400.dll
然后在mainwindow.h头文件中调用库及声明槽函数,具体如下所示:
#include <QMainWindow>
#include <QTimer>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#define fps 30//帧率为30
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void opencvcam();
private:
Ui::MainWindow *ui;
QTimer * timer=new QTimer(this);
};
mainwindow.c中主要设置一定时器,根据帧率设置其延时,延时到时触发槽函数,获取图像并进行一些简单处理,然后在ui界面的label控件中显示,具体如下所示。理论上还可以获取网络摄像头的图像并加以显示,如下变量url,在函数中cap.open(0,CAP_ANP)中将“0”换为url即可,但是却一直无法实现,最后是用vlc开源播放库来实现网络摄像头的播放的,小伙伴有好的主意的话也可以提示下哈。
#include <QString>
#include <QTimer>
#include <QImage>
#include <QDebug>
#include <QTime>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
static VideoCapture cap;
static Mat frame;
//static const string url="rtsp://admin:123456@192.168.1.202/stream0";//中间地址可能要根据网络摄像头的ip来修改,具体格式可参考官网
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//延时初始化
QTime reachtime=QTime::currentTime().addMSecs(300);
while(QTime::currentTime()<reachtime);
cap.open(0,CAP_ANY);
timer->setInterval(1000/fps);//根据帧率设置延时
timer->start();
connect(timer,SIGNAL(timeout()),this,SLOT(opencvcam()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::opencvcam()
{
//识别是否识别出摄像头
if(!cap.isOpened())
{
qDebug()<<"没有打开摄像头";
}
cap>>frame;
cv::flip(frame,frame,1);//使用镜像输出图片,第一个参数为输入,第二个参数为输出,最后一个参数设置模式
cvtColor(frame,frame,COLOR_BGR2RGB);//转换图像格式,实现彩色图像输出
int label_width=ui->label->width();//获取label控件宽度
int label_height=ui->label->height();//获取label控件高度
QImage img=QImage((const unsigned char *)frame.data,frame.cols,
frame.rows,frame.step,QImage::Format_RGB888);
QImage ime=img.scaled(label_width,label_height);//将图片进行缩放调整,不然效果不佳
ui->label->setPixmap(QPixmap::fromImage(ime));//转换为控件label可现显示图像的格式
ui->label->show();
}