返回顶部

【Qt】Qt+Opencv实现USB摄像头实时显示图像

本文使用软件:

  • Qt;
  • opencv249;

本文使用硬件设备:

  • USB摄像头,如果目前手头上没有单独的摄像头,可以使用笔记本电脑自带的摄像头;

主要思路:多线程实现实时显示,

  • GrabFrameThread线程使用opencv提供的cv::VideoCapture类抓取相机视频流,使用QObject::moveToThread()的方式实现多线程。
  • 主线程MainWindow将抓取到的图像显示到QLabel中,通过定时器实现实时显示。

另外本程序利用QCameraInfo类查找当前系统的相机设备。

设计界面如下:

image

利用Qt的信号-槽机制将子线程获取到图像传给主线程显示。

创建线程类GrabFrameThread,继承自QObject,该线程类中实现:设置帧分辨率、打开相机,获取图像等功能,类声明如下:

class GrabFrameThread : public QObject
{
    Q_OBJECT
public:
    explicit GrabFrameThread(QObject *parent = nullptr);

    void setFrameResolution(int w, int h);
    void openCamera(int camID);
    void closeCamera();

signals:
    void signal_ErrGrabFrameThread(int errCode);  // 错误信号输出
    void signal_refreshFrame(const QImage &image);  // 更新抓取的帧
    void signal_waitCameraOpen();  // 等待相机打开
    
public slots:
    void init();
    void refreshFrame();
    
private:
    QImage cvmat_to_qimage(const cv::Mat &img);
    
private:
    int m_camId;
    cv::VideoCapture g_cap;
};

主线程类声明如下:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void closeEvent(QCloseEvent *event) override;
private slots:
    void on_action_FindCamera_triggered();

    void on_action_OpenCamera_triggered();

    void refreshFrame(const QImage &image);

    void on_pushButton_SetResolution_clicked();

private:
    void initParm();
private:
    Ui::MainWindow *ui;
    QList<QCameraInfo> m_cameraList;
    QThread *m_thread;
    GrabFrameThread *m_grabFrameThread;
    QTimer *m_timerShowFrame;
};

具体代码参考:https://files.cnblogs.com/files/Zoya-/USBCameraTest.zip?t=1683340489&download=true

显示界面:

image

posted @ 2023-05-06 10:42  Zoya23  阅读(3710)  评论(0)    收藏  举报