0

我正在 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);

主窗口.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);
 }

问题是,如果我这样做,视频会在一段时间后变慢并崩溃。最初它确实显示了效果。有人可以建议我如何解决这个问题吗?

4

1 回答 1

2

我假设每个发送到主窗口的视频帧都会调用 ImageReceived。如果是这种情况,那么您将为每一帧创建一个新的像素图并将其添加到场景中。最终,您将耗尽内存。它会变慢,因为你不断地积累 QPixmap 对象,所以场景有越来越多的对象要处理。

此外,每次在 ImageReceived 中接收到帧时,您都会加载透明图像并从中创建一个像素图。

在构造函数中,仅将一个像素图添加到场景中并创建第二个像素图,用于合成帧和透明图像。为透明图像加载并创建另一个像素图。

在 ImageReceived 中,而不是每帧添加一个像素图。ImageReceived 应该使用 QPainter 将帧复制到合成图像上,然后在其上复制透明图像。最后,将复合像素图复制到场景中的像素图中。

不要将复合像素图添加到场景中。

于 2013-10-25T10:08:18.880 回答