2017-09-05 147 views
0

我使用的是Python 2.7和OpenCV 3.3,并且想要在每个定义的帧数或定义的秒数后从立体相机保存图像。像每隔5帧或每2秒钟后帧应存储在不同的文件夹,如cam1foldercam2folder。我能够从两台相机捕捉视频,然后使用这些视频在预定义的秒后捕捉帧。下面给出了这些代码。Python 2.7/OpenCV 3.3:从立体摄像头捕获帧

import cv2 
import math 
import numpy as np 
videoFile = "output.avi" 
vidcap = cv2.VideoCapture(videoFile) 
success,image = vidcap.read() 

videoFile1 = "output1.avi" 
vidcap1 = cv2.VideoCapture(videoFile1) 
success1,image1 = vidcap1.read() 

seconds = 3 
fps = vidcap.get(cv2.CAP_PROP_FPS) # Gets the frames per second 
multiplier = fps * seconds 
fps1 = vidcap1.get(cv2.CAP_PROP_FPS) # Gets the frames per second 
multiplier1 = fps1 * seconds 


while success: 
    frameId = int(round(vidcap.get(1))) #current frame number, rounded b/c sometimes you get frame intervals which aren't integers...this adds a little imprecision but is likely good enough 
    success, image = vidcap.read() 

    frameId1 = int(round(vidcap1.get(1))) #current frame number 
    success1, image1 = vidcap1.read() 

    if frameId % multiplier == 0: 
     cv2.imwrite("right/rframe%d.jpg" % frameId, image) # stored in right folder 
    if frameId1 % multiplier1 == 0: 
     cv2.imwrite("left/lframe%d.jpg" % frameId1, image1) # stored in left folder 


vidcap.release() 
vidcap1.release() 
print "Complete" 

但我想直接是图像的实时采集来自视频而不保存这些:用于保存视频之后,从两个摄像头捕获帧

import numpy as np 
import cv2 
cap = cv2.VideoCapture(0) 
cap1 = cv2.VideoCapture(1) 
fourcc = cv2.VideoWriter_fourcc(*'MJPG') 
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480)) 
out1 = cv2.VideoWriter('output1.avi',fourcc, 20.0, (640,480)) 

while(True): 
    ret, frame = cap.read() 
    ret1, frame1 = cap1.read() 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    out.write(frame) 
    out1.write(frame1) 
    cv2.imshow('frame',gray) 
    cv2.imshow('frame1', frame1) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 

cap.release() 
out.release() 
cap1.release() 
out1.release() 
cv2.destroyAllWindows() 

代码:

用于视频捕捉代码视频,但保存捕获的图像在两个不同的文件夹。这个怎么做?

谢谢。

回答

0

你只需要合并你自己写的2个代码片段即可。

在您的第一个代码片段中,当您运行while循环时,您可以维护一个公用计数器,而不用单独的摄像机使用不同的计数器。当您的计数器达到所需值时(根据您的问题,5帧),您直接在frameframe1对象上执行imwrite

您不需要中间对象VideoWriter。 你的最终代码看起来像这样:

cap = cv2.VideoCapture(0) 
cap1 = cv2.VideoCapture(1) 
multiplier = 5 
frame_count = 0 
while(True): 
    frame_count += 1 
    ret, frame = cap.read() 
    ret1, frame1 = cap1.read() 

    cv2.imshow('frame',frame) #show all frames 
    cv2.imshow('frame1', frame1) 

    if frame_count % multiplier == 0: 
     cv2.imwrite("right/rframe%d.jpg" % frame_count, frame) #write specific frames 
     cv2.imwrite("left/lframe%d.jpg" % frame_count, frame1) 

    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 
+0

谢谢,它完美的作品。我想在这里提到的一件事是,frame_count ++不被Python支持,因此我将其更改为frame_count + = 1。第二,我想知道如何在不使用CV_CAP_PROP_POS_FRAMES的情况下计算上面代码中的帧数。据我所知,初始计数为0,而条件将为真,计数将增加,直到frame_count%multiplier == 0为真。然后,帧将被捕获,并再次计数将是10.我的查询是否计数与帧速率同步?意味着我们可以怎样说增加1点,帧增加1? –

+0

计数与帧频不同步。你已经添加了一个waitKey(1),这意味着你的循环将在2次迭代之间等待1ms。显然'cap.read()'也会将主线程保持到接收到新帧为止 –

+0

我认为在cv2.waitKey(1)之前都启动两个相机帧之间没有时间延迟。这是真的吗? –