Python 3.x cv2:Can';t创建特定持续时间的视频
我在用PsychoPy创建持续30秒的网络摄像头视频时遇到问题。取而代之的是,视频的长度约为43秒。我的代码如下(略加编辑): 来自psychopy导入区域设置、视觉、核心、事件、数据、gui、麦克风 进口cv2 #设置计时器: trialTimer=core.Clock() #开始录像: cap=cv2.VideoCapture(0+cv2.cap\u DSHOW) fourcc=cv2.视频编写器_fourcc(*“XVID”) out=cv2.VideoWriter(“{}.avi.”格式(视频路径),fourcc,20.0,(640480)) trialTimer.reset() 而trialTimer.getTime()<30: ret,frame=cap.read() 输出。写入(帧) #停止录像: 第1章释放() out.release() cv2.destroyAllWindows()Python 3.x cv2:Can';t创建特定持续时间的视频,python-3.x,cv2,psychopy,Python 3.x,Cv2,Psychopy,我在用PsychoPy创建持续30秒的网络摄像头视频时遇到问题。取而代之的是,视频的长度约为43秒。我的代码如下(略加编辑): 来自psychopy导入区域设置、视觉、核心、事件、数据、gui、麦克风 进口cv2 #设置计时器: trialTimer=core.Clock() #开始录像: cap=cv2.VideoCapture(0+cv2.cap\u DSHOW) fourcc=cv2.视频编写器_fourcc(*“XVID”) out=cv2.VideoWriter(“{}.avi.”格式
视频循环清晰(即不太快或太慢),因此我不太确定如何调整才能将视频长度缩短到30秒。能否显示时间变量是什么,以及如何获得此变量?它看起来没有更新,因此while循环不满足退出条件我正在通过PsychoPy进行网络摄像头视频捕获,因此计时器变量是一个内置函数。我编辑了这篇文章以更好地反映这一点。我删除了我的答案,因为我知道我认为我理解问题是什么(但不是你如何解决它);基本上,计时器似乎是获取时钟对象的时间,而不是视频。有关详细信息,请参阅。我将
VideoWriter
函数中的第三个参数(fps)更改为29.4333,使视频现在为30秒;然而,它看起来像是在快进。现在我可能只需要处理这个问题。你的循环被限制在最后30秒,但它的迭代速率(因此对图像进行采样)不受限制,也不与相机的帧速率同步。如果您使用的是PsychoPy窗口,则在循环中注入window.flip()
,将控制循环,使其在每次屏幕刷新(通常为60 Hz)时仅从相机中采集一幅图像,或者您可以在每秒钟刷新时抓取一幅图像,从而以30 Hz的频率录制视频,诸如此类。你能告诉我时间变量是什么,以及你是如何得到它的吗?它看起来没有更新,因此while循环不满足退出条件我正在通过PsychoPy进行网络摄像头视频捕获,因此计时器变量是一个内置函数。我编辑了这篇文章以更好地反映这一点。我删除了我的答案,因为我知道我认为我理解问题是什么(但不是你如何解决它);基本上,计时器似乎是获取时钟对象的时间,而不是视频。有关详细信息,请参阅。我将VideoWriter
函数中的第三个参数(fps)更改为29.4333,使视频现在为30秒;然而,它看起来像是在快进。现在我可能只需要处理这个问题。你的循环被限制在最后30秒,但它的迭代速率(因此对图像进行采样)不受限制,也不与相机的帧速率同步。如果您使用的是PsychoPy窗口,则在循环中注入window.flip()
,将控制循环,使其在每次屏幕刷新(通常为60 Hz)时仅从相机中采集一幅图像,或者您可以在每秒钟刷新时抓取一幅图像,从而以30 Hz的频率录制视频,依此类推。
from psychopy import locale_setup, visual, core, event, data, gui, microphone
import cv2
#Set up Timer:
trialTimer = core.Clock()
#Begin Video Recording:
cap = cv2.VideoCapture(0 + cv2.CAP_DSHOW)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('{}.avi'.format(video_path),fourcc, 20.0, (640,480))
trialTimer.reset()
while trialTimer.getTime() < 30:
ret, frame = cap.read()
out.write(frame)
#Stop video recording:
cap.release()
out.release()
cv2.destroyAllWindows()