在做計算機視覺項目時,經常需要打開和顯示監控視頻畫面,對畫面進行分析處理。使用OpenCV打開攝像頭顯示視頻畫面,視頻可以參看:1.3 OpenCV打開本地攝像頭并顯示視頻畫面。
本文主要實現在PyQt窗體上顯示監控視頻畫面。視頻可以參看:8.2 Python-PyQt:窗體上顯示視頻圖像
一、使用Qt Designer創建窗體窗體主要兩個元素:一個 Label 用來顯示圖像,一個Push Button 用來打開視頻頭。
窗體自适應布局,保存窗體文件:yolodet.ui,XML格式保存的。
要在Python中使用這個窗體文件,還需要把yolodet.ui文件編譯生成.py文件。在vscode中配置好PyQt後,打開ui文件的右鍵菜單,很方便把ui文件轉換成py文件。
右鍵菜單
二、實現代碼
import sys
import cv2
from PyQt5 import QtCore,QtGui,QtWidgets
from Ui_yolodet import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.btnopen.clicked.connect(self.Open)
def Open(self):
cap=cv2.VideoCapture(0)
while cap.isOpened():
ret,frame=cap.read()
#img=QtGui.QImage(frame.data,frame.shape[1],frame.shape[0],QtGui.QImage.Format_BGR888)
#重載修複圖像顯示變形問題
img = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0], frame.shape[1] * 3,QtGui.QImage.Format_BGR888)
#設置label高度和寬度
self.lblimg.setFixedSize(frame.shape[1],frame.shape[0])
self.lblimg.setPixmap(QtGui.QPixmap.fromImage(img))
self.lblimg.setScaledContents(True) #自适應大小
QtWidgets.QApplication.processEvents()
if __name__ == '__main__':
app=QtWidgets.QApplication(sys.argv)
mywin=MainWindow()
mywin.setObjectName("Yolo3 Detect")
mywin.show()
sys.exit(app.exec_())
說明:
1、正常情況,使用下面代碼來生成QImage,可以顯示正常圖像,但有時會發現圖像會扭曲變形。
img=QtGui.QImage(frame.data,frame.shape[1],frame.shape[0],QtGui.QImage.Format_BGR888)
解決辦法:改成如下代碼。原因:QImage每行是按照sizeof(int)對齊的,如果不明确指定最後一個參數,即行字節數,則圖像會歪斜。增加第三個參數:frame.shape[1] * 3,
img = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0], frame.shape[1] * 3,QtGui.QImage.Format_BGR888)
2、根據圖像的大小來設定Label的大小,以防止視頻畫面變形
#設置label高度和寬度
self.lblimg.setFixedSize(frame.shape[1],frame.shape[0])
運行效果:畫面顯示
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!