基于opencv-python 的宿舍监控系统

为了保证宿舍财产安全,本人运用现有知识,为宿舍打造了一个监控系统。

一、系统要求:

实现循环录像,并保存在文件夹,视频录像可视化,实时显示系统信息,视频保存时间可调。

二、开发环境

开发语言: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的同学。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y.d大仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值