智慧工地项目

存放视频和图片

view

  • MainWidget主界面
    • 布局

      • 1
        2
        3
        4
        5
        6
        self.totalLayout.setStretchFactor(self.left, 2)
        self.totalLayout.setStretchFactor(self.mid, 6)
        self.totalLayout.setStretchFactor(self.right, 2)
        self.left.setContentsMargins(10, 30, 0, 0)
        self.mid.setContentsMargins(30, 30, 0, 0)
        self.right.setContentsMargins(0, 30, 0, 0)
    • 逻辑
      - 点击视频目录画面区显示视频第一帧 类似于下面图 %%查一哈怎么插入图片%%
      - 视频目录的更新

        1. 在initUI方法中定义了视频存储路径,以及视频列表
        1. 初始化UI方法后调用update_file_list(),在该方法中调用get_video_list(self,path)获得视频所在文件夹名
        1. 使用了数据模型,这是QLIstView()里面带有的,并且设置模型
        1. 列表点击绑定事件view1.clicked.connect(self.list_view_click)
        1. 通过数据模型做的列表找到文件并显示第一帧
      • 切换播放的视频
        这里我一直觉得很神奇的就是点击播放就显示对应的视频,因为我最开始的视频路径是self.show_video_first_frame(self.current_video_path)
        也就是current的路径,研究了后我发现是该方法——show_video_first_frame(self, video_path) 来自于VideoWidget类,由他来显示
    • 代码方法

      • initUI(self)
      • update_file_list(self)
      • list_view_click(self,item)
      • get_video_list(self,path)
    • 交互

  • VideoWidget视频界面
    - 核心逻辑是 视频播放控制、摄像头交互、时间关联录制
    - 视频播放逻辑

      1. 播放初始化:
        先停止摄像头,避免资源冲突,用cv2加载视频,加载成功则设置并启动定时器,每个30ms触发一次play_frame
      1. 视频是一帧一帧播放的
    • 通过 self.video_capture.read() 读取视频帧;
    • 缩放帧尺寸为 800x600,转换 BGR 格式为 RGB(适配 PyQt 显示);
    • QImage 生成内存图像,通过 self.video_label.setPixmap 显示在界面上。
      1. 暂停控制(on_stop与stop_video):
    • 实际通过 stop_video 停止播放:
    • self.is_playing = False,停止定时器 timer2
    • 释放 self.video_capture 资源(release()),避免内存泄漏。
      1. 云检测,将视频拆解成图片,然后进行检测,视频拆解成图片,华为云接收的参数是图片,发送到华为云,接收返回的数据,保存为视频
    • 摄像头与录制逻辑(实时监控、定时录制)
      1. 启动摄像头
      1. 实时帧更新与时间叠加(update_frame)
    • 读取视频,通过cv2.putText叠加当前时间并且(datetime.now().strftime格式化)
    • 处于录制状态就将帧写入视频文件
      1. 定时录制与分段
    • start_recording 初始化录制:
    • cv2.VideoWriter 创建视频文件(路径为 ./videos/时间戳.mp4,编码 mp4v,帧率 20);
    • 记录开始时间 self.recording_start_time = datetime.now()
    • 录制时长控制:在 update_frame 中判断当前时间与开始时间的差值,若 ≥20 秒,自动调用 start_recording() 重新创建文件,实现 20 秒分段录制。
      1. 关闭摄像头,并且释放资源,清空录制开始时间
    • 视频切换与预览逻辑(关联列表点击)
      • 其逻辑就是显示第一帧一样的逻辑
    • 代码方法
      • __init__
      • on_play
      • on_stop
      • stop_video
      • on_camera
      • start_video
      • start_camera
      • play_frame
      • update_frame
      • stop_camera
      • start_recording
      • on_check
      • show_video_first_frame
      • init_ui

主函数

如果你想查看我的源码,可以到我的github上下载