如何从openCV+;python
我目前使用opencv录制视频的模式如下如何从openCV+;python,python,opencv,frame-rate,Python,Opencv,Frame Rate,我目前使用opencv录制视频的模式如下 import cv capture=cv.CaptureFromCAM(self.deviceID) img_size=cv.GetSize(cv.QueryFrame(capture)) #create a writer object for the video writer=cv.CreateVideoWriter( filename='temp.avi', fourcc=cv.CV_FOURCC('M',
import cv
capture=cv.CaptureFromCAM(self.deviceID)
img_size=cv.GetSize(cv.QueryFrame(capture))
#create a writer object for the video
writer=cv.CreateVideoWriter(
filename='temp.avi',
fourcc=cv.CV_FOURCC('M','J','P','G'),
fps=15,
frame_size=img_size,
is_color=1)
while True:
#grab the frame
img=cv.QueryFrame(capture)
#write frame to video
cv.WriteFrame(writer,img)
#if 'Enter' or 'Esc' key is pressed, end video capture
c = cv.WaitKey(7) % 0x100
if c == 27 or c == 10:
break
问题是我必须提前手动设置每秒的帧数。我将图像存储在一个列表中,并跟踪经过的时间,但这只是导出一个没有帧的文件:
import cv
import time
capture=cv.CaptureFromCAM(self.deviceID)
img_size=cv.GetSize(cv.QueryFrame(capture))
imgList=[]
zero=time.time()
while True:
#grab the frame
img=cv.QueryFrame(capture)
imgList.append(img)
cv.ShowImage("Window1",img)
#if 'Enter' or 'Esc' key is pressed, end video capture
c = cv.WaitKey(7) % 0x100
if c == 27 or c == 10:
break
duration=time.time()-zero
framesPerSecond=len(imgList)/duration)
writer=cv.CreateVideoWriter(
filename='temp.avi',
fourcc=cv.CV_FOURCC('M','J','P','G'),
fps=framesPerSecond,
frame_size=img_size,
is_color=1)
for i in imgList:
cv.writeFrame(writer,i)
一个小笨蛋。任何关于我现有代码的替代方法或调整的建议都会非常有用。您可能正在创建单帧的视频,而不是没有帧的视频。尝试将
img=cv.QueryFrame(捕获)
更改为img=cv.QueryFrame(捕获);dest=cv.CreateImage(img_大小、img.depth、img.nChannels);简历副本(img,dst)
然后imgList.append(dest)
。现在,为什么要使用这个旧API?我发现对于python绑定,cv的文档比cv2多得多。我开始有点向前推。。。我计划在cv2中重建它,一旦它运行起来。因此,评论中关于制作每个帧的副本的部分并没有改变最终视频中的任何内容?只是完成了它的实现。制作副本并附加它反而起了作用。不太清楚为什么,但它起了作用。很多人为此感谢你。关于这些函数的文档不是特别好,它导致人们相信可以多次调用GrabFrame
,并在以后调用RetrieveFrame
相同的次数,从而消除了对这些副本的需要,也增加了计算的fps。