Multithreading 显示通过事件发送到Qt GUI的Opencv图像

Multithreading 显示通过事件发送到Qt GUI的Opencv图像,multithreading,qt,opencv,c++11,Multithreading,Qt,Opencv,C++11,我花了好几天的时间试图找到一个合适的方法来解决以下问题(如下所述),现在我没有更多的想法。因此,我需要更多经验丰富的开发人员的帮助: 我有一个独立于QT的类(我希望它保持这样),它在一个第二线程中生成openCV图像。然后它引发一个传递图像的事件 while (1) { if (timerActived & this->_camReady) { vector<Mat>

我花了好几天的时间试图找到一个合适的方法来解决以下问题(如下所述),现在我没有更多的想法。因此,我需要更多经验丰富的开发人员的帮助:

我有一个独立于QT的类(我希望它保持这样),它在一个第二线程中生成openCV图像。然后它引发一个传递图像的事件

    while (1)
        {
            if (timerActived & this->_camReady)
            {
                vector<Mat>* images = new vector<Mat>;
                images = this->AcquireImg();
                __raise this->frameAcquired(images);
            }
            this_thread::sleep_for(chrono::milliseconds(_frameTimeLaps));
        }
while(1)
{
if(timeracted&this->\u camReady)
{
矢量*图像=新矢量;
images=this->AcquireImg();
__提起此->帧(图像);
}
此线程::sleep(时钟::毫秒(_frameTimeLaps));
}
这个事件被我的主窗口钩住,一个方法应该在我的GUI上显示我的图像

    void MainWindow::displayFrame(vector<Mat>* frames) {
        vector<Mat>* frames2 = new vector<Mat>();
        frames2 = frames;
        for (int i = 0; i < frames2->size(); ++i) {
            this->camFrames->at(i)->showImage(frames2->at(i));
        }
    }
void主窗口::显示帧(矢量*帧){
向量*frames2=新向量();
frames2=帧;
对于(int i=0;isize();++i){
这->摄像机框架->在(i)->显示图像(框架2->在(i));
}
}
在运行时,当主线程访问图像时,我会出现以下错误:

QCoreApplication::sendEvent中的断言失败:“无法将事件发送到其他线程拥有的对象

我知道我没有正确地使用线程,但我现在不知道如何创建异步事件

谢谢你的帮助, 瓦伦丁

编辑1:
在我看来,真正的问题是:我可以使用普通的std::thread和本机事件与主Qthread通信吗?

毕竟,这是我解决问题的解决方案

其想法是让主线程从第二个线程访问Mat。因此我修改了我的函数displayFrame,如下所示:

    void MainWindow::displayFrame(vector<Mat>* frames) {

        //QThread::
        QThread* this_thread = QThread::currentThread();
        FrameWrapper* worker = new FrameWrapper();

        worker->moveToThread(this_thread);

        QObject::connect(worker, SIGNAL(frameSent(vector<Mat>*)), this, SLOT(showImg(vector<Mat>*)));

        emit worker->frameSent(frames);
        //this->camFrames->at(0)->showImage(frame);
    }
void主窗口::显示帧(矢量*帧){
//QThread::
QThread*此线程=QThread::currentThread();
FrameWrapper*worker=新的FrameWrapper();
辅助线程->移动到线程(此线程);
QObject::connect(worker,SIGNAL(frameSent(vector*)),this,SLOT(showImg(vector*));
发射工作帧->帧发送(帧);
//此->凸轮框架->在(0)->显示图像(框架);
}

新函数showImg正在完成旧displayFrame的工作。信号/插槽进程允许根据需要从GUI线程访问图像。

OpenCV线程是否封装在QThread子类中?如果接收对象位于不同的线程上,则需要处理该事件。另外请注意,您有责任确保访问任何dat与
QEvent
关联的是以线程安全的方式完成的。感谢帮助。不,我的OpenCV线程没有包装在QThread类中,因为创建线程的类中不包括Qt。(如果可能,我想使我的控制器独立于Qt)因此,我试图使用本机C++11事件来访问主线程,我想我无法以上述相同的理由使用postEvent发布事件。