Python+PyQt5自制監(jiān)控小工具
本篇文章通過(guò)使用python實(shí)現(xiàn)對(duì)計(jì)算機(jī)攝像頭的調(diào)用從而實(shí)現(xiàn)攝像監(jiān)控的功能。
利用opencv的圖像處理功能可以輕松對(duì)計(jì)算機(jī)攝像頭的調(diào)用實(shí)現(xiàn)實(shí)時(shí)圖像的采集效果。
最終將圖片進(jìn)行保存后生成監(jiān)控的歷史視頻記錄。

pip?install?PyQt5 pip?install?python-opencv
若是沒(méi)有安裝相關(guān)的模塊,可以選擇上述pip的方式進(jìn)行安裝。
接下來(lái)我們將需要的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è)面組件及布局。
將控件按鈕等對(duì)應(yīng)的槽函數(shù)也放到該類中。
class?CameraUI(QWidget):
????def?__init__(self):
????????super(CameraUI,?self).__init__()
????????self.init_ui()
????def?init_ui(self):
????????self.setWindowTitle('本地監(jiān)控工具?公眾號(hào):Python 集中營(yíng)')
????????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('日志處理過(guò)程區(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ā)一個(gè)ListenWorkThread類并且繼承自QThread的子線程。
將該線程作為業(yè)務(wù)類實(shí)現(xiàn)調(diào)用本地?cái)z像頭完成監(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è)置不能為空,請(qǐng)檢查設(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)行錯(cuò)誤,請(qǐng)檢查參數(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)
以上整個(gè)業(yè)務(wù)子線程的邏輯就開發(fā)完成了,然后使用python模塊的main函數(shù)調(diào)用。
將整個(gè)程序的運(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中幾種屬性訪問(wèn)的區(qū)別與用法詳解
這篇文章主要給大家介紹了關(guān)于Python中幾種屬性訪問(wèn)的區(qū)別和用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10
python中的print()函數(shù)end=' '的使用及說(shuō)明
這篇文章主要介紹了python中的print()函數(shù)end=' '的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
python繪制散點(diǎn)圖詳細(xì)步驟(從0到1必會(huì))
這篇文章主要介紹了如何使用Python繪制散點(diǎn)圖,包括導(dǎo)入包、準(zhǔn)備數(shù)據(jù)、繪制圖像、修飾圖像(添加標(biāo)題、坐標(biāo)軸標(biāo)簽、顏色圖例)以及整合所有代碼,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
使用Python向DataFrame中指定位置添加一列或多列的方法
今天小編就為大家分享一篇使用Python向DataFrame中指定位置添加一列或多列的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Python采集某網(wǎng)站文檔并保存word格式的示例
這篇文章主要介紹了Python采集某網(wǎng)站文檔并保存word格式的示例,我們平常需要下載文檔的時(shí)候,是不是發(fā)現(xiàn),要么不能下載,要么不能復(fù)制,那么我們今天來(lái)分享一下,如何用Python將這些不給下載的文檔給批量下載下來(lái),需要的朋友可以參考下2023-07-07

