CS-MIPI-X for Raspberry Pi/zh
1 概述
CS-MIPI-X 摄像头模组理论上支持树莓派的所有型号,出于性能最优考虑,建议使用树莓派3以后的版本。本篇文章以树莓派4为例讲解CS-MIPI-X系列摄像头模组接入树莓派的方法。此外介绍了接入树莓派Computer Module与树莓派Zero应用中的特殊之处。
2 关于piOS版本---Bullseye
The latest system of Raspberry Pi - bullseye has removed the support of raspicam by default. But we still have 2 ways to use it.
最新版本的piOS——Bullseye默认去掉了raspicam的支持。但是我们依然有两种方法来使用。
- 1, 使用 legacy 版本的 piOS,也就是说,不升级到Bullseye。
https://www.raspberrypi.com/software/operating-systems/
- 2, 在Bullseye版本上,打开Open legacy camera的支持。我们已经升级了程序以适应这种应用。
If you want to add the legacy camera interfaces to Bullseye, please click your update icon in the taskbar to update. Then open a terminal (Ctrl-Alt-T) and type ‘sudo raspi-config’, go to ‘Interface Options’ and then ‘Legacy Camera’, and reboot. These camera interfaces are deprecated, and we are not supporting them going forwards.
https://www.raspberrypi.com/news/new-old-functionality-with-raspberry-pi-os-legacy/
使用如下命令查看当前系统版本:
lsb_release -a
3 硬件准备及安装
原材料:树莓派4,网线,Micro SD卡,树莓派电源线,HDMI显示器,FFC线,杜邦线,镜头,摄像头主板。
- 如图所示,摄像头主板通过FFC异面线及图中的杜邦黑红线连接到树莓派上,黑线连接GND接口,红线连接5V接口。
- 树莓派接好摄像头模组后,将烧录好树莓派系统的MicroSD卡插入卡槽,网线插入网线接口,HDMI显示器接入树莓派,电源线插入power接口,为树莓派接通电源。
- CS-MIPI-SC132默认供电方式为FFC排线3.3V供电,无需插红黑电源线。
4 树莓派系统安装及配置
具体安装树莓派系统方法请参考官方文档,详见:Install raspberrypi guide。
接通电源后,树莓派系统启动,初始树莓派系统中Camera 和 I2C都处于未启用状态。开机后我们需要将其手动打开,执行命令
sudo raspi-config
进入选项5,启用Camera 和 I2C,然后重启。
建议启用树莓派系统的ssh服务及samba服务,这里不再赘述树莓派系统如何开启ssh和samba服务。
5 软件包下载与介绍
5.1 有两种方式下载及传输软件包到树莓派
- 执行命令行
git clone https://github.com/veyeimaging/raspberrypi.git
直接将文件复制到树莓派系统中。
- 点击链接下载软件包
利用samba将软件包文件传输至树莓派系统中,也可用U盘将软件包文件拷贝至树莓派系统中。
5.2 软件包介绍
- 软件包包括视频流软件包和视频控制软件包。i2c_cmd为视频控制接口软件包。视频流接口软件包有两个,veye_raspcam为raspcam type工具集。D_mipi_rpi为D-SDK软件包,提供了C语言的SDK并由C语言和python语言的demo。
- 视频流软件包提供实时显示、抓拍、录像等功能,视频控制软件包通过I2C协议控制摄像机模组,提供主要的ISP参数配置等功能。
这两部分都是开源的。
6 视频流软件包使用
6.1 视频码流模式的说明
veye type工具集支持多种码流模式,如1080p@30fps,720p@60fps等。
请先使用cs_mipi_i2c.sh 的videofmtcap和videofmt指令配置和确认当前模式。
6.1.1 方式1:-md选项指明模式
-md 选项用以指明使用的模式,默认为0。
md 值 | 模式类型 |
---|---|
0 | 1080p@30fps |
1 | 720p@60fps |
2 | VGA@130fps |
6.1.2 方式2:-w -h选项指明模式
-w选项指明当前模式的宽,-h选项指明当前模式的高。
6.2 raspicam type工具集
首先增加可执行权限
cd raspberrypi/veye_raspcam/bin/
chmod +x *
6.2.1 veye_raspipreview 实时预览
./veye_raspipreview -t 20000 -md 1 -p '0,0,1280,720'
实现20s(即20000毫秒)的720p@60视频实时显示到HDMI输出,输出窗口为1280*720,可以自行调节t的大小和输出窗口。
./veye_raspipreview -t -1
将t调节成 -1,可以实现视频持续输出显示到HDMI输出,全屏显示。
6.2.2 veye_raspivid 录像
./veye_raspivid -t 5000 -w 1280 -h 720 -fps 60 -stm -o ~/test.h264
实现录像5s,码流模式为720p@60, 录像文件保存到~/test.h264。可以自行调节t的大小来选择录制时间的长短。
与此同时,实现视频实时显示到HDMI输出。(如不需要preview功能,可以添加 -n 选项)
6.2.3 veye_raspivid 网络传输(gstreamer,推荐使用)
树莓派一侧执行
./veye_raspivid -b 4000000 -t 0 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=x.x.x.x port=5000
码流带宽为4Mbps,持续传输,监听端口为5000。
电脑一侧,如为windows系统,建议使用powershell。
电脑一侧使用gstreamer
gst-launch-1.0 -v tcpclientsrc host=x.x.x.x port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! autovideosink sync=false
其中x.x.x.x为树莓派的IP地址
gstreamer的windows版本下载地址。只安装runtime files即可。
6.2.4 veye_raspivid 网络传输(direct tcp stream with netcat)
树莓派一侧执行
./veye_raspivid -b 4000000 -t 0 -o - | nc -l -p 5000
码流带宽为4Mbps,持续传输,监听端口为5000。
电脑一侧,如为windows系统,建议使用powershell。
电脑一侧使用gstreamer
./gst-launch-1.0 -v tcpclientsrc host=x.x.x.x port=5000 ! decodebin ! autovideosink
电脑一侧使用mplayer
./mplayer -x 1280 -y 720 -geometry 0:0 -fps 200 -demuxer h264es -noborder ffmpeg://tcp://x.x.x.x:5000
其中x.x.x.x为树莓派的IP地址
mplayer for windows 下载地址。
6.2.5 veye_raspividyuv YUV图片连续存储
./veye_raspividyuv -t 200 -o /dev/shm/test.yuv
实现录像yuv格式数据200ms,录像文件保存到/dev/shm/test.yuv,存储格式为YUV420 I420 格式。可以自行调节t的大小来选择录制时间的长短。
6.2.6 veye_raspstillyuv YUV图片单张抓拍
./veye_raspistillyuv -md 1 -o /dev/shm/test.yuv
实现抓拍一张图片存储到/dev/shm目录(内存文件系统),图片为720p大小。 然后客户可以导出并查看。文件格式为1920*1080大小的yuv数据。存储格式为YUV420 I420 格式。
./veye_raspistillyuv -tl 50 -t 1000 -o /dev/shm/test%d.yuv
实现间隔50ms抓拍一张图片存储到/dev/shm目录(内存文件系统),持续1秒,然后客户可以导出并查看。文件格式为1920*1080大小的yuv数据。存储格式为YUV420 I420 格式。
6.2.7 veye_raspistill 抓拍(JPG,bmp)
./veye_raspistill -md 0 -o ~/test.jpg
实现抓拍一张图片,图片为1920*1080,并保存,文件格式为jpg。
./veye_raspistill -e bmp -tl 50 -t 1000 -o /dev/shm/test%d.bmp
实现间隔50ms抓拍一张bmp图片存储到/dev/shm目录(内存文件系统),持续1秒,然后客户可以导出并查看。
./veye_raspistill -k -o ~/test%d.jpg -t 0
实现视频预览,同时通过键盘控制抓拍,Enter键抓拍一张,X Enter退出。
veye_raspistill命令支持preview,-n可以取消preview。
6.3 D-SDK软件包
提供了一个C语言的SDK库libdmipicam.so,以及基于这个库的C语言sample和python语言sample。
6.3.1 安装底层支持库
sudo apt-get update && sudo apt-get install libopencv-dev
sudo apt-get install python-opencv
sudo apt-get install libzbar-dev
6.3.2 分辨率模式说明
D-SDK并不对模组做任何参数配置,对模组的参数配置参考:Video Control Toolkits Manual : CS-MIPI-X i2c。
D_init_camera_ex 函数的pvideofmt参数需要与当前模组分辨率模式一致。
./cs_mipi_i2c.sh -r -f videofmt
6.3.3 SDK
- 接口:
开放源码,详见D_mipicam.h
- 编译:
./buildme
- 安装:
sudo install -m 644 ./libdmipicam.so /usr/lib/
6.3.4 C sample
- preview
实现实时视频预览
- preview-dualcam
实现两路摄像头同时视频预览(RPI CM)
- video
视频压缩为H.264并保存为文件
- capture
抓拍一张jpeg图片
- video2stdout
视频压缩并输出到stdout为管道应用服务,如下命令,可达到与veye_raspivid命令类似的效果。
./video2stdout | nc -l -p 5000
- capture_yuv
抓拍一张YUV图片
- capture-dualcam
两路摄像头同时抓拍jpeg图片
- yuv_stream
导出yuv格式的原始数据
- capture2opencv
连续获取YUV数据并转为opencv格式,显示。
- qrcode_detection
连续抓拍YUV数据并转为opencv格式,显示,并进行二维码检测。
6.3.5 Python sample
- preview.py
实现实时视频预览
- capture.py
抓拍一张jpeg图片
- capture_yuv.py
抓拍一张yuv图片
- video.py
视频压缩为H.264并保存为文件
- capture2opencv.py
连续获取YUV数据并转为opencv格式,显示。
7 视频控制软件包使用
视频控制软件包实际上是一个i2c命令的shell脚本,在i2c_cmd目录下。
对于树莓派,我们使用I2C-0作为控制总线。我们提供了一个脚本camera_i2c_config进行总线的管脚复用配置。
具体使用说明请见:I2C脚本使用说明
PS:新版本PiOS需要使用i2c-10,如果i2c-0不通,请尝试 -b 10。