为了保证宿舍财产安全,本人运用现有知识,为宿舍打造了一个监控系统。
一、系统要求:
实现循环录像,并保存在文件夹,视频录像可视化,实时显示系统信息,视频保存时间可调。
二、开发环境
开发语言:Python
开发工具:pycharm
用到的库:opencv(cv2),os,datatime,time
系统:win7 64位
三、代码实现
在F盘创建“monitor_system”文件夹,并将主程序放置于该文件夹,
自动生成与日期对应的文件夹,并存入视频,十分钟一段。
文件夹命名规则:年-月-日
视频文件命名规则:VID年月日时分秒.avi
1、导包
import datetime
import time
import cv2
import os
2、自动删除函数
用于删除旧的视频,以实现循环录制,本系统默认将视频保存3日
关键库:datetime
def auto_del():
need_clean_date = str(datetime.date.today() - datetime.timedelta(3)) # 删除数字日前的视频文件夹
if os.path.exists(need_clean_date): # 判断是否存在需删除的文件夹,有则删除
os.rmdir(need_clean_date)
3、文件命名函数
用于创视频文件夹与视频文件
关键库:time,os
def create_name():
"创建视频名字"
path = f"{datetime.date.today()}"
name = f'{datetime.date.today()}/VID20{time.strftime("%y%m%d%H%M%S")}.avi'
if not os.path.exists(path):
os.mkdir(path)
return name
4、主函数
def main():
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开摄像头
size = (640, 480) # 视频大小
fps = 30 # 帧率
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 编码
video_name = create_name() # 创建视频文件名
out = cv2.VideoWriter(video_name, fourcc, fps, size)
for i in range(7501):
ret_flag, vshow = cap.read()
if ret_flag == True:
# vshow = cv2.resize(vshow, (1024, 768))
nowtime = time.strftime("20%y-%m-%d %H:%M:%S")
cv2.putText(vshow, nowtime, (230, 450), cv2.FONT_HERSHEY_SIMPLEX, 1, (225, 0, 225), 2) # 时间水印
cv2.putText(vshow, "Dormitory", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (225, 0, 0), 2) # 宿舍名
out.write(vshow) # 写入帧
cv2.imshow("monitor", vshow) # 显示
del vshow # 释放内存
if i % 5 == 0: # 系统状态
os.system("cls") # 清屏
print(f"视频 {video_name} 正在录制")
print(f"第{i}帧录制完成")
print(f"{int(i / 75)}%已完成{'|' * int(i / 300)}")
k = cv2.waitKey(1) & 0xFF # 特殊保存键
if k == ord("q"):
break
auto_del() # 删除旧的视频
cap.release() # 释放摄像头
cv2.destroyAllWindows() # 释放窗口
五、创建死循环
本系统使用环境为无人值守,因此需要防止因系统bug,硬件错误等暂停程序
if __name__ == '__main__':
while True:
try:
main()
except:
print("系统错误")
全部代码:
"""
宿舍监控系统
作者:Y.d
qq:3010683529
欢迎加入python交流群:526461667
"""
import datetime
import time
import cv2
import os
def auto_del():
need_clean_date = str(datetime.date.today() - datetime.timedelta(3)) # 删除数字日前的视频文件夹
if os.path.exists(need_clean_date): # 判断是否存在需删除的文件夹,有则删除
os.rmdir(need_clean_date)
def create_name():
"创建视频名字"
path = f"{datetime.date.today()}"
name = f'{datetime.date.today()}/VID20{time.strftime("%y%m%d%H%M%S")}.avi'
if not os.path.exists(path):
os.mkdir(path)
return name
def main():
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开摄像头
size = (640, 480) # 视频大小
fps = 30 # 帧率
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 编码
video_name = create_name() # 创建视频文件名
out = cv2.VideoWriter(video_name, fourcc, fps, size)
for i in range(7501):
ret_flag, vshow = cap.read()
if ret_flag == True:
# vshow = cv2.resize(vshow, (1024, 768))
nowtime = time.strftime("20%y-%m-%d %H:%M:%S")
cv2.putText(vshow, nowtime, (230, 450), cv2.FONT_HERSHEY_SIMPLEX, 1, (225, 0, 225), 2) # 时间水印
cv2.putText(vshow, "Dormitory", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (225, 0, 0), 2) # 宿舍名
out.write(vshow) # 写入帧
cv2.imshow("monitor", vshow) # 显示
del vshow # 释放内存
if i % 5 == 0: # 系统状态
os.system("cls") # 清屏
print(f"视频 {video_name} 正在录制")
print(f"第{i}帧录制完成")
print(f"{int(i / 75)}%已完成{'|' * int(i / 300)}")
k = cv2.waitKey(1) & 0xFF # 特殊保存键
if k == ord("q"):
break
auto_del() # 删除旧的视频
cap.release() # 释放摄像头
cv2.destroyAllWindows() # 释放窗口
if __name__ == '__main__':
while True:
try:
main()
except:
print("系统错误")
四、测试
正常运行时的状态
五、总结
本人正在学习计算机技术,这是我的第一个开源系统,里面的写法可能有不规范的地方,但也希望本篇文章可以帮助到正在学习Python的同学。