Трансляция видеопотока с камеры
Есть кнопка и виджет qlabel для передачи изображения с камеры (выделен пунктиром).
Нужно при запуске программы передавать изображение с камеры в виджет qlabel,
а при нажатии кнопки выводить в полноэкранное отображение.
У меня пока получилось только выводить изображение на полный экран при нажатии кнопки отдельным окном, код представлен ниже.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
import cv2
class Ui_Widget(object):
def setupUi(self, Widget):
Widget.setObjectName("Widget")
Widget.setEnabled(True)
Widget.resize(500, 500)
self.video = QLabel(Widget)
self.video.setGeometry(QtCore.QRect(20, 30, 431, 201))
self.video.setObjectName("video")
self.pushButton1 = QtWidgets.QPushButton(Widget)
self.pushButton1.setGeometry(QtCore.QRect(20, 250, 91, 31))
self.pushButton1.setObjectName("pushButton1")
self.retranslateUi(Widget)
QtCore.QMetaObject.connectSlotsByName(Widget)
def retranslateUi(self, Widget):
_translate = QtCore.QCoreApplication.translate
Widget.setWindowTitle(_translate("Widget", "Widget"))
self.pushButton1.setText(_translate("Widget", "push"))
def can():
cap = cv2.VideoCapture(0)
while True:
ret, im = cap.read()
cv2.namedWindow('Res', cv2.WINDOW_KEEPRATIO)
cv2.imshow("Res", im)
cv2.resizeWindow("Res", 1920, 1080)
if cv2.waitKey(1) & 0xFF == ord('f'):
break
cv2.destroyWindow("Res")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Widget = QtWidgets.QWidget()
ui = Ui_Widget()
ui.setupUi(Widget)
Widget.show()
ui.pushButton1.clicked.connect(can)
sys.exit(app.exec_())
Ответы (2 шт):
Я не совсем понял зачем вам кнопка, а также рекомендую познакомиться с классами:
Класс QCamera предоставляет интерфейс для системных камер.
Класс QCameraViewfinder предоставляет виджет viewfinder камеры.
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__ ()
self.cameraView = QCameraViewfinder()
self.cameraView.setMinimumSize(320, 240)
self.cameraInfo = QCameraInfo.defaultCamera()
self.camera = QCamera(self.cameraInfo)
self.camera.setViewfinder(self.cameraView)
self.layout = QVBoxLayout(self)
self.layout.addWidget(self.cameraView)
if self.camera.status() != QCamera.UnavailableStatus:
self.camera.start()
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
w = Window()
w.resize(400, 300)
w.show()
sys.exit(app.exec_())
Update
просто требуется показывать в маленьком окне и при этом, чтобы была возможность выводить на полный экран, при этом выходить из полного экрана и продолжалось показываться в маленьком. Не знаю понятно ли озвучил
я представил только часть программы и именно тут нужно, чтобы при запуске программы выводить изображение в маленьком виджете, а при нажатии на кнопку новое окно на полный экран.
Ну если вам так надо, тогда нажимайте на кнопку и смотрите.
main.py
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from q1408004 import CameraView # +++ # !!!
class Ui_Widget(object):
def setupUi(self, Widget):
Widget.setObjectName("Widget")
Widget.setEnabled(True)
Widget.resize(500, 500)
# +++ -------------> vvvvvvvvvvvvvvvvvv # !!!
self.video = CameraView(Widget) # - QLabel(Widget)
self.video.setGeometry(QtCore.QRect(20, 30, 431, 201))
self.video.setObjectName("video")
self.video.setStyleSheet('background-color: #D98C00;')
self.pushButton1 = QtWidgets.QPushButton(Widget)
self.pushButton1.setGeometry(QtCore.QRect(20, 250, 91, 31))
self.pushButton1.setObjectName("pushButton1")
self.retranslateUi(Widget)
QtCore.QMetaObject.connectSlotsByName(Widget)
def retranslateUi(self, Widget):
_translate = QtCore.QCoreApplication.translate
Widget.setWindowTitle(_translate("Widget", "Widget"))
self.pushButton1.setText(_translate("Widget", "push"))
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class Window(QWidget, Ui_Widget):
def __init__(self):
super().__init__ ()
self.setupUi(self)
self.pushButton1.setCheckable(True) # +++
self.pushButton1.clicked.connect(self.can)
def can(self, status):
if status:
self.showFullScreen() # !!!
w = self.width()
h = self.height()
self.video.setMaximumSize(w, h)
self.video.setMinimumSize(w, h)
else:
self.video.setMinimumSize(431, 201)
self.video.setMaximumSize(431, 201)
self.showNormal() # !!!
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
q1408004.py
from PyQt5.Qt import *
class CameraView(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.cameraView = QCameraViewfinder()
self.cameraInfo = QCameraInfo.defaultCamera()
self.camera = QCamera(self.cameraInfo)
self.camera.setViewfinder(self.cameraView)
self.layout = QVBoxLayout(self)
self.layout.addWidget(self.cameraView)
if self.camera.status() != QCamera.UnavailableStatus:
self.camera.start()
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
w = CameraView()
w.show()
sys.exit(app.exec_())
Я нашёл ваш пример с другого ответа Трансляция веб камеры в PyQt5, приблизительно похожий на то что надо мне, немного по-другому, возможно я смогу в нём разобраться и пойму как можно сделать дополнительно кнопку на расширение окна на полный экран.
Если у вас есть возможность подсказать, как это можно сделать, я был бы вам очень признателен, потому что при использовании библиотеки
cv2у меня отображается видеопоток с камеры.
Попробуйте так:
import sys
import cv2
import numpy as np
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Ui_Widget(object):
def setupUi(self, Widget):
Widget.setObjectName("Widget")
Widget.setEnabled(True)
Widget.resize(500, 500)
self.video = QWidget(Widget)
self.video.setGeometry(QtCore.QRect(20, 30, 431, 201))
self.label_video = QLabel(Widget, alignment=Qt.AlignCenter)
self.label_video.setObjectName("label_video")
self.layout = QVBoxLayout(self.video)
self.layout.setContentsMargins(0, 0, 0, 0)
self.layout.addWidget(self.label_video)
self.pushButton1 = QtWidgets.QPushButton(Widget)
self.pushButton1.setGeometry(QtCore.QRect(20, 250, 91, 31))
self.pushButton1.setObjectName("pushButton1")
self.retranslateUi(Widget)
QtCore.QMetaObject.connectSlotsByName(Widget)
def retranslateUi(self, Widget):
_translate = QtCore.QCoreApplication.translate
Widget.setWindowTitle(_translate("Widget", "Widget"))
self.pushButton1.setText(_translate("Widget", "push"))
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class ThreadOpenCV(QThread):
changePixmap = pyqtSignal(QImage)
def __init__(self):
super().__init__()
self.w = 311
self.h = 201
def run(self):
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FPS, 24)
while True:
ret, frame = cap.read()
if ret:
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame_expanded = np.expand_dims(frame_rgb, axis=0)
rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, ch = rgbImage.shape
bytesPerLine = ch * w
convertToQtFormat = QImage(
rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)
p = convertToQtFormat.scaled(self.w, self.h, Qt.KeepAspectRatio)
self.changePixmap.emit(p)
if cv2.waitKey(1) == ord('q'):
break
self.msleep(20)
cv2.destroyAllWindows()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class Window(QWidget, Ui_Widget):
def __init__(self):
super().__init__ ()
self.setupUi(self)
self.pushButton1.setCheckable(True)
self.pushButton1.clicked.connect(self.can)
# +++
self.thread = ThreadOpenCV() # +++
self.thread.changePixmap.connect(self.setImage) # +++
self.pushButton1.click()
def can(self, status):
self.thread.start()
if not status:
self.showFullScreen() # !!!
w = self.width()
h = self.height()
self.video.setMaximumSize(w, h)
self.video.setMinimumSize(w, h)
self.thread.w = w
self.thread.h = h
else:
self.video.setMinimumSize(431, 201)
self.video.setMaximumSize(431, 201)
self.showNormal() # !!!
self.thread.w = 431
self.thread.h = 201
def setImage(self, image): # +++
self.label_video.setPixmap(QPixmap.fromImage(image)) # +++
if __name__ == "__main__":
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())



