pygame+opencv实现读取视频帧的方法示例
作者:老光头_ME2CS 发布时间:2021-01-04 23:41:27
标签:pygame,opencv,视频帧
由于pygame.movie.Movie.play() 只支持MPEG格式的视频,且 pygame版本大于1.9.5好像已经不支持这个模块了,所以决定使用与opencv读取视频帧的画面,利用pygame的surface刷新窗口。
有基础的小伙伴,代码还是很好理解,直接上代码
pygame.time.Clock()同步时间
import pygame
from pygame.locals import *
import cv2
import sys
import time
FPS = 30
FramePerSec = pygame.time.Clock()
video_path = './Selected Stimuli/noaudio_c_001_critical_swerve.mp4'
video = cv2.VideoCapture(video_path)
pygame.init()
pygame.display.set_caption('OpenCV Video Player on Pygame')
screen = pygame.display.set_mode((1280, 720), 0, 32)
screen.fill([0,0,0])
num = 0
while True :
T1 = time.time()
ret, frame = video.read()
if ret == False:
print('Total Time:', time.time()-T0)
sys.exit()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = cv2.transpose(frame)
frame = pygame.surfarray.make_surface(frame)
screen.blit(frame, (0,0))
if num == 0:
T0 = time.time()
pygame.display.update()
FramePerSec.tick(FPS)
num += 1
print('freq time:{}, frame num: {}'.format(time.time()-T1, num))
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
但是存在一些问题,时间戳的耗时比视频默认时间更长。
按理说FramePerSec = pygame.time.Clock()是能够很好的控制总的时长,但是发现视频越长播放器的延迟时间越长
换成Ubuntu系统后,发现以上延迟的问题得到缓解,推测可能与Windows系统中的进程管理有关。但是视频时差别很明显,比如120s视频,实际播放时间只用了118.8s。推测可能是pygame.time.Clock()是确保单帧的刷新率与预设相同,但是由于每一帧都存在相同的时间误差,就导致误差累加的问题明显。
自编时间控制
由于以上原因无法解决,增加了一个简单的控制逻辑后可有效控制视频播放的时间戳问题
import pygame
from pygame.locals import *
import cv2
import sys
import time
video_path = 'out1.avi'
video = cv2.VideoCapture(video_path)
FPS = int(round(video.get(cv2.CAP_PROP_FPS)))
FramePerSec = pygame.time.Clock()
Width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
Height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
pygame.init()
pygame.display.set_caption('OpenCV Video Player on Pygame')
screen = pygame.display.set_mode((Width, Height), 0, 32)
screen.fill([0,0,0])
num = 0
while True :
if num == 0:
T0 = time.time()
if time.time()-T0 > num*(1./FPS):
ret, frame = video.read()
TimeStamp = video.get(cv2.CAP_PROP_POS_MSEC)
if ret == False:
print('Total Time:', time.time()-T0)
pygame.quit()
sys.exit()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = cv2.transpose(frame)
frame = pygame.surfarray.make_surface(frame)
screen.blit(frame, (0,0))
pygame.display.update()
num += 1
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
来源:https://blog.csdn.net/Forrest97/article/details/107799833


猜你喜欢
- 在这里奉上源代码,没有做样式处理,不过功能是可以的,希望大家可以和我交流交流!<html> <head>&
- 在过去的十年中,MySQL已经成为广受欢迎的数据库,而WordPress博客使用的是MySQL数据库,虽然使用插件可以解决一些问题,但是实现
- 先看下jupyter和pycharm环境的差别左边是jupyter-------------------------------------
- 前言:分区是一种表的设计模式,正确的分区可以极大地提升数据库的查询效率,完成更高质量的SQL编程。但是如果错误地使用分区,那么分区可能带来毁
- 前言什么算是高层的文件操作呢?普通的文件操作,我们一般只涉及创建文件,文件夹以及写入文件等等。假如我现在需要复制一个文件的内容到另一个文件之
- 错误号 错误信息5 &n
- 本文实例讲述了Python迭代器定义与简单用法。分享给大家供大家参考,具体如下:一、什么是迭代器迭代,顾名思义就是重复做一些事很多次(就现在
- CGArt®2008“贺岁刊”玉鼠闹春,700页再造巅峰本期CGArt杂志信息:下载地址:http://cgart.cgfi
- 前言大家好,我是空空star,本篇给大家分享一下通过Python的pytesseract库识别图片中的文字。本篇所用软件相关版本:macOS
- 前言目前机器学习框架有两大方向,Pytorch和Tensorflow 2。对于机器学习的小白的我来说,直观的感受是Tensorflow的框架
- TensorFlow-gpu1.安装Anaconda进入官网(https://www.anaconda.com/) ->get sta
- 项目基本目录1.首先定义初始默认的路由routes(router.js文件),vue文件使用import引入可以按需加载import { &
- 1、操作步骤(1)打开文件读取整个文件函数open返回一个表示文件的对象,对象存储在infile中。关键字with在不需要访问文件时将其自动
- defaultdict底层代码:在字典中查找某个值时,若key不存在时则会返回一个KeyError错误而不是一个默认值,这时候可以使用def
- 我们知道numpy的array是可以保存到文件的,一个常用的做法是通过to_file()保存到而进行.bin文件中,然后再通过from_fi
- 本文实例为大家分享了pygame实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下由于这段时间实在是太聊了,没什么事做,游戏也玩腻了,所以
- 什么是PRC&GRPCRPC是远程过程调用(Remote Procedure Call)的缩写形式, RPC 的主要功能目标是让构建
- 本文实例讲述了django+js+ajax实现刷新页面的方法。分享给大家供大家参考,具体如下:在服务器开发的时候,为了方便将服务器对外开一个
- 问题描述分析这是因为本地delve组件版本过低导致的,2019.2.1版本的Goland默认支持go 1.13查看F:\Go (GOPATH
- 是否曾经有过这样的经历:把一个元素置于另一个元素之上,而希望下面的那个元素成为可点击的?现在,利用css的pointer-events属性即