15. 摄像头

本章配套视频介绍:

../../_images/video.png

《40-在鲁班猫上使用摄像头》

https://www.bilibili.com/video/BV1q14y1275u/

LubanCat-RK356x系列板卡使用的摄像头接口是24pin mipi接口,目前适配了ov5648/ov8858摄像头,以及树莓派OV5647的摄像头(需要搭配转接板使用)

除了mipi摄像头外,LubanCat-RK356x系列板卡还支持UVC摄像头,如果你想购买uvc摄像头,可以前往模块推荐列表去选择

注意

RK3528系列不支持摄像头

接口的附近都会带有 mipi csi 字眼,接口图如下

can not find

注意

排线的金属引脚需要朝向板子

连接图如下

can not find

15.1. 配置摄像头

注解

6月8日后的镜像支持摄像头设备树插件,旧镜像没有摄像头的设备树插件的,旧镜像安装摄像头即可使用

本小节讲解6月8日后的镜像如何使用设备树插件来配置摄像头

15.1.1. 单摄

  1. 打开鲁班猫的配置文件

1
2
3
4
#修改配置文件
vi /boot/uEnv/uEnv.txt

#移动光标就可以看到下图
can not find

可以看到目前四款支持设备树插件的设备,ov5647,ov5648,ov8858和sc132gs

  1. 开启摄像头

  • 开启摄像头仅需把设备树插件前面的 # 删除即可,如下图打开ov8858的摄像头

can not find
  1. 关闭摄像头

  • 关闭摄像头仅需在设备树插件前面添加 # 即可,如下图关闭ov8858的摄像头

can not find
  1. 修改完配置文件后,需要先保存配置文件,然后重启才能生效

15.1.2. 双摄

目前支持双摄的设备有LubanCat2IO,即BTB的底板和金手指的底板

15.1.2.1. 仅开启cam0

  1. 打开鲁班猫的配置文件

1
2
3
4
#修改配置文件
vi /boot/uEnv/uEnv.txt

#移动光标就可以看到下图
can not find

可以看到目前四款支持设备树插件的设备,ov5647,ov5648,ov8858和sc132gs

  1. 开启摄像头

  • 开启摄像头仅需把设备树插件前面的 # 删除即可,如下图打开ov8858的摄像头

can not find
  1. 关闭摄像头

  • 关闭摄像头仅需在设备树插件前面添加 # 即可,如下图关闭ov8858的摄像头

can not find
  1. 修改完配置文件后,需要先保存配置文件,然后重启才能生效

15.1.2.2. 仅开启cam1

注解

目前cam1仅支持ov5648和ov8858

  1. 打开鲁班猫的配置文件

1
2
3
4
#修改配置文件
vi /boot/uEnv/uEnv.txt

#移动光标就可以看到下图
can not find

虽然设备树插件可以看到四个设备树插件,但实际仅支持ov5648和ov8858

  1. 开启摄像头

  • 开启摄像头仅需把设备树插件前面的 # 删除即可,如下图打开ov8858的摄像头

can not find
  1. 关闭摄像头

  • 关闭摄像头仅需在设备树插件前面添加 # 即可,如下图关闭ov8858的摄像头

can not find
  1. 修改完配置文件后,需要先保存配置文件,然后重启才能生效

15.1.2.3. 双摄同时开启

注意

目前双摄的同时开启仅适用于ov5648和ov8858

  1. 打开鲁班猫的配置文件

1
2
3
4
#修改配置文件
vi /boot/uEnv/uEnv.txt

#移动光标就可以看到下图
can not find

虽然设备树插件可以看到四个设备树插件,但实际仅支持ov5648和ov8858

  1. 开启摄像头

  • 开启摄像头仅需把设备树插件前面的 # 删除即可,如下图双摄同时打开ov8858的摄像头

can not find
  1. 关闭摄像头

  • 关闭摄像头仅需在设备树插件前面添加 # 即可,如下图双摄同时关闭ov8858的摄像头

can not find
  1. 修改完配置文件后,需要先保存配置文件,然后重启才能生效

15.2. 查看摄像头信息

15.2.1. 列出摄像头设备

1
v4l2-ctl --list-devices

单个摄像头如下图

can not find
  • 其中/dev/video0就是这个摄像头的设备

双摄像头同时开启如下图

can not find
  • 其中/dev/video5就是cam0的设备,/dev/video14就是cam1的设备

15.2.2. 查看摄像头格式和分辨率

1
2
#查看支持的格式
v4l2-ctl --list-formats-ext --device=/dev/video0

