Python+PyQt5自制监控小工具
作者:Sir 时间:2023-09-14 10:52:31
本篇文章通过使用python实现对计算机摄像头的调用从而实现摄像监控的功能。
利用opencv的图像处理功能可以轻松对计算机摄像头的调用实现实时图像的采集效果。
最终将图片进行保存后生成监控的历史视频记录。
pip install PyQt5
pip install python-opencv
若是没有安装相关的模块,可以选择上述pip的方式进行安装。
接下来我们将需要的python模块导入到代码块中。
# 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
创建名称为CameraUI的python类,开发监控工具相关的页面组件及布局。
将控件按钮等对应的槽函数也放到该类中。
class CameraUI(QWidget):
def __init__(self):
super(CameraUI, self).__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle('本地监控工具 公众号: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('监控视频保存地址')
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('开启监控')
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('日志处理过程区域...')
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()
开发一个ListenWorkThread类并且继承自QThread的子线程。
将该线程作为业务类实现调用本地摄像头完成监控的效果。
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('相关路径设置不能为空,请检查设置!')
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('正在进行视频 监控中....')
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('程序运行错误,请检查参数是否设置正确!')
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)
以上整个业务子线程的逻辑就开发完成了,然后使用python模块的main函数调用。
将整个程序的运行加入到主体循环当中。
if __name__ == '__main__':
app = QApplication(sys.argv)
main = CameraUI()
main.show()
sys.exit(app.exec_())
来源:https://mp.weixin.qq.com/s/v9wvqLCyM-kLPBS6-W7kCw
标签:Python,PyQt5,监控
0
投稿
猜你喜欢
python中随机函数random用法实例
2023-02-09 22:13:10
python爬虫框架feapder的使用简介
2021-07-20 14:38:27
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2023-09-03 23:49:13
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2022-08-24 22:34:00
python如何把嵌套列表转变成普通列表
2023-08-20 14:28:19
使用Python脚本和ADB命令实现卸载App
2023-04-11 03:59:39
在Python中操作列表之list.extend()方法的使用
2023-07-02 20:43:16
使用pycharm和pylint检查python代码规范操作
2023-06-06 08:02:38
jupyter notebook清除输出方式
2021-05-08 02:51:13
jQuery中$.ajax的实现解析
2008-07-20 13:11:00
浅谈python配置与使用OpenCV踩的一些坑
2022-10-12 07:16:26
在SQL Server 2000数据仓库中使用分区
2008-12-23 13:52:00
Python常用模块sys,os,time,random功能与用法实例分析
2023-07-16 12:50:57
CSS模块化设计
2009-01-05 12:10:00
分享十款最出色的PHP安全开发库中文详细介绍
2023-06-15 01:04:59
跨浏览器的inline-block[译]
2009-03-11 21:04:00
关于Thinkphp6的日志问题
2023-06-06 10:54:23
如何使用Python实现名片管理系统
2022-11-24 03:13:09
用Dreamweaver实现Real与网页结合
2010-07-13 12:11:00
asp如何做一个随机密码产生器?
2010-07-12 18:57:00