Python+PyQt5自制監(jiān)控小工具
本篇文章通過使用python實現(xiàn)對計算機(jī)攝像頭的調(diào)用從而實現(xiàn)攝像監(jiān)控的功能。
利用opencv的圖像處理功能可以輕松對計算機(jī)攝像頭的調(diào)用實現(xiàn)實時圖像的采集效果。
最終將圖片進(jìn)行保存后生成監(jiān)控的歷史視頻記錄。
pip?install?PyQt5 pip?install?python-opencv
若是沒有安裝相關(guān)的模塊,可以選擇上述pip的方式進(jìn)行安裝。
接下來我們將需要的python模塊導(dǎo)入到代碼塊中。
#?It's?just?an?alias?for?the?cv2?module. import?cv2?as?cv_ #?It's?importing?all?the?classes?from?the?QtGui?module. from?PyQt5.QtGui?import?* #?It's?importing?all?the?classes?from?the?QtCore?module. from?PyQt5.QtCore?import?* #?It's?importing?all?the?classes?from?the?QtWidgets?module. from?PyQt5.QtWidgets?import?* #?It's?importing?the?sys?module. import?sys #?It's?importing?the?os?module. import?os #?It's?importing?the?time?module. import?time #?It's?importing?the?traceback?module. import?traceback
創(chuàng)建名稱為CameraUI的python類,開發(fā)監(jiān)控工具相關(guān)的頁面組件及布局。
將控件按鈕等對應(yīng)的槽函數(shù)也放到該類中。
class?CameraUI(QWidget): ????def?__init__(self): ????????super(CameraUI,?self).__init__() ????????self.init_ui() ????def?init_ui(self): ????????self.setWindowTitle('本地監(jiān)控工具?公眾號:Python 集中營') ????????self.setWindowIcon(QIcon('ico.png')) ????????self.resize(600,?400) ????????self.label_view?=?QLabel() ????????self.image_path?=?QLineEdit() ????????self.image_path.setReadOnly(True) ????????self.image_path.setPlaceholderText('視頻流圖片保存地址') ????????self.image_path_btn?=?QPushButton() ????????self.image_path_btn.setText('打開') ????????self.image_path_btn.clicked.connect(self.image_path_btn_clk) ????????self.video_path?=?QLineEdit() ????????self.video_path.setReadOnly(True) ????????self.video_path.setPlaceholderText('監(jiān)控視頻保存地址') ????????self.video_path_btn?=?QPushButton() ????????self.video_path_btn.setText('打開') ????????self.video_path_btn.clicked.connect(self.video_path_btn_clk) ????????self.start_listen_btn?=?QPushButton() ????????self.start_listen_btn.setText('開啟監(jiān)控') ????????self.start_listen_btn.clicked.connect(self.start_listen_btn_clk) ????????self.brower?=?QTextBrowser() ????????self.brower.setReadOnly(True) ????????self.brower.setFont(QFont('宋體',?8)) ????????self.brower.setPlaceholderText('日志處理過程區(qū)域...') ????????self.brower.ensureCursorVisible() ????????hbox?=?QHBoxLayout() ????????vbox_left?=?QVBoxLayout() ????????vbox_right?=?QVBoxLayout() ????????vbox_left.addWidget(self.label_view) ????????vbox_right_grid1?=?QGridLayout() ????????vbox_right_grid1.addWidget(self.image_path,?0,?0,?1,?2) ????????vbox_right_grid1.addWidget(self.image_path_btn,?0,?2,?1,?1) ????????vbox_right_grid1.addWidget(self.video_path,?1,?0,?1,?2) ????????vbox_right_grid1.addWidget(self.video_path_btn,?1,?2,?1,?1) ????????vbox_right_grid2?=?QGridLayout() ????????vbox_right_grid2.addWidget(self.brower,?0,?0,?1,?3) ????????vbox_right_grid2.addWidget(self.start_listen_btn,?1,?0,?1,?3) ????????vbox_right.addLayout(vbox_right_grid1) ????????vbox_right.addLayout(vbox_right_grid2) ????????hbox.addLayout(vbox_left) ????????hbox.addLayout(vbox_right) ????????self.listen_thread?=?ListenWorkThread(self) ????????self.listen_thread.message.connect(self.show_message) ????????self.listen_thread.finished.connect(lambda:?self.start_listen_btn.setEnabled(True)) ????????self.setLayout(hbox) ????def?show_message(self,?text): ????????cursor?=?self.brower.textCursor() ????????cursor.movePosition(QTextCursor.End) ????????self.brower.append(text) ????????self.brower.setTextCursor(cursor) ????????self.brower.ensureCursorVisible() ????def?image_path_btn_clk(self): ????????dir?=?QFileDialog.getExistingDirectory(self,?"選擇文件夾",?os.getcwd()) ????????self.image_path.setText(dir) ????def?video_path_btn_clk(self): ????????dir?=?QFileDialog.getExistingDirectory(self,?"選擇文件夾",?os.getcwd()) ????????self.video_path.setText(dir) ????def?start_listen_btn_clk(self): ????????self.listen_thread.start()
開發(fā)一個ListenWorkThread類并且繼承自QThread的子線程。
將該線程作為業(yè)務(wù)類實現(xiàn)調(diào)用本地攝像頭完成監(jiān)控的效果。
class?ListenWorkThread(QThread): ????message?=?pyqtSignal(str) ????finished?=?pyqtSignal(bool) ????def?__init__(self,?parent=None): ????????super(ListenWorkThread,?self).__init__(parent) ????????self.parent?=?parent ????????self.working?=?True ????def?__del__(self): ????????self.working?=?False ????def?run(self): ????????try: ????????????image_path?=?self.parent.image_path.text() ????????????video_path?=?self.parent.video_path.text() ????????????if?image_path.strip()?==?''?or?video_path.strip()?==?'': ????????????????self.message.emit('相關(guān)路徑設(shè)置不能為空,請檢查設(shè)置!') ????????????????return ????????????self.cap?=?cv_.VideoCapture(0) ????????????self.cap.set(3,?300) ????????????self.cap.set(4,?400) ????????????if?self.cap.isOpened(): ????????????????self.message.emit('攝像頭已成功打開!') ????????????????n?=?0 ????????????????self.message.emit('正在進(jìn)行視頻 監(jiān)控中....') ????????????????start_time?=?time.clock() ????????????????while?True: ????????????????????ret,?img?=?self.cap.read() ????????????????????if?os.path.exists(os.path.join(image_path,?str(n)?+?'.jpg')): ????????????????????????os.remove(os.path.join(image_path,?str(n)?+?'.jpg')) ????????????????????self.save_image(img,?str(n),?image_path) ????????????????????time.sleep(0.1) ????????????????????pixmap_?=?QPixmap(os.path.join(image_path,?str(n)?+?'.jpg')) ????????????????????self.parent.label_view.setPixmap(pixmap_) ????????????????????n?=?n?+?1 ????????????self.finished.emit(True) ????????except?Exception?as?e: ????????????traceback.print_exc() ????????????self.message.emit('程序運(yùn)行錯誤,請檢查參數(shù)是否設(shè)置正確!') ????????????self.finished.emit(True) ????def?save_image(self,?image=None,?file_name=None,?image_path=None): ????????if?image?is?not?None: ????????????cv_.imwrite(os.path.join(image_path,?file_name?+?'.jpg'),?image)
以上整個業(yè)務(wù)子線程的邏輯就開發(fā)完成了,然后使用python模塊的main函數(shù)調(diào)用。
將整個程序的運(yùn)行加入到主體循環(huán)當(dāng)中。
if?__name__?==?'__main__': ????app?=?QApplication(sys.argv) ????main?=?CameraUI() ????main.show() ????sys.exit(app.exec_())
到此這篇關(guān)于Python+PyQt5自制監(jiān)控小工具的文章就介紹到這了,更多相關(guān)Python PyQt5監(jiān)控內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python xlwt如何設(shè)置單元格的自定義背景顏色
這篇文章主要介紹了python xlwt如何設(shè)置單元格的自定義背景顏色,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09python正則表達(dá)式中匹配次數(shù)與貪心問題詳解(+??*)
正則表達(dá)式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配,下面這篇文章主要給大家介紹了關(guān)于python正則表達(dá)式中匹配次數(shù)與貪心問題(+??*)的相關(guān)資料,需要的朋友可以參考下2022-10-10Python編程tkinter庫Canvas實現(xiàn)涂鴉顏色表及圍棋盤示例
這篇文章主要為大家介紹了Python編程中如何使用tkinter庫Canvas來實現(xiàn)涂鴉,顏色表及圍棋盤的示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10