命令输出如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cat@lubancat:~$ v4l2-ctl --list-formats-ext --device=/dev/video0
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture Multiplanar

[0]: 'UYVY' (UYVY 4:2:2)
        Size: Stepwise 32x16 - 1296x972 with step 8/8
[1]: '422P' (Planar YUV 4:2:2)
        Size: Stepwise 32x16 - 1296x972 with step 8/8
[2]: 'NV16' (Y/CbCr 4:2:2)
        Size: Stepwise 32x16 - 1296x972 with step 8/8
[3]: 'NV61' (Y/CrCb 4:2:2)
        Size: Stepwise 32x16 - 1296x972 with step 8/8
[4]: 'YM16' (Planar YUV 4:2:2 (N-C))
        Size: Stepwise 32x16 - 1296x972 with step 8/8
[5]: 'NV21' (Y/CrCb 4:2:0)
        Size: Stepwise 32x16 - 1296x972 with step 8/8
[6]: 'NV12' (Y/CbCr 4:2:0)
        Size: Stepwise 32x16 - 1296x972 with step 8/8
[7]: 'NM21' (Y/CrCb 4:2:0 (N-C))
        Size: Stepwise 32x16 - 1296x972 with step 8/8
[8]: 'NM12' (Y/CbCr 4:2:0 (N-C))
        Size: Stepwise 32x16 - 1296x972 with step 8/8
[9]: 'YU12' (Planar YUV 4:2:0)
        Size: Stepwise 32x16 - 1296x972 with step 8/8
.
.
.

可以看到当前摄像头支持UYVY、422P、NV16等格式,支持的最大分辨率为1296x972。

重要

无论是否接上摄像头,系统里/dev/video0都是存在的,如果接上摄像头,查看摄像头最大分辨率是800*600,而实际参数不是该值,则可能当前摄像头不是video0,或者摄像头的硬件连接或者驱动有问题。

15.2.3. 查看摄像头支持的配置参数

1
2
#查看摄像头支持的配置参数
v4l2-ctl -d /dev/video0 -L
can not find

参数说明如下:

参数

说明

exposure

曝光度,用于控制相机的曝光水平。

focus_absolute

对焦程度,用于调整相机的对焦状态。

vertical_blanking

垂直空白时间,指相机图像帧的垂直同步信号之间的时间,一般用于计算图像帧率。

horizontal_blanking

水平空白时间,指相机图像帧的水平同步信号之间的时间,一般用于计算图像帧率。

analogue_gain

模拟增益,用于增强相机对光线的捕捉能力。

link_frequency

链接频率,用于控制数据在不同设备间传输的速度。

pixel_rate

像素速率,用于表示相机输出图像的数据传输速率。

test_pattern

测试图案,用于在关闭相机时进行测试,以确保相机功能正常。

以上参数为ov8858的可设置参数,每个参数都有默认值(default)和当前值(value),如果使用不同摄像头则很可能可设置参数和默认配置不同。

ov8858摄像头支持通过瑞芯微的3A服务自动调节焦距、白平衡等参数,如果需要手动调节以上参数,参考如下命令。

1
2
#调节摄像头模拟增益为500
v4l2-ctl -d /dev/video0 -c analogue_gain=500

注意

有些摄像头不支持自动调参,则需要我们手动调节参数到合适的值,否则摄像头获取到的图像将异常。该类摄像头调参参考本章手动调节摄像头参数小节。

15.3. 命令行拍摄视频

1
2
3
4
5
6
7
8
#拍摄视频
v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=800,height=600,pixelformat='NV12' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=800,height=600 --stream-to=out.yuv

#播放视频

ffplay -f rawvideo -video_size 800x600 -pixel_format nv12 out.yuv

#out.yuv 便是拍摄出来的视频了

15.4. 命令行拍摄照片

1
2
3
4
#拍摄照片
sudo gst-launch-1.0 v4l2src num-buffers=1 device=/dev/video0 ! jpegenc ! filesink location=picture.jpg

#picture.jpg就是拍摄出来的照片了

15.5. 桌面端拍摄-guvcview

guvcview是一个功能十分强大的摄像头预览和拍摄软件。

1
2
3
#安装软件
sudo apt update
sudo apt install guvcview

15.5.1. 双摄预览使用方法

  • 桌面端打开guvcview,如下图

can not find
  • 然后会碰到找不到设备,点击设备的选项,自动选择,如下图

can not find
  • 在列出的设备里面,有两个是真正的摄像头的设备,他们的命名都是 rkisp_mainpath 只能通过先后顺序判断他们是哪个设备, 排在前面的是CAM0,排在后面的是CAM1, 选择其中一个设备,然后打开

