Qt与OpenCV编程:在子线程打开摄像头用主线程显示
生活随笔
收集整理的這篇文章主要介紹了
Qt与OpenCV编程:在子线程打开摄像头用主线程显示
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前言
1.在做圖像處理開發(fā)中,比例做目標(biāo)跟蹤識別的時候,用OpenCV一直在處理攝像頭傳入的數(shù)據(jù),有時候會出現(xiàn)界面卡死或者未響應(yīng)的狀態(tài),這是因為事件循環(huán)一直等待處理函數(shù)的返回而導(dǎo)致阻塞事件循環(huán),這樣一來GUI線程所有的繪制和交互都被阻塞在事件隊列中,無法執(zhí)行重繪等事件,整個程序就失去響應(yīng)了。
2.在這種狀態(tài)下,為了保證程序的正常運(yùn)行,最好的方法是把費(fèi)時的數(shù)據(jù)處理函數(shù)放到別一個線程,處理完成之后再把結(jié)果返回給主線程。
在Qt界面中,主線程只要做界面的相關(guān)繪制就可以了。
3.在Qt里面,開多線程有幾種方法,其中一種是繼承QThread類之后重寫run函數(shù),還有一種是把繼承于QObject的類轉(zhuǎn)移到一個Thread里,后面這種是Qt官方在Qt4.8之后推薦的用法。
4.我這里使用QThread打開一個攝像頭,之后用信號把每一幀圖像傳回主線程顯示。
代碼
CameraThread.h
#ifndef CAMERATHREAD_H #define CAMERATHREAD_H #include <QThread> #include <QDebug> #include <vector> #include <QString> #include <opencv2/opencv.hpp>class CameraThread : public QThread {Q_OBJECTpublic:void stop();explicit CameraThread(QObject *parent = 0);cv::VideoCapture cv_cap;int camera_index;cv::Mat cv_src;protected:void run();private:volatile bool stopped;signals:void getImage(const cv::Mat&);public slots:};#endif // CAMERATHREAD_HCameraThread.cpp
#include "CameraThread.h"CameraThread::CameraThread(QObject *parent) :QThread(parent) {stopped = false; }void CameraThread::run() {qDebug() << "Current thread:" << QThread::currentThreadId();if (!cv_cap.isOpened()){cv_cap.open(0);}while (!stopped){cv_cap >> cv_src;if(!cv_src.data){continue;}emit getImage(cv_src);cv_src.release();}cv_cap.release(); }void CameraThread::stop() {stopped = true; }調(diào)用代碼:
Camera.cpp
總結(jié)
以上是生活随笔為你收集整理的Qt与OpenCV编程:在子线程打开摄像头用主线程显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt与OpenCV编程:在QLabel加
- 下一篇: OpenCV图像分割Grabcut算法