您好,登錄后才能下訂單哦!
這篇文章主要介紹Python+OpenCV+pyQt5如何錄制雙目攝像頭視頻,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
依賴的包
在這里,我直接把import的包寫出來了各位可以進行對號入座,然后就能知道需要安裝哪個包啦!
import cv2 import numpy as np from PyQt5.QtWidgets import (QMainWindow, QApplication, QFileDialog) import threading import threadpool from CvPyGui import ImageCvQtContainer from CvPyGui.ui import gui
界面設計
pyqt的界面可以用designer進行構(gòu)造,這里因為是雙目攝像頭,我們構(gòu)造的界面就是這樣子的了:
其中TextLabel就是用來進行顯示圖像的,這里更新圖像的代碼如下:
class Image(QWidget): """Common base for the images""" def __init__(self, name, label): super().__init__() # Label (frame) where the original image will be located, with scaling self.frame_lbl = label def updateImage(self, opencv_rgb_image): self.cv_img_rgb = opencv_rgb_image height, width, channel = self.cv_img_rgb.shape bytesPerLine = 3 * width self.q_image = QImage(self.cv_img_rgb.data, width, height, bytesPerLine, QImage.Format_RGB888) self.frame_lbl.setPixmap(QPixmap.fromImage(self.q_image)) def saveImage(self): # Function for saving the processed image filter = "Images (*.png *.jpg)" image_path, _ = QFileDialog.getSaveFileName(self, filter=filter) cv_img_bgr = cv2.cvtColor( self.cv_img_rgb, cv2.COLOR_RGB2BGR) cv2.imwrite(image_path, cv_img_bgr)
我們也知道,視頻是一幀一幀的進行播放的。所以,我們在播放的時候?qū)嶋H上就是在更新每一幀的畫面了。
OpenCV的視頻獲取
使用OpenCV獲取視頻很簡單
cap = cv2.VideoCapture(int(text)) cap.set(6 ,cv2.VideoWriter_fourcc('M', 'J', 'P', 'G') ); cap.set(3,w); cap.set(4,h); global update1 update1 = 1 global shotmark1 ret, frame = cap.read()
這樣就能夠獲取到一幀圖像了,其中cap.set()函數(shù)用來設置相機的參數(shù),本來應該有宏定義的,但是在python里面老是報錯,直接用數(shù)字替代了,其中3就是獲取視頻的寬度像素,4是高度,這個要和攝像頭手冊上的參數(shù)一致。一般的Webcam有兩種圖像獲取格式:一種是YUV2格式這種事10bit回傳的數(shù)據(jù),理論上質(zhì)量更好,但是有個很大的問題是分辨率高的時候,幀率就會變得十分低。另一種格式是MJPEG格式,這個是使用了壓縮技術(shù)得到的視頻流。通過這個格式,手冊上說在1920x1080分辨率下都能獲得30fps的表現(xiàn),而YUV2只有5fps(后來發(fā)現(xiàn),這個就是坑爹的,信了就怪了)。cap.set(6 ,cv2.VideoWriter_fourcc(‘M', ‘J', ‘P', ‘G') );這個參數(shù)就是使用MJPEG格式來讀取攝像頭的數(shù)據(jù)。
多線程
剛才我們呢也提到了,cap.read()這個函數(shù)是獲取到了一幀圖像,但是呢。我們要的是動畫啊,要是寫個循環(huán)的話,又會吧進程卡死在循環(huán)中,照成假死的狀態(tài),所以對于圖像的繪制,一定要使用多線程技術(shù)。在這里我不僅要吐槽一下了。學了好多年計算機,講了很多串行算法和編程,一講到多線程,無非就是打印個Hello World!,根本就沒有什么實踐,理論倒是學了很多,感覺用的時候頭真的好大!
其實這里的多線程也沒有什么是吧,就是起調(diào)一下。但是要注意的是要控制線程的退出,在python這個我引入的多線程包里面,賊坑的是沒有外界控制線程退出的辦法!所以,我設置了一個全局變量,使用判斷全局變量的值來判斷是否讓子線程繼續(xù)下去。
以上是“Python+OpenCV+pyQt5如何錄制雙目攝像頭視頻”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。