我正在QGraphicsView上播放视频。我想在上面添加透明图像。我使用以下代码
有一个线程“视频”,我从那里发出已处理的图像并在MainWindow中捕获它。
在头文件
中public:
video m_objVideo; //Object of class video
QGraphicsScene *m_graphicSceneCamera;
QGraphicsPixmapItem *m_pixItemCamera;
QGraphicsPixmapItem *m_pixItemVideo;
QGraphicsProxyWidget *m_proxyWidgetVideoLabel;
public slots:
void ImageRecieved(QImage);
Main Window.cpp:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
setupUi(this);
m_graphicSceneCamera = new QGraphicsScene(this);
m_objVideo.play();
connect(&m_objVideo,SIGNAL(signalProcessedImage(QImage)),this,SLOT(ImageRecieved(QImage)));
}
void MainWindow::ImageRecieved(QImage l_processedImage)
{
m_graphicSceneCamera->addPixmap(QPixmap::fromImage(l_processedImage));
m_graphicViewCamera->setScene(m_graphicSceneCamera);
QImage l_image("/root/Desktop/FICV/images for demo/transparentImage.png");
QPixmap l_pixmapImage(QPixmap::fromImage(l_image));
m_pixItemVideo = m_graphicSceneGunCamera->addPixmap(l_pixmapImage);
}
问题是,如果我这样做,视频会在某段时间后变慢并崩溃。最初它确实显示了效果。有人可以建议我如何解决这个问题吗?
答案 0 :(得分:2)
我假设正在为发送到主窗口的每帧视频调用ImageReceived。如果是这种情况,那么您将为每个帧创建一个新的像素图并将其添加到场景中。最终,你将会耗尽内存。它会因为你不断累积QPixmap对象而变慢,因此场景中有越来越多的对象需要处理。
此外,每次在ImageReceived中收到一帧时,您都会加载透明图像并创建一个像素图。
在构造函数中,只向场景添加一个像素图,并创建第二个像素图,用于合成帧和透明图像。加载并为透明图像创建另一个像素图。
在ImageReceived中,而不是每帧添加一个像素图。 ImageReceived应使用QPainter将帧复制到合成图像上,然后将透明图像复制到合成图像上。最后,将复合像素图复制到场景中的像素图。
不要将复合像素图添加到场景中。