Multithreading 显示通过事件发送到Qt GUI的Opencv图像
我花了好几天的时间试图找到一个合适的方法来解决以下问题(如下所述),现在我没有更多的想法。因此,我需要更多经验丰富的开发人员的帮助: 我有一个独立于QT的类(我希望它保持这样),它在一个第二线程中生成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>
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发布事件。