树莓派(5):CSI摄像头 vs USB摄像头
CSI摄像头 vs USB摄像头
0. 前言
树莓派的CSI原装摄像头与普通USB摄像头有何区别?
CSI摄像头有何优缺点?我们在选择时该选哪一种?
最近做某个项目的加速时,产生了这样的疑问,于是开始比较一下这两种摄像头。
1. 准备工作
我是在python3环境下调用opencv对两款摄像头进行测评
所以需要以下准备:
-
Enable Camera
点击左上角树莓派 --> Preference --> Raspberry Configuration,使能Camera,之后重启树莓派。 -
安装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摄像头
- 易碎,易静电击穿
- 需要特定的软排线,短,易折,不灵活
- 接口特定,不通用
对于电路板裸露在外这一点真的是需要格外小心!我就一不小心将电路板背面碰到了树莓派的以太网接口(是金属的),树莓派立刻down掉了,屏幕立刻黑掉,心痛地重启后所幸无碍,说明还是有电源保护的麽
不过,之后我就遇到了下面这个问题
VIDIOC_DQBUF: Resource temporarily unavailable
出这个问题的时候用的是另一个USB摄像头,换了本文的USB摄像头就不会出现这个问题。
出问题的摄像头在电脑上是能正常使用的,怀疑是异常掉电时它在树莓派该设备管理的缓存里面出了问题,先记录下来,之后尝试解决一下
4.4.2 USB摄像头
- 大多数头部都有某种类型的球头式安装,可以根据需要方便的调节摄像头的角度;
- 有比较长、比较灵活的USB线
- 即插即用,USB接口非常通用
5.其他
总结:双方各有优缺点吧,具体还是看你的需求选择一款。
目前,于我而言,USB摄像头占用这么多CPU资源实在是不能忍,我应该是要给CSI摄像头做个好的包装了:)
附官方论坛的讨论
有问题多交流,可留言可发邮件,我的邮箱是zhaodongyu艾特pku(这里换成点)edu.cn。
更多推荐
所有评论(0)