Qt5+opencv4实现电脑摄像头采集显示

最近想试试在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();
}

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值