DrZugrik
@DrZugrik

Как вывести видеопоток с web камеры в QGraphicsView на python?

Добрый день, извините за глупый вопрос... никак не могу понять как выводить видео с web-камеры не в отдельное окно, а в QGraphicsView (или аналогичное)
Есть форма, сделанная в Qt Designer, программа написана на Python, видеопоток берется в web-камеры через opencv. Когда запускаю программу естественно запускается отдельное окно видеопотока (opencv), после нажатия Esc запускается окно формы. На форме есть QGraphicsView, как пустить видеопоток не в отдельное окно, а в него.... Пробую выводить через него стороннюю картинку - тоже ничего не получается. Подозреваю что решение очень простое, но недостаток знаний не позволяет даже правильно задать запрос в гугле... Буду признателен за любые конструктивные подсказки.
Вот мой код:
#!/usr/bin/python
# coding=utf-8

from PyQt4 import QtCore, QtGui
from Webcam import Ui_MainWindow
import sys, cv, cv2

capture = cv.CaptureFromCAM(-1)

class Web(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)

        self.graphicsView.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap("1.png")))
#вывод рисунка не работает

while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("WEB-camera", img)
    if cv.WaitKey(10) == 27:
        break
cv.DestroyWindow("WEB-camera")

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    MainApp = Web()
    MainApp.show()
    sys.exit(app.exec_())
  • Вопрос задан
  • 3140 просмотров
Пригласить эксперта
Ответы на вопрос 1
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Понятия не имею, как работает opencv. Но пару советов, которые могут помочь дам:
1) Для graphics view нужна сцена doc.qt.io/qt-5/qgraphicsscene.html. Не забудьте установить сцену в конструкторе формы.
2) На сцену можно добавлять как виджеты, так и рисунки. Например, метод addPixmap может подойти.
3) В вашем варианте img = cv.QueryFrame(capture) вероятно рисунок, какого-то типа (не знаю какого). Самый примитивный вариант -- каждый раз брать рисунок и добавлять на сцену, предварительно её очистив. Это очень грубо, и скорее всего в документации есть способы получше. По крайней мере, программа сейчас в бесконечном цикле берёт кадры через определённые промежутки времени и рисует их где-то, т.е. работает примерно так, как я и описал.
4) Вот эта строчка cv.ShowImage("WEB-camera", img) похоже создаёт окно (возможно с какими-то элементами управления). Возможно отсюда как-то можно получить окно или указать другой источник вывода... Хотя, в принципе у нас уже есть сам рисунок из пункта 3 и больше ничего особо и не надо -- запускайте в отдельном потоке и все дела.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы