首页 > 解决方案 > OpenCV set() 和 read() 函数太慢(Python)

问题描述

我想循环一定范围内的帧,并将其附加到数组中。问题是,它太慢了。我已经检查了该功能需要多长时间,我认为这很慢。这是我当前的代码:

imgs = []
for j in range(range1, range2):
      video.set(cv.CAP_PROP_POS_FRAMES, j)
      ret, frame = video.read()
      imgs.append(frame)

我也尝试用 替换imgs.append(frame)video.retrieve(video.grab())但性能并没有太大差异。有没有更好的解决方案/替代方法来执行此代码的功能?

标签: pythonopencvoptimization

解决方案


哦,哇,nvm。设置使这变慢:

内线时间:15.308052062988281

外时间:0.4459998607635498

import cv2
import time

def setInside(cap, start, end):
    imgs = [];
    for a in range(start, end):
        cap.set(cv2.CAP_PROP_POS_FRAMES, a);
        _, frame = cap.read();
        imgs.append(frame);

def setOutside(cap, start, end):
    imgs = [];
    cap.set(cv2.CAP_PROP_POS_FRAMES, start);
    for a in range(start, end):
        _, frame = cap.read();
        imgs.append(frame);

# open vidcap
cap = cv2.VideoCapture("202534.avi");

# bounds
start = 0;
end = 2000;

# time it
start_time = time.time();
setInside(cap, start, end);
print("Inside Time: " + str(time.time() - start_time));

start_time = time.time();
setOutside(cap, start, end);
print("Outside Time: " + str(time.time() - start_time));

如果您将设置移动到循环之前,它会更快。


推荐阅读