【发布时间】:2020-07-18 13:19:29
【问题描述】:
我正在为 OpenCV 项目开发 QT GUI,并且正在尝试在 QGraphicsView 上显示 Mat 类型的处理框架。我正在使用一个工作类来处理相机捕获的每一帧,然后将该类部署在与主窗口进程分开的线程中。系统工作得到保护,但在控制台中,它在处理相机的帧时给了我这个错误:QObject::killTimer: 计时器不能从另一个线程停止。
下面是关于worker和线程管理主窗口的代码:
ProcessingFrameWorker.hpp
public:
ProcessingImageWorker();
ProcessingImageWorker(QGraphicsView * _showCameraFrame,
string _cameraRtsp);
void process();
Mat fameToShow;
QGraphicsView * showCameraFrame;
QGraphicsScene * scene;
QImage * imageToShow;
ProcessingFrameWorker.cpp
ProcessingImageWorker::ProcessingImageWorker(QGraphicsView * _showCameraFrame,
string _cameraRtsp)
{
showCameraFrame = _showCameraFrame;
cameraRtsp = _cameraRtsp;
isOpen = false;
scene = new QGraphicsScene(this);
showCameraFrame->setScene(new QGraphicsScene(this));
showCameraFrame->moveToThread(this->thread());
}
void ProcessingImageWorker::process() {
mainCap = VideoCapture(cameraRtsp);
if (mainCap.isOpened())
{
isOpen = true;
while (isOpen)
{
mainCap >> frameToShow;
cv::resize(frameToShow, frameToShow, cv::Size(showCameraFrame->width(), showCameraFrame->height()));
imageToShow = new QImage(frameToShow.data, frameToShow.cols, frameToShow.rows, frameToShow.step, QImage::Format_RGB888);
scene->addPixmap(QPixmap::fromImage(imageToShow));
showCameraFrame->fitInView(scene->sceneRect());
showCameraFrame->show();
}
}
}
MainWindow.cpp
QThread * processingFrameThread = new QThread();
ProcessingFrameWorker *processingFrameWorker = new ProcessingFrameWorker(ui->graphicsView, cameraRtsp);
processingFrameWorker->moveToThread(processingFrameThread);
processingFrameThread->start();
connect(processingFrameThread, SIGNAL(started()), processingFrameWorker, SLOT(process()));
我注意到,经过几次迭代,控制台消息消失了。
谢谢。
【问题讨论】:
-
除了运行
main的线程之外,您不能从任何线程读取/写入Qt GUI 元素。不支持。
标签: c++ qt opencv user-interface computer-vision