【Qt】Qt+Opencv实现USB摄像头实时显示图像
本文使用软件:
- Qt;
- opencv249;
本文使用硬件设备:
- USB摄像头,如果目前手头上没有单独的摄像头,可以使用笔记本电脑自带的摄像头;
主要思路:多线程实现实时显示,
- GrabFrameThread线程使用opencv提供的
cv::VideoCapture类抓取相机视频流,使用QObject::moveToThread()的方式实现多线程。 - 主线程MainWindow将抓取到的图像显示到QLabel中,通过定时器实现实时显示。
另外本程序利用QCameraInfo类查找当前系统的相机设备。
设计界面如下:

利用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
显示界面:


浙公网安备 33010602011771号