【问题标题】:Python 2.7/OpenCV 3.3 : capture frames from stereo camerasPython 2.7/OpenCV 3.3:从立体相机捕捉帧
【发布时间】:2018-02-13 08:12:24
【问题描述】:

我正在使用 Python 2.7 和 OpenCV 3.3,并希望在每个定义的帧数或定义的秒数后保存来自立体相机的图像。就像每 5 帧或每 2 秒后的帧应该存储在不同的文件夹中,如 cam1foldercam2folder。我能够从两个摄像头捕捉视频,然后在预定义的秒数后使用这些视频捕捉帧。下面给出了这些代码。

视频采集代码:

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()

保存视频后从两个摄像头捕获帧的代码:

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"

但我想要的是直接从视频中实时捕获图像而不保存这些视频,而是将捕获的图像保存在两个不同的文件夹中。如何做到这一点?

谢谢。

【问题讨论】:

    标签: python-2.7 opencv3.0 camera-calibration stereo-3d


    【解决方案1】:

    您只需要合并您自己编写的 2 个代码 sn-ps。

    在您的第一个代码 sn-p 中,当您运行 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
    

    【讨论】:

    • 谢谢,它运行良好。我想在这里提到的一件事是 Python 不支持 frame_count++,所以我将其更改为 frame_count +=1 。第二,我想知道在不使用 CV_CAP_PROP_POS_FRAMES 的情况下如何计算上述代码中的帧数。据我了解,初始计数为 0,而条件为真,计数将增加,直到 frame_count % multiplier == 0 变为真。然后,将捕获帧并再次计数为 10。我的查询是否计数与帧速率同步?意思是我们怎么能说随着in1 count的增加,frame增加1?
    • 计数与帧率不同步。您添加了一个 waitKey(1),这意味着您的循环将在 2 次迭代之间等待 1 毫秒。显然 `cap.read()' 也会暂停主线程,直到收到新帧
    • 我认为拍摄的左右相机帧之间没有时间延迟,因为两者都是在 cv2.waitKey(1) 之前启动的。是真的吗?
    • 是的。这是正确的。我建议您将 waitKey 增加到 10
    猜你喜欢
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多