Наложение видео с пользовательской графикой с использованием Phonon и PyQt

Я создаю инструмент визуализации данных отслеживания глаз, используя модуль PyQt4 и Phonon. По сути, у меня есть видео, которое субъект смотрел, пока отслеживались движения его глаз. Данные отслеживания взгляда представлены в виде координат x,y. Я хочу иметь возможность воспроизводить интересующее видео и накладывать на это видео круги, указывающие, куда смотрел субъект.

У кого-нибудь есть идеи? По этой ссылке: Воспроизвести видео с пользовательской оверлейной графикой кажется чтобы быть способом, поместив Phonon.VideoWidget внутри QGraphicsProxyWidget, но я не уверен в методе реализации этого предложения.

Любая помощь будет принята с благодарностью!

Мне также интересно узнать, есть ли способы добиться желаемой функциональности с помощью pyqtgraph.


person hectorcho    schedule 04.12.2017    source источник
comment
Проверьте мой ответ, и если он сработал, не забудьте отметить его как правильный, если вы не знаете, как это сделать, проверьте следующую ссылку: tour< /а>   -  person eyllanesc    schedule 04.12.2017


Ответы (1)


Поскольку вы комментируете вариант использования QGraphicsProxyWidget, вы можете создать объект этого типа или использовать addWidget:

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.phonon import Phonon

class Widget(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        lay = QVBoxLayout(self)
        vp = Phonon.VideoPlayer()
        media = Phonon.MediaSource('/path/of/video')
        vp.load(media)
        vp.play()
        scene = QGraphicsScene()
        self.view = QGraphicsView(scene, self)
        lay.addWidget(self.view)
        proxy = scene.addWidget(vp)
        # or 
        # proxy = QGraphicsProxyWidget()
        # scene.addItem(proxy)
        self.item = scene.addEllipse(QRectF(0, 0, 20, 20), QPen(Qt.red), QBrush(Qt.green))
        self.item.setParentItem(proxy)

    def mousePressEvent(self, event):
        p = self.view.mapToScene(event.pos())
        # move item
        self.item.setPos(p-QPoint(20, 20))
        QWidget.mousePressEvent(self, event)

    def resizeEvent(self, event):
        if event.oldSize().isValid():
            print(self.view.scene().sceneRect())
            self.view.fitInView(self.view.scene().sceneRect(), Qt.KeepAspectRatio)
        QWidget.resizeEvent(self, event)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

Вывод:

введите здесь описание изображения

person eyllanesc    schedule 04.12.2017
comment
Вау, большое спасибо за помощь в реализации! :) Однако, когда я запускаю этот виджет со своим видео, он не слишком хорошо воспроизводит видео. Вот результат: ссылка. И поэтому я решил попробовать второй метод в вашем коде: proxy = QGraphicsProxyWidget() scene.addItem(proxy) но это просто дает мне пустой холст без воспроизведения видео в фоновом режиме. ссылка Есть идеи, как решить эти проблемы? Большое спасибо! - person hectorcho; 04.12.2017
comment
@Hector Какое расширение у вашего видео? - person eyllanesc; 04.12.2017
comment
@Hector Вы можете поделиться видео - person eyllanesc; 04.12.2017
comment
Мое видео в формате mp4. - person hectorcho; 04.12.2017
comment
@Hector Попробуйте установить следующее: sudo apt install phonon4qt5 phonon4qt5-backend-gstreamer phonon4qt5-backend-vlc - person eyllanesc; 04.12.2017
comment
@Hector Я мог бы помочь тебе через teamviewer - person eyllanesc; 04.12.2017
comment
Это было бы круто. Как мы можем это сделать? - person hectorcho; 04.12.2017
comment
@Hector Установите teamviewer, выполнив следующие действия: community.teamviewer.com/t5/Knowledge-Base/ - person eyllanesc; 04.12.2017