智慧
智慧工地项目
存放视频和图片
view
- MainWidget主界面
布局
1
2
3
4
5
6self.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)
逻辑
- 点击视频目录画面区显示视频第一帧 类似于下面图 %%查一哈怎么插入图片%%
- 视频目录的更新- 在initUI方法中定义了视频存储路径,以及视频列表
- 初始化UI方法后调用update_file_list(),在该方法中调用
get_video_list(self,path)
获得视频所在文件夹名
- 初始化UI方法后调用update_file_list(),在该方法中调用
- 使用了数据模型,这是QLIstView()里面带有的,并且设置模型
- 列表点击绑定事件
view1.clicked.connect(self.list_view_click)
- 列表点击绑定事件
- 通过数据模型做的列表找到文件并显示第一帧
- 切换播放的视频
这里我一直觉得很神奇的就是点击播放就显示对应的视频,因为我最开始的视频路径是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视频界面
- 核心逻辑是 视频播放控制、摄像头交互、时间关联录制
- 视频播放逻辑- 播放初始化:
先停止摄像头,避免资源冲突,用cv2加载视频,加载成功则设置并启动定时器,每个30ms触发一次play_frame
- 播放初始化:
- 视频是一帧一帧播放的
- 通过
self.video_capture.read()
读取视频帧; - 缩放帧尺寸为 800x600,转换 BGR 格式为 RGB(适配 PyQt 显示);
- 用
QImage
生成内存图像,通过self.video_label.setPixmap
显示在界面上。 - 暂停控制(on_stop与stop_video):
- 实际通过
stop_video
停止播放: - 设
self.is_playing = False
,停止定时器timer2
; - 释放
self.video_capture
资源(release()
),避免内存泄漏。 - 云检测,将视频拆解成图片,然后进行检测,视频拆解成图片,华为云接收的参数是图片,发送到华为云,接收返回的数据,保存为视频
- 摄像头与录制逻辑(实时监控、定时录制)
- 启动摄像头
- 实时帧更新与时间叠加
(update_frame)
- 实时帧更新与时间叠加
- 读取视频,通过cv2.putText叠加当前时间并且
(datetime.now().strftime格式化)
- 处于录制状态就将帧写入视频文件
- 定时录制与分段
start_recording
初始化录制:- 用
cv2.VideoWriter
创建视频文件(路径为./videos/时间戳.mp4
,编码mp4v
,帧率 20); - 记录开始时间
self.recording_start_time = datetime.now()
。 - 录制时长控制:在
update_frame
中判断当前时间与开始时间的差值,若 ≥20 秒,自动调用start_recording()
重新创建文件,实现 20 秒分段录制。 - 关闭摄像头,并且释放资源,清空录制开始时间
- 视频切换与预览逻辑(关联列表点击)
- 其逻辑就是显示第一帧一样的逻辑
- 代码方法
__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上下载
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 我的博客!