2013-10-25 180 views
0

我在QGraphicsView上显示视频。我想添加一个透明的图像。我使用下面的代码在Qt中绘制视频

有一个线程“视频”从我发出处理的图像,并在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); 

主要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); 
} 

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

回答

2

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

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

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

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

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

+1

嘿非常感谢。我做了你所说的。它为图形场景创建了一些问题,所以我只是在标签上做了同样的事情,并且它工作正常。谢谢:) 如果有人来搜索类似的东西,他们可以使用此链接 http://www.idevelopsoftware.com/2008/03/use-qimage-to-create-a-composite-image-ie-一图像与 - 另一个-重叠-ON-顶级它/ – Sid411