希望你做得很好! 我从昨天开始就如何使用opencv实现多线程视频处理程序而挣扎。多线程opencv视频处理Qt/C++
我明白线程是如何工作的,如何使用一个简单的互斥等......但是当涉及到实现时,我完全失去了。
我的目标是创建一个与Qt的接口,并显示两个标签,一个显示原始视频馈送,另一个显示处理过的一个,每个标签由一个线程处理。
现在我只是试图让线程显示图像,但我真的很难与它。
这里是我到目前为止已经完成:
CaptureThread一个类继承的QThread: 它应该处理凸轮捕获等的开始......
#ifndef CAPTURETHREAD_H
#define CAPTURETHREAD_H
#include <QThread>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/videoio.hpp"
#include <QTimer>
class CaptureThread : public QThread
{
Q_OBJECT
public:
explicit CaptureThread(QObject *parent);
protected:
void run();
signals:
void frameCaptured(cv::Mat);
public slots:
void captureFrame();
private:
QTimer* tmrTimer;
cv::VideoCapture capWebam;
cv::Mat capturedFrame;
};
#endif // CAPTURETHREAD_H
而且这是它的实现:
#include "capturethread.h"
#include <QDebug>
CaptureThread::CaptureThread(QObject* parent):QThread(parent)
{
capWebam.open(0);
}
void CaptureThread::run()
{
tmrTimer = new QTimer(this);
QObject::connect(tmrTimer, SIGNAL(timeout()), this, SLOT(captureFrame()));
tmrTimer->start(10);
exec();
}
void CaptureThread::captureFrame()
{
if(capWebam.isOpened()){
capWebam.read(capturedFrame);
emit frameCaptured(capturedFrame);
}
}
主窗口使用可显示CA梅拉饲料等...
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/videoio.hpp"
#include <capturethread.h>
#include <QTimer>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void pricessFrameAndUpdateGUI(cv::Mat matOriginal);
private slots:
void on_button_clicked();
private:
Ui::MainWindow *ui;
QImage toGrayscale(QImage image);
cv::VideoCapture capWebcam;
cv::Mat matOriginal;
cv::Mat matProcessed;
QImage qimgOriginal;
QImage qimgProcessed;
QTimer* tmrTimer;
CaptureThread* cpThread;
};
#endif // MAINWINDOW_H
而其implentation:
Starting /media/wassim/BLAZER/Workspace/CPP/build-firstCV-Desktop_Qt_5_3_GCC_64bit-Debug/firstCV...
VIDEOIO ERROR: V4L/V4L2: VIDIOC_S_CROP
QObject: Cannot create children for a parent that is in a different thread.
(Parent is CaptureThread(0xc02be0), parent's thread is QThread(0xae82c0), current thread is CaptureThread(0xc02be0)
The program has unexpectedly finished.
/media/wassim/BLAZER/Workspace/CPP/build-firstCV-Desktop_Qt_5_3_GCC_64bit-Debug/firstCV crashed
感谢你们的帮助:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCore>
#include <cv.h>
#include <QColor>
#include <opencv/highgui.h>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
cpThread = new CaptureThread(this);
QObject::connect(cpThread, SIGNAL(frameCaptured(cv::Mat)),this, SLOT(pricessFrameAndUpdateGUI(cv::Mat)));
cpThread->start();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::pricessFrameAndUpdateGUI(cv::Mat matOriginal)
{
cv::Canny(matOriginal, matProcessed, 100, 300);
cv::cvtColor(matOriginal, matOriginal, CV_BGR2RGB);
QImage qimgOriginal((uchar*)matOriginal.data, matOriginal.cols, matOriginal.rows, matOriginal.step, QImage::Format_RGB888);
QImage qimgProcessed((uchar*)matProcessed.data, matProcessed.cols, matProcessed.rows, matProcessed.step,QImage::Format_Indexed8);
ui->original->setPixmap(QPixmap::fromImage(qimgOriginal));
ui->modified->setPixmap(QPixmap::fromImage(qimgProcessed));
}
编译和执行程序我得到这个错误后!
当您收到工作者线程上的新形象,对ima进行所有的处理然后将它发回主线程,如果你想多线程然后根据宽度将图像分割成托管子集IE 1280/4 = 320 px会给你4个线程来处理处理,确保所有线程都已完成在那里工作,然后重建输出框架并将其发送到主线程以供显示 – Alex
谢谢@亚历克斯! 但我以前认为,但我的主要问题,是我遇到的关于我的程序执行的错误? 你能帮我解决吗?或者你有任何线索如何解决这个问题? – IgZiStO
我相信你应该只从** main **线程执行捕获。请尝试。 – karlphillip