VideoCapture.read() 使用 OpenCV。为什么 USB 摄像头比 CSI 摄像头更快?(无 GPU)

VideoCapture.read() 使用 OpenCV。为什么 USB 摄像头比 CSI 摄像头更快?(无 GPU)

我正在使用 NanoPi Duo 2 进行实时图像采集项目。

我注意到使用 CSI 摄像头和 USB 摄像头之间存在明显的性能(速度)差异。


性能差异如下, OpenCV VideoCapture.read() 的时间

CSI_OV5640_Camera = ~0.04s (40 ms)
USB_Logitech_HD_C270 = ~0.009 (9 ms)

据我所知,我理解 NanoPi Duo2 没有任何 GPU,CSI 摄像头将由 CPU 处理(与 USB 摄像头相同)。

使用$ htopCSI 和 USB 摄像头,4 个核心中的一个显示 100%。

更新:输出帧处理需要 CSI 摄像机提供更多的 CPU 能力。


作为背景,

OpenCV 3.4.6 构建输出

Video I/O
 - libv4l/libv4l2    NO
 - v4l/v4l2          linux/videodev2.h

$ v4l2-ctl --get-fmt-video

Format Video Capture:
        Width/Height      : 640/480
        Pixel Format      : 'YV12'
        Field             : Any
        Bytes per Line    : 960
        Size Image        : 460800
        Colorspace        : Default
        Transfer Function : Default
        YCbCr Encoding    : Default
        Quantization      : Default
        Flags             :

一件有趣的事 CSI 和 USB的性能numpy ndarray也不同

pyzbar.decode() calculation
CSI_OV5640_Camera = ~0.43s (430 ms)
USB_Logitech_HD_C270 = ~0.19s (190 ms)

我认为 VideoCapture.read() 的编码不同,但我看到的都是大小相同(640x480,3 种颜色)的 numpy ndarray,值看起来相似。但是,使用 CSI 摄像头接收的数组需要更高的 CPU 能力来处理。

感谢您阅读我的问题。

答案1

对于遇到类似问题的任何人,我都找到了使用的原因$ htop

这与不同的 CPU 消耗有关,因为 CSI 摄像机需要更多的 CPU。



配备CSI摄像头(OV5640)

连续 VideoCapture.read() 占用全部 CPU 能力(全部 4 个核心均为 100%)


带 USB 摄像头 (Logitech C270)

连续 VideoCapture.read() 仅在 1 个核心上就占用最多 60-70% 的 CPU 能力。



我想进一步了解为什么 CSI 比 USB UVC 相机需要更多的 CPU 功率,但这应该是一个单独的问题。

相关内容