0. 前言

树莓派的CSI原装摄像头普通USB摄像头有何区别?
CSI摄像头有何优缺点?我们在选择时该选哪一种

最近做某个项目的加速时,产生了这样的疑问,于是开始比较一下这两种摄像头。

1. 准备工作

我是在python3环境下调用opencv对两款摄像头进行测评
所以需要以下准备:

  1. Enable Camera
    点击左上角树莓派 --> Preference --> Raspberry Configuration,使能Camera,之后重启树莓派。

  2. 安装opencv
    具体过程见树莓派(4):树莓派python3安装opencv

2. CSI摄像头

2.1 安装摄像头

在这里插入图片描述
安装CSI摄像头的时候,不可带电操作,否则容易烧坏摄像头,安装排线的时候,留意摄像头和树莓派上的卡扣,打开卡扣后再插入排线,排线插好后再把卡扣扣好,并注意排线的方向

2.2 安装驱动

Deiki文章中写道,

树莓派专用CSI摄像头插到树莓派的CSI口上并在在raspi-config中打开后就可以使用Raspistill命令直接使用,但如果在OpenCV中调用CSI摄像头会出现无数据的现象(cv2.VideoCapture(0)这时不会报错)。

这是因为树莓派中的camera module是放在/boot/目录中以固件形式加载的,不是一个标准的V4L2的摄像头驱动,所以加载起来之后会找不到/dev/video0的设备节点。我们在/etc/modules里面添加一行bcm2835-v4l2(小写的L)就能解决问题。

我是没有遇到这个问题的,即,不进行这一步操作我的opencv也能直接调用CSI摄像头,可能是Buster版本解决了这个问题。

不过保险起见,我还是进行了这一步操作。

2.3 测试

写一个简单的读取摄像头图像的程序

import cv2

videoIn = cv2.VideoCaptire(0)
print("capture device is open: " + str(videoIn.isOpened()))
success,frame = videoIn.read()
while success:  
	cv2.imshow('Test camera',frame)
	success,frame = videoIn.read()
	if cv2.waitKey(1) & 0xFF == ord('q'):
		break
videoIn.release()

在这里插入图片描述
测试成功!

3. USB摄像头

USB摄像头则方便得多,直接插入USB口(此时我拆下了CSI摄像头),同样运行上面的代码
在这里插入图片描述
测试成功!

4. 二者对比

4.1 型号说明

CSI摄像头USB摄像头
在这里插入图片描述在这里插入图片描述

看订单的时候发现这款USB摄像头价格成了66了,不过现在一般的USB摄像头二十来块也能买一个吧

4.2 成像质量

CSI摄像头USB摄像头
在这里插入图片描述在这里插入图片描述

CSI摄像头最大的痛点!成像质量是真的差啊!(主要是光线不足)

CSI摄像头的介绍有一句是

Excellent resolution (higher than most USB webcams) and excellent daytime image quality.

看来它只有在光线比较好的情况下才能质量说得过去了。难怪motocoder在论坛里写

After several weeks of frustration with the Raspberry Pi Camera, I gave up on it and switched to a USB webcam. For those considering the camera board, I recommend you look into USB cameras as an alternative.

The primary reason that I switched was that the Raspberry Pi camera board has extremely bad low light issues. Trying to take a photo indoors, even with significant incandescent light, was resulting in black frames about 9 out of 10 times. 1 out of 10 times, it would produce a slightly underexposed photo instead, leading me to believe this might be a software bug rather than a hardware issue.

4.3 系统资源占用

测试3000帧图像,测试代码如下

import cv2
import time

videoIn = cv2.VideoCapture(0)
print("capture device is open: " + str(videoIn.isOpened()))
flag = 0
start = time.time()
success,frame = videoIn.read()
size = frame.shape
print(size)
while success:    
	#cv2.imshow('Test camera',frame)
	success,frame = videoIn.read()
	flag += 1
	if cv2.waitKey(1) & 0xFF == ord('q'):
		break
	if flag == 3000:
		end = time.time()
		print("3000 frames use time is (s)")
		print(end - start)
		break
videoIn.release()

4.3.1 CSI摄像头

运行这段代码使用了100秒,基本是30帧/s。使用htop命令查看占用资源情况,CPU占用率基本是在20%波动。
在这里插入图片描述

4.3.2 USB摄像头

USB摄像头运行了101秒(这个还算稳定,之前试过一个USB摄像头帧率极不稳定且帧率较低),CPU占用率则是在50%到80%波动。
在这里插入图片描述
USB摄像头通常是慢速、低帧率的,这一点是没有CSI那么好的。

4.3.3 二者对比

CSI摄像头USB摄像头
CPU占用率在10%~20%波动CPU占用率在50%~80%波动

二者的输入图像shape均为 (480,640,3)

可以看到,USB摄像头的CPU占用率是比较高的。RPi是没有足够的CPU能力更高的帧速率、分辨率或高级视频压缩的

而CSI摄像头使用树莓派的GPU的话,h.264编码视频对CPU使用率影响很小

4.4 使用体验

使用体验上,USB摄像头就基本上完虐CSI摄像头了

4.4.1 CSI摄像头

  1. 易碎,易静电击穿
  2. 需要特定的软排线,短,易折,不灵活
  3. 接口特定,不通用

对于电路板裸露在外这一点真的是需要格外小心!我就一不小心将电路板背面碰到了树莓派的以太网接口(是金属的),树莓派立刻down掉了,屏幕立刻黑掉,心痛地重启后所幸无碍,说明还是有电源保护的麽

不过,之后我就遇到了下面这个问题
VIDIOC_DQBUF: Resource temporarily unavailable

出这个问题的时候用的是另一个USB摄像头,换了本文的USB摄像头就不会出现这个问题。

出问题的摄像头在电脑上是能正常使用的,怀疑是异常掉电时它在树莓派该设备管理的缓存里面出了问题,先记录下来,之后尝试解决一下

4.4.2 USB摄像头

  1. 大多数头部都有某种类型的球头式安装,可以根据需要方便的调节摄像头的角度;
  2. 有比较长、比较灵活的USB线
  3. 即插即用,USB接口非常通用

5.其他

总结:双方各有优缺点吧,具体还是看你的需求选择一款。

目前,于我而言,USB摄像头占用这么多CPU资源实在是不能忍,我应该是要给CSI摄像头做个好的包装了:)

官方论坛的讨论
在这里插入图片描述
有问题多交流,可留言可发邮件,我的邮箱是zhaodongyu艾特pku(这里换成点)edu.cn。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