can not find
  • 打开设备后就会看到下图的繁荣景象

  • image_control,可以调整预览图像的显示情况,间接控制摄像头的驱动。

can not find
  • 第一次打开设备,图像的预览窗口的分辨率会很低,需要在 video_control 里修改

  • video_control 的使用如图下

can not find
  • 调整完成后,一个摄像头就调整结束了,然后可以重复上述操作打开另一个摄像头

  • 两个摄像头同时预览的效果图如下

can not find

15.6. 桌面端拍摄-cheese

注意

cheese的功能比较单一,没办法对双摄进行预览

我们要使用的软件是系统自带的—-cheese,这是一个包含预览以及拍摄的软件

15.6.1. 打开方式

进入桌面系统,点击左上方的按钮,找到cheese

can not find

cheese的界面如图下所示:

can not find

我们可以通过更改设置去修改拍摄的分辨率

can not find

拍照样张展示:

can not find

15.7. 手动调节摄像头参数

有些摄像头不支持自动调参,则需要我们手动调节参数到合适的值,否则摄像头获取到的图像将异常。

以下使用树莓派ov5647作为说明,使用的具体型号为Camera(B) Rev2.0,实物图如下所示:

can not find

该摄像头默认不支持自动调参,如果使用默认配置,则获取到的图像偏暗偏绿,如下图所示:

can not find

原因在于该摄像头不支持3A服务,需要手动配置参数,而原来的默认参数很糟糕,导致图像异常。

15.7.1. 查看摄像头支持的配置参数

1
2
#查看摄像头支持的配置参数
v4l2-ctl -d /dev/video0 -L

摄像头可配置参数如下图所示:

can not find

参数说明如下:

参数

说明

white_balance_automatic

白平衡自动控制开关,0 表示关闭,1 表示开启。

exposure

曝光时间,单位是微秒。通过适当调节曝光时间可以改变图像的亮度。

gain_automatic

增益自动控制开关,0 表示关闭,1 表示开启。

horizontal_flip

水平翻转开关,0 表示关闭,1 表示开启。

vertical_flip

垂直翻转开关,0 表示关闭,1 表示开启。

auto_exposure

自动曝光模式切换,0 表示自动模式,1 表示手动模式。

vertical_blanking

垂直消隐时间,单位为行数。

horizontal_blanking

水平消隐时间,单位为像素数。

analogue_gain

模拟增益控制,可以通过调节该参数来改变图像的亮度。

link_frequency

接口频率,影响视频传输速率,根据不同的频率可以选择不同的传输速率。

可以发现该摄像头和前面提到的ov8858摄像头的参数不同,多了几个控制开关如下:

  • white_balance_automatic :白平衡自动控制开关

  • gain_automatic :增益自动控制开关

  • auto_exposure :自动曝光模式切换

并且我们可以发现以上自动控制开关的值都为0,默认处于关闭状态。

值得说明的是图像偏绿是没有开启白平衡调节导致,图像偏暗是增益和曝光时间参数不对导致。

我们打开这些自动控制开关,再尝试获取摄像头图像,使用如下命令修改配置:

1
2
3
4
5
6
#打开白平衡自动控制开关
v4l2-ctl -d /dev/video0 -c white_balance_automatic=1
#打开增益自动控制开关
v4l2-ctl -d /dev/video0 -c gain_automatic=1
#打开自动曝光模式切换
v4l2-ctl -d /dev/video0 -c auto_exposure=1

重新获取到的图像如下:

can not find

可以发现图像颜色正常,但略微模糊,我们可以调节镜头焦距使我们想拍摄的物体清晰。笔者使用的摄像头需要拧松固定螺丝,然后旋转镜头从而调节焦距。

can not find

调节焦距,拍摄一个物体进行实际测试,如下图所示:

can not find

除了上述可以打开自动控制开关,我们也可以手动调节参数进行微调。

使用如下命令关闭增益和曝光自动控制开关,而白平衡自动控制开关不能关闭,因为没有提供白平衡相关设置。

1
2
3
4
5
6
7
8
9
#关闭增益自动控制开关
v4l2-ctl -d /dev/video0 -c gain_automatic=0
#关闭自动曝光模式切换
v4l2-ctl -d /dev/video0 -c auto_exposure=0

#设置曝光时间
v4l2-ctl -d /dev/video0 -c exposure=1964
#设置模拟增益
v4l2-ctl -d /dev/video0 -c analogue_gain=150

需根据实际情况不断调节参数才能获取到清晰的图像。