I
I
Ilya2015-03-14 11:08:30
Python
Ilya, 2015-03-14 11:08:30

How to display video stream from webcam in QGraphicsView in python?

Good afternoon, sorry for the stupid question... I just can't figure out how to display video from a webcam not in a separate window, but in QGraphicsView (or similar)
There is a form made in Qt Designer, the program is written in Python, the video stream is taken from the web -cameras via opencv. When I run the program, a separate window of the video stream (opencv) is naturally launched, after pressing Esc, the form window is launched. There is a QGraphicsView on the form, how to start up the video stream not in a separate window, but in it .... I try to display a third-party image through it - nothing happens either. I suspect that the solution is very simple, but the lack of knowledge does not even allow me to correctly ask the query in Google ... I would be grateful for any constructive tips.
Here is my code:

#!/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_())

Answer the question

In order to leave comments, you need to log in

1 answer(s)
V
Vitaly, 2015-03-14
@vt4a2h

Понятия не имею, как работает 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 и больше ничего особо и не надо -- запускайте в отдельном потоке и все дела.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question