Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何使cv2.videoCapture.read()更快?_Python 3.x_Multithreading_Opencv_Ffmpeg_Pyffmpeg - Fatal编程技术网

Python 3.x 如何使cv2.videoCapture.read()更快?

Python 3.x 如何使cv2.videoCapture.read()更快?,python-3.x,multithreading,opencv,ffmpeg,pyffmpeg,Python 3.x,Multithreading,Opencv,Ffmpeg,Pyffmpeg,我的问题: 我在做我的计算机视觉项目。我使用opencv(4.1.2)和python来实现它 我需要一种更快的方式将阅读框传递到计算机上的图像处理中(Ubuntu 18.04 8核i7 3.00GHz内存32GB)。cv2.VideoCapture.read()read帧(帧大小:720x1280)大约需要120~140ms太慢。我的处理模块每次运行大约需要40毫秒。我们需要25~30fps 以下是我目前的演示代码: import cv2 from collections import dequ

我的问题:

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

我需要一种更快的方式将阅读框传递到计算机上的图像处理中(Ubuntu 18.04 8核i7 3.00GHz内存32GB)。
cv2.VideoCapture.read()
read帧(帧大小:720x1280)大约需要120~140ms太慢。我的处理模块每次运行大约需要40毫秒。我们需要25~30fps

以下是我目前的演示代码:

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

我尝试的是:

  • 多线程-一个线程只读取帧,另一个线程进行图像处理。 这不是我想要的。因为我可以设置一个缓冲区,例如节省50帧。但是帧读取线程的工作速度为~frame/130ms。我的图像处理线程以~frame/40ms的速度运行。然后那辆车就跑了。所以我尝试了解决方案。但不是我需要的

  • 这是我发现的最接近我的问题的讨论。但不幸的是,我尝试了公认的解决方案(下面讨论的两种)

  • 其中一个解决方案(竖起6个大拇指)指出,他可以在mac电脑上每隔1秒读取并保存100帧。为什么我的机器不能处理读框工作?我错过什么了吗?我的安装使用了conda和pip
    conda安装-c conda-forge-opencv
    pip-install-opencv-python
    (是的,我尝试了两者。)

    使用ffmpeg解决方案的另一个解决方案(1个拇指朝上)。但它似乎是在使用视频文件,而不是摄像设备?

  • 调整c2.waitKey(): 该参数仅控制视频显示时的频率。这不是解决办法
  • 然后,我知道我只需要一些关键词

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

    有什么建议吗?

    很长

    我使用以下设置进行了检查,如果增加帧大小,opencv将减少总fps。也许这是一个错误

    1920x1080:FPS:5.0,宽度:1920.0,高度:1080.0,延迟=150ms

    1280x720:FPS:10.0,宽度:1280.0,高度:720.0,延迟=60ms

    640x480:FPS:30.0,宽度:640.0,高度:480.0,延迟=5ms

    但通过使用其他应用程序(如cheese),我们仍然可以以1920x1080分辨率获得完整的30fps。 请注意,设置CAP_PROP_BUFFERSIZE值也没有帮助

    因此会出现一个问题:“我们如何克服这一点?”。在此阶段,您只有两个选择:

  • 将帧分辨率降低到640x480
  • 使用其他框架

  • 希望这有帮助

    这有点晚了,但我想知道我的Logitech C920 HD Pro USB摄像头在Ubuntu 20.04和OpenCV上的表现。我试图命令捕获会话以30 FPS的速度运行全高清,但FPS在4-5 FPS之间波动

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

    当我列出我的Logitech C920的视频格式时,它显示:

    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)
    

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

    capture = cv2.VideoCapture(0) to capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)
    
    我搜索了很多时间,但没有找到最好的解决方案,但这个解决方案工作更快打开cv2视频捕获尝试现在希望对你有用。
    只需使用
    cv2.VideoCapture(0,cv2.CAP\u DSHOW)

    摄像机的帧率低吗?
    self.capture.get(cv2.CAP\u PROP\u FPS)
    的价值是什么?请查看和。我在一个RTSP IP摄像机流上使用它,如果你有多个摄像机流的话,可以得到约60 fps。我用8台同步摄像机以~60 FPS的速度运行这个程序(被摄像机覆盖)@gct我的设置CAP_PROP_FPS显示:“30.0”@nathancy我读了你的帖子。我将CAP_PROP_BUFFERSIZE增加到10。同样的结果。读一帧大约需要130毫秒。其次,我确信我的
    VideoCapture.read()
    速度很慢。由于网络延迟,您的情况并非如此。因为我的手机是一个带USB 2.0的罗技摄像头。它是有线的!请问您的
    VideoCapture.read()
    使用cv2.CAP\u PROP\u FPS=30,cv2.CAP\u PROP\u BUFFERSIZE=10的次数是多少?第三,我只用一个摄像头。是的,这是一个有线的情况。是的,CAP_PROP_BUFFERSIZE也帮不上忙。我想知道这是一个编译问题吗?正如您所说:但通过使用其他应用程序(如cheese),我们仍然可以以1920x1080分辨率获得完整的30fps。也许在使用conda安装或pip安装时出现了问题?你怎么看?我不这么认为。如果需要,可以打印生成信息以进行检查。在中,您可以看到有一些视频io后端。最重要的一点是:“每个后端都以不同的方式支持设备属性(cv::VideoCaptureProperties),或者根本不支持任何属性。”。这意味着他们不能保证你的选择总是按照你想要的方式工作。因此,最后一个镜头是尝试使用其他后端(如CAP_GSTREAMER或CAP_FFMPEG)捕获视频。
    capture = cv2.VideoCapture(0) to capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)