首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使cv2.videoCapture.read()更快?

如何使cv2.videoCapture.read()更快?
EN

Stack Overflow用户
提问于 2020-01-14 02:33:16
回答 4查看 15.3K关注 0票数 7

我的问题是:

我在做我的电脑视觉项目。我使用opencv(4.1.2)和python来实现它。

我需要一种更快的方式将读取帧传递到我的计算机上的图像处理(Ubuntu18.04 8核i7 3.00GHz内存32 to )。cv2.VideoCapture.read()读取帧(帧大小: 720x1280)大约需要120~140 120。太慢了。我的处理模块每次运行大约需要40 is。我们需要25~30 FPS。

到目前为止,下面是我的演示代码:

代码语言:javascript
运行
复制
import cv2
from collections import deque
from time import sleep, time
import threading


class camCapture:
    def __init__(self, camID, buffer_size):
        self.Frame = deque(maxlen=buffer_size)
        self.status = False
        self.isstop = False
        self.capture = cv2.VideoCapture(camID)


    def start(self):
        print('camera started!')
        t1 = threading.Thread(target=self.queryframe, daemon=True, args=())
        t1.start()

    def stop(self):
        self.isstop = True
        print('camera stopped!')

    def getframe(self):
        print('current buffers : ', len(self.Frame))
        return self.Frame.popleft()

    def queryframe(self):
        while (not self.isstop):
            start = time()
            self.status, tmp = self.capture.read()
            print('read frame processed : ', (time() - start) *1000, 'ms')
            self.Frame.append(tmp)

        self.capture.release()

cam = camCapture(camID=0, buffer_size=50)
W, H = 1280, 720
cam.capture.set(cv2.CAP_PROP_FRAME_WIDTH, W)
cam.capture.set(cv2.CAP_PROP_FRAME_HEIGHT, H)


# start the reading frame thread
cam.start()

# filling frames
sleep(5)

while True:
  frame = cam.getframe() # numpy array shape (720, 1280, 3)

  cv2.imshow('video',frame)
  sleep( 40 / 1000) # mimic the processing time

  if cv2.waitKey(1) == 27:
        cv2.destroyAllWindows()
        cam.stop()
        break

我试过的是:

  1. multiThread --一个线程只读取帧,另一个线程执行图像处理。,这不是我想要的。,因为我可以设置一个缓冲区,例如,保存50个帧。但是,帧读取线程的工作速度~帧/130 but。我的图像处理线程的工作速度~帧/40毫秒。然后德克就快用完了。所以我已经尝试过这个解决方案了。但不是我想要的。

  1. ,这个topic是我发现的最接近我问题的讨论。但不幸的是,我尝试了接受的解决方案(这两种解决方案都在discussion).

下面

解决方案之一的指出,他可以每隔1秒在mac上读取和保存100个帧。为什么我的机器不能处理帧读取工作?我漏掉了什么吗?我的安装使用了conda和pip conda install -c conda-forge opencv**,** pip install opencv-python**(yes,,我尝试了两者。)**

另一个解决方案(1拇指向上)使用ffmpeg解决方案。但是它似乎是用于视频文件,而不是相机设备?

  1. 调整c2.wardKey():当视频显示时,参数只控制频率。不是解决办法。

然后,我知道我只是需要一些关键字来跟踪。

以上代码是我的演示代码,到目前为止,我需要一些方法或指南,以使我的videoCapture.read()更快。可能是一种在videoCapture对象或其他相机读取模块中使用多线程的方法。

有什么建议吗?

EN

回答 4

Stack Overflow用户

发布于 2020-11-07 21:18:47

这有点晚,但我想知道这与我的罗技C920高清专业USB摄像头在Ubuntu20.04和OpenCV。我试图命令捕获会话运行全HD @ 30 FPS,但FPS在4-5 FPS之间波动。

我的相机的捕获格式默认为"YUYV 4:2:2“。无论我如何尝试更改视频捕获设置,OpenCV都没有神奇地更改视频格式以匹配例如所需的FPS设置。

当我列出罗技C920的视频格式时,它透露:

代码语言:javascript
运行
复制
ubuntu:~$ v4l2-ctl --list-formats-ext

ioctl: VIDIOC_ENUM_FMT
    Type: Video Capture

    [0]: 'YUYV' (YUYV 4:2:2)
<clip>
        Size: Discrete 1600x896
            Interval: Discrete 0.133s (7.500 fps)
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 1920x1080
            Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 2304x1296
            Interval: Discrete 0.500s (2.000 fps)
    [1]: 'MJPG' (Motion-JPEG, compressed)
<clip>
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.042s (24.000 fps)
            Interval: Discrete 0.050s (20.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
            Interval: Discrete 0.100s (10.000 fps)
            Interval: Discrete 0.133s (7.500 fps)
            Interval: Discrete 0.200s (5.000 fps)

解决方案是手动命令OpenCV捕获设备使用压缩的“MJPG”格式:

代码语言:javascript
运行
复制
import numpy as np
import cv2

capture = cv2.VideoCapture(0)
W, H = 1920, 1080
capture.set(cv2.CAP_PROP_FRAME_WIDTH, W)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, H)
capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
capture.set(cv2.CAP_PROP_FPS, 30)
票数 3
EN

Stack Overflow用户

发布于 2021-05-13 18:27:04

--这是有史以来最好的解决方案

从这里

代码语言:javascript
运行
复制
capture = cv2.VideoCapture(0)

代码语言:javascript
运行
复制
capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)

我搜索了很长时间,但没有找到最好的解决方案,但这个解决方案工作速度更快,打开cv2视频捕捉尝试,现在希望对您有用。只需使用cv2.VideoCapture(0, cv2.CAP_DSHOW)

票数 1
EN

Stack Overflow用户

发布于 2021-11-23 00:29:14

在我的例子中,我设置了这样的摄像机(在c++代码中):

代码语言:javascript
运行
复制
// cam is cv::VideoCapture object
cam.set(cv::CAP_PROP_BUFFERSIZE, 1);
cam.set(cv::CAP_PROP_FPS, 20); // set fps before set fourcc
cam.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));

CAP_PROP_BUFFERSIZE并不重要,但CAP_PROP_FPS必须在CAP_PROP_FOURCC之前设置。

通过这个设置,我的相机fps从5增加到20。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59726776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档