![VideoCapture.read() 使用 OpenCV。为什么 USB 摄像头比 CSI 摄像头更快?(无 GPU)](https://linux22.com/image/914420/VideoCapture.read()%20%E4%BD%BF%E7%94%A8%20OpenCV%E3%80%82%E4%B8%BA%E4%BB%80%E4%B9%88%20USB%20%E6%91%84%E5%83%8F%E5%A4%B4%E6%AF%94%20CSI%20%E6%91%84%E5%83%8F%E5%A4%B4%E6%9B%B4%E5%BF%AB%EF%BC%9F%EF%BC%88%E6%97%A0%20GPU%EF%BC%89.png)
我正在使用 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 摄像头相同)。
使用$ htop
CSI 和 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 功率,但这应该是一个单独的问题。