python如何使用OpenCV捕获事件

这篇文章给大家分享的是有关python如何使用OpenCV捕获事件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1、步骤说明

python如何使用OpenCV捕获事件

定义关键事件;

将包含事件的视频片段写入到视频文件;

利用线程以确保在输入流和输出视频剪辑文件中执行I / O时,不会放慢主程序的速度;

利用内置的Python数据结构,如DEQUE队列以按顺序存放关键帧。

2、实例

#导入必要的包
fromcollectionsimportdeque#导入队列,FIFO(firstinfirstout)先进先出原则
fromthreadingimportThread
fromqueueimportQueue
importtime
importcv2


classKeyClipWriter:
#bufSize要在内存缓冲区中缓存的最大帧数
#timeout超时时间
def__init__(self,bufSize=64,timeout=1.0):
#存储在内存中要保留的最大缓冲区大小以及睡眠超时期间
self.bufSize=bufSize
self.timeout=timeout

#初始化帧的缓冲区(64帧)、Q:待写入的视频帧、视频写入类、多线程(以避免I/O延迟)
#recorderingboolean类型指示录制是否已启动
self.frames=deque(maxlen=bufSize)
self.Q=None
self.writer=None
self.thread=None
self.recording=False

defupdate(self,frame):
#更新帧缓冲区
self.frames.appendleft(frame)
#如果正在记录,将帧加入队列
ifself.recording:
self.Q.put(frame)

defstart(self,outputPath,fourcc,fps):
#展示正在记录关键事件帧
#表明正在录制,启动视频写入类,初始化需要写入视频文件的帧队列
self.recording=True
self.writer=cv2.VideoWriter(outputPath,fourcc,fps,
(600,600),True)
self.Q=Queue()

#循环遍历所有帧,并加入队列
foriinrange(len(self.frames),0,-1):
self.Q.put(self.frames[i-1])

#开启一个单独的线程写入帧到视频文件
self.thread=Thread(target=self.write,args=())
self.thread.daemon=True
self.thread.start()

defwrite(self):
#保持循环
whileTrue:
#如果停止了录制,退出线程
ifnotself.recording:
return
#判断队列是否已经没有关键事件帧了
ifnotself.Q.empty():
#获取队列中的下一帧并写入视频文件
frame=self.Q.get()
self.writer.write(frame)
#如果队列已经空了,sleep超时时间以不浪费cpu周期
#使用队列时空闲一会儿尤其重要,队列数据结构是线程安全的,暗示必须在更新内部缓冲区之前获取锁/信号量。
#如果不sleep,当缓冲区为空时,然后写入和更新方法将不断为锁而战斗。相反,最好让视频写入类等待一会儿,直到需要写入文件的队列中存在积压的帧。
else:
time.sleep(self.timeout)

defflush(self):
#通过刷新所有剩余帧来清空队列
whilenotself.Q.empty():
frame=self.Q.get()
self.writer.write(frame)

deffinish(self):
#表明结束录制、加入线程
#刷新队列中的所有帧到视频文件
#释放视频写入指针
self.recording=False
self.thread.join()
self.flush()
self.writer.release()

感谢各位的阅读!关于“python如何使用OpenCV捕获事件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

发布于 2021-05-30 14:04:50
收藏
分享
海报
0 条评论
165
上一篇:Python基础之模块的示例分析 下一篇:python参数调用的注意点有哪些
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码