OpenCV Python 视频捕捉 - 能帮我检查一下代码吗

0 投票
1 回答
3445 浏览
提问于 2025-04-18 16:26

这是我的代码。我想知道我的网络摄像头的帧率。出于某种原因,cap.get(5)这个用来获取帧率的属性在实时捕捉时不起作用。所以我尝试了一种变通的方法,计算每次循环中捕捉到的帧数。我使用了time.time()函数来获取每帧之间的时间(通过这个我可以计算出每秒的帧数)。我得到的结果大约是0.128,但我现在的问题是cv2.waitKey(x)。即使我把x替换成1、10或100,结果还是一样。

是的,我知道x是以毫秒为单位的。但如果我把x设为100,我应该得到0.2,对吧?这里到底出了什么问题?

任何帮助都将不胜感激。如果有人能帮我计算帧率,我会很高兴。

附注:这一切都是因为我用OpenCV保存的视频总是看起来太快,也就是快进了。

注意:如果我把x设为1000,那么我得到的是2.128。

import numpy as np
import cv2
import time

cap = cv2.VideoCapture(0)
#print cap.get(5)

# Define the codec and create VideoWriter object
fourcc = cv2.cv.CV_FOURCC(*'XVID') 
out = cv2.VideoWriter('output1.avi',fourcc, 10, (640,480))

while(cap.isOpened()):
    start = time.time()
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,1) 
       
        # write the flipped frame
        out.write(frame)        

        cv2.imshow('frame',frame)

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


    end = (time.time() - start)
    print end

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

1 个回答

0

我会尝试按照这里的建议来处理它们: OpenCV: VideoCapture::get(CV_CAP_PROP_FPS) 返回 0 FPS

大概是这样的:

import numpy as np
import cv2
import time

cap = cv2.VideoCapture(0)
#print cap.get(5)

# Define the codec and create VideoWriter object
fourcc = cv2.cv.CV_FOURCC(*'XVID')

num_frames = 0

start = time.time()
while(cap.isOpened()):

    ret, frame = cap.read()
    if num_frames < 500:
        frame = cv2.flip(frame,1)
        num_frames = num_frames + 1;
    else:
        break


total_time = (time.time() - start)
fps = (num_frames / total_time)
print str(num_frames) + ' frames in ' + str(total_time) + ' seconds = ' + str(fps) + ' fps'

# Release everything if job is finished
cap.release()
cv2.destroyAllWindows()

撰写回答