注意:树莓派官方最新的系统2023-10-10开始将不在兼容国产ov5647芯片的摄像头模组
sudo apt-get update -y sudo apt-get upgrade -y如果使用的是OV9281, IMX290, IMX378, 或者非树莓派官方的IMX219和IMX477 摄像头需要另外配置config.txt 文件
sudo nano /boot/config.txt
在这里面找到camera-auto-detect=1 语句,修改为 camera_auto_detect=0
在文件结尾,根据摄像头型号加入以下设置语句
摄像机模块 | 在/boot/firmware/config.txt中 |
---|---|
V1 camera (OV5647) |
|
V2 camera (IMX219) |
|
总部相机(IMX477) |
|
GS相机(IMX296) |
|
Camera Module 3 (IMX708) |
|
IMX290 and IMX327 |
|
IMX378 |
|
OV9281 |
|
sudo libcamera-hello -t 0
如果要关掉预览窗口,可以直接组合按键Alt-F4,或者点击x关掉。 也可以回到终端界面,用ctrl-c终止程序。
注:如果是Camera module 3,会开启自动对焦功能
快速调用
适用于OV5647,官方IMX219,官方IMX477.打开树莓派终端,并开启摄像头预览:
sudo raspistill -t 0如果要关掉预览窗口,可以用ctrl-c终止程序。
树莓派镜像在Bullseye版本之后,底层的树莓派驱动由Raspicam切换成libcamera。libcamera是一个开源的软件栈(后面会称呼做驱动,方便理解),方便于第三方移植和开发自己的摄像头驱动。截止到20230207,官方已经针对libcamera提供了pycamera2库,方便用户使用Python程序调用
调用摄像头
libcamera软件栈提供了六个指令方便用户预览测试摄像头接口
libcamera-hello
这个是一个简单的“hello world" 程序,用来预览摄像头并将摄像头画面显示在屏幕上。
libcamera-hello这个指令会在屏幕上预览摄像头大概5秒时间,用户可以用-t <duration>参数来设置预览的时间, 其中<duration>的单位是毫秒,如果设置为0的话就是保持一直预览。比如:
libcamera-hello -t 0
libcamera-hello --tuning-file /usr/share/libcamera/ipa/raspberrypi/imx219_noir.json
libcamera-hello --info-text "focus %focus"
libcamera-jpeg -o test.jpg
libcamera-jpeg -o test.jpg -t 2000 --width 640 --height 480
libcamera-jpeg -o test.jpg -t 2000 --shutter 20000 --gain 1.5
libcamera-jpeg --ev -0.5 -o darker.jpg libcamera-jpeg --ev 0 -o normal.jpg libcamera-jpeg --ev 0.5 -o brighter.jpg
libcamera-still -o test.jpg
libcamera-still -e png -o test.png libcamera-still -e bmp -o test.bmp libcamera-still -e rgb -o test.data libcamera-still -e yuv420 -o test.data备注:图像保存的格式是通过-e参数控制的, 如果没有调用-e参数设置的话,默认按照输出的文件名的格式保存。
libcamera-still -r -o test.jpg原始图像一般是以DNG (Adobe digital Negative) 格式保存的,DNG格式可以兼容大部分标准程序, 比如dcraw 或者RawTherapee. 原始图像会被保存为.dng后缀的相同名字的文件,比如如果运行上面的指令,为被另存为test.dng, 并同时生成一张jpeg文件。DNG文件中包含了已图像获取有关的元数据, 比如白平衡数据,ISP颜色矩阵等, 下面是用exiftool工具显示的元数据编码信息:
libcamera-still -o long_exposure.jpg --shutter 100000000 --gain 1 --awbgains 1,1 --immediate备注:几款官方摄像头的最长曝光时间参考表格.
模块 | 最长曝光时间(s) |
---|---|
V1(OV5647) | 6 |
V2(IMX219) | 11.76 |
V3(IMX708) | 112 |
HQ(IMX477) | 670 |
libcamera-vid -t 10000 -o test.h264如果要查看视频可以用vlc来进行播放
vlc test.h264备注:录制的是未打包的视频流, 用户可以使用--save-pts 设置输出时间戳,方便后续将比特流转成其他视频格式。
libcamera-vid -o test.h264 --save-pts timestamps.txt如果想要输出mkv文件,可以用以下指令:
mkvmerge -o test.mkv --timecodes 0:timestamps.txt test.h264
libcamera-vid -t 10000 --codec mjpeg -o test.mjpeg libcamera-vid -t 10000 --codec yuv420 -o test.data
libcamera-vid -t 10000 --codec mjpeg --segment 1 -o test%05d.jpeg
libcamera-vid -t 0 --inline -o udp://<ip-addr>:<port>
vlc udp://@:<port> :demux=h264 vlc udp://@:<port> :demux=h264
libcamera-vid -t 0 --inline --listen -o tcp://0.0.0.0:<port>客户端(client)运行:
vlc tcp/h264://<ip-addr-of-server>:<port> #两条指令选一条即可
ffplay tcp://<ip-addr-of-server>:<port> -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
libcamera-vid -t 0 --inline -o - | cvlc stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/stream1}' :demux=h264播放端,可以运行以下任一条指令:
vlc rtsp://<ip-addr-of-server>:8554/stream1 ffplay rtsp://<ip-addr-of-server>:8554/stream1 -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
libcamera-vid --level 4.2 --framerate 120 --width 1280 --height 720 --save-pts timestamp.pts -o video.264 -t 10000 --denoise cdn_off -n
libcamera-raw -t 2000 -o test.raw
libcamera-raw -t 2000 --segment 1 -o test%05d.raw如果内存条件比较好(比如使用SSD), libcamera-raw可以以大概10帧每秒的速度将官方的HQ Camera的数据(大概18MB每帧)写入到硬盘中, 为了达到这个速度,程序写入的是没有格式化过的原始帧,没有办法像libcamera-still那样保存成DNG文件。 如果想要确保不出现丢帧的情况,可以使用--framerate 降低帧率。
libcamera-raw -t 5000 --width 4056 --height 3040 -o test.raw --framerate 8
--help, -h打印程序帮助信息,可以打印每个程序指令的可用设置选项,然后退出.
--version打印软件版本,打印libcamera和libcamera-app的软件版本,然后退出.
--list-cameras显示识别到的可支持的摄像头。 比如:
--camera
timeout=99000 verbose=
--config, -c一般情况下,我们可以通过指令直接设置摄像头参数,这里使用--config参数,可以指定设置文件,直接读取文件中的设置参数来对摄像头预览效果进行设置
--timeout, -t
--preview, -p
--fullscreen, -f
--qt-preview
--nopreview, -n
--info-text
--width --height
--viewfinder-width --viewfinder-height这个设置选项也是用来设置图像的分辨率,不同的是只设置的预览的图像大小。并不会影响最终输出的图像或者视频的分辨率。 预览图像大小的设备不会影响预览窗口尺寸,会根据窗口适配。
--rawfull
这个设置强制感光芯片活了--width和--height的设置, 在全分辨率读取模式下输出静态图像和视频。这个设置libcamera-hello无效。
使用该设置,会牺牲帧率。全分辨率模式下,帧读取速度会比较慢。
示例: libcamera-raw -t 2000 --segment 1 --rawfull -o test%03d.raw 示例指令会捕获多张全分辨率模式下的元数据帧。 如果你使用的是HQ摄像头。 每个帧的大小为18MB, 而如果没有设置--rawfull, HQ摄像头默认的是2x2模式, 每帧的数据大小只有4.5MB.
--mode
这个参数比rawfull更通用,用于设置摄像头模式,使用的时候,需要指定宽度,高度,位深度和打包模式,并用冒号分割。设置的数值不一定要完全精确,系统会自动匹配最接近的数值,另外位深度和打包模式是可设置的(默认为12 和 P 表示打包)
--viewfinder-mode #Specify sensor mode, given as <width>:<height>:<bit-depth>:<packing>--mode参数是用来在录制视频和拍摄静态图像的时候设置摄像头模式,如果想要在预览的时候设置,可以用--viewfinder-mode参数
--lores-width --lores-height这个两个选项设置低分辨率图像。 低分辨率数据流会压缩图像,导致图像的纵横比改变。在使用libcamera-vid录制视频的时候,如果设置了低分辨率,会禁用掉颜色去噪处理等功能。
--hflip #水平翻转图像 --vflip #垂直翻转图像 --rotation #根据给出的角度,水平或者垂直翻转图像 <angle>这三个选项用来翻转图像。 --rotation的参数目前只支持0 和180, 其实就是相当于--hflip和--vflip.
--roi #裁剪图像<x, y, w, h>--roi允许用户从传感器提供的完整图像中根据坐标裁剪自己想要的图像区域,也就是数字缩放,注意坐标值要是在有效范围的。 比如 --roi 0, 0, 1, 1就是无效的指令。
--hdr Run the camera in HDR mode (supported cameras only)hdr参数用来设置摄像头的宽动态模式。这个设置只有在摄像头支持宽动态的情况下才能生效。你可以使用--list-camera来查看摄像头是否支持hdr模式
--sharpness #设置图像的锐度 <number>通过<number>数值调整图像的锐度。 如果设置为0,就是不应用锐化。 如果设置的值超过1.0,会使用而外的锐化量。
--contrast #设置图像对比度 <number>示例: libcamera-still -o test.jpg --contrast 1.5
--brightness #设置图像亮度<number>设置范围是-1.0 ~ 1.0
--saturation #设置图像色彩饱和度 <number>示例:libcamera-still -o test.jpg --saturation 0.8
--ev #设置EV补偿<number>以光圈为单位来设置图像的EV补偿,设置范围是-10 ~ 10, 默认值是0. 程序通过提高获奖度AEC/AGC算法的目标方式来作用。
--shutter #设置曝光时间 ,单位是ms <number>注意:如果相机的帧率太快,可能会导致无法按照设定的快门时间工作,如果遇到这种情况,可以尝试用--framerate来降低帧速率。
--gain #设置增益值 (数值增益和模拟增益组合) <number> --analoggain #--gain的代名词--analoggain和--gain是一样的,使用analoggain只是为了兼容raspicam的程序。
--metering #设置测光模式 <string>
设置AEC/AGC算法的测光模式, 可用的参数有:
1.custom -自定义测光模式, 可以通过调谐文件设置
2.averag -平均或者全幅测光
3.spot -点测光
4.centre - 中心测光 (默认)
--exposure #设置曝光配置文件 <string>曝光模式可以设置为normal或者sport. 这两种模式的报告配置文件不会影响图像的整体曝光,但是如果是sport模式的话,程序会缩短曝光时间和提高正义来达到同样的曝光效果。
--awb #设置白平衡模式<string>
可用的白平衡模式:
模式 | 色温 |
---|---|
auto | 2500K ~ 8000K |
incadescent | 2500K ~ 3000K |
tungsten | 3000K ~3500K |
fluorescent | 4000K ~ 4700K |
indoor | 3000K ~ 5000K |
daylight | 5500K ~ 6500 K |
cloudy | 7000K ~ 8500K |
custom | 自定义范围, 通过调谐文件设置 |
示例: libamera-still -o test.jpg --awb tungsten
--awbgains #设置固定的颜色增益<number,number>设置红色和蓝色增益。
--denoise #设置去噪模式 <string>
--tuning-file #指定摄像头调谐文件 <string>关于更多调谐文件的说明, 可以参考官方教程
--autofocus-mode Specify the autofocus mode <string>
--autofocus-range Specify the autofocus range <string>
--autofocus-speed Specify the autofocus speed <string>设置对焦速度。
--autofocus-window --autofocus-window显示对焦窗口,需要设置x,y,width, height, 其中的坐标值设置是根据图像的比例来的。比如--autofocus-window 0.25,0.25,0.5,0.5 会设置一个窗口,这个窗口大小是图像的一半,并且在居中位置。
--lens-position Set the lens to a given position <string>
--output, -o #输出文件名 <string>
--wrap #将输出文件计数器打包<number>示例: libcamera-vid -t 0 --codec mjpeg --segment 1 --wrap 100 -o image%d.jpg
--flush #马上刷新输出文件
--qiality, -q #设置JPEG图像质量 <0 ~ 100> --exif, -x #添加而外的EXIF标志 --timelapse #延时拍照的时间间隔, 单位是ms --framestart #帧计数的开始数值 --datetime #用日期格式命名输出文件 --timestamp #用系统时间戳命名输出文件 -- restart #设置JPEG重启时间间隔 --keypress, -k # 设置回车按键拍照模式 --signal, -s #设置信号触发拍照 --thumb #设置缩略图参数 <w:h:q> --ebcoding, -e #设置图像编码类型。 jpg / png / bmp / rgb / yuv420 --raw, -r #保存原始图像 --latest #关联符号到最新保存的文件 --autofocus-on-capture #设置在拍照前做一次对焦动作视频录制图像设置参数
--quality, -q # 设置JPEG指令 <0 - 100> --bitrate, -b # 设置H.264比特率 --intra, -g #设置内部帧周期 (只支持H.264) --profile #设置H.264配置 --level #设置H.264等级 --codec #设置编码类型 h264 / mjpeg / yuv420 --keypress, -k #设置回车暂停和录制 --signal, -s #设置信号暂停和录制 --initial #在录制或者暂停状态下启动程序 --split #切割视频并保存到另外的文件 --segment #将视频分割成多个视频段 --circular #将视频写入循环缓冲区中 --inline #在每个I帧中写入数据头(只支持H.264) --listen #等待TCP连接 --frames #设置录制的帧数
sudo apt-get update cd sudo apt install cmake git clone https://github.com/raspberrypi/userland cd userland ./buildme cp build/bin/* ~/bin/按照后之后需要重启系统
sudo reboot调用摄像头
--preview, -p #设置预览窗口<x, y, w, h> 用户可以通过设置x, y的值来设置预览窗口的位置, 设置w, h的值来调整预览图像的分辨率。 --fullscreen, -f #全屏预览窗口 将预览窗口全屏显示 --nopreview, -n #不显示预览窗口 关掉预览窗口,指令会直接输出图像或者视频到文件。 --opacity, -op #设置预览窗口透明度 设置预览窗口的透明度, 0 是不可见, 255 是全透明 --sharpness, -sh #设置图像锐度 (-100 - 100) 默认锐化值为0 --contrast. -co #设置图像对比度 (-100 - 100) 默认的对比度为0 --brightness, -br #设置图像对比度 (0 - 100) 默认亮度为50, 0是全黑,100是全白。 --saturation, -sa #设置图像饱和度 (-100 - 100) 默认饱和度是0 --ISO #设置快门感光度 (100 - 800) 设置拍照时的感光度 --vstab, -vs #开启视频稳定 只有视频录制模式有效,开启视频防抖。 --ev #设置EV补偿 设置图像的EV补偿值, 默认0 --exposure, -ex #设置曝光模式可设置的曝光选项:
--flicker, -fli #闪烁避免可设置的模式:
--awb, #设置自动白平衡模式
--imfx, -ifx #设置图像滤镜效果可设置的图像滤镜效果:
--colfx, -cfx #设置颜色效果<U:V>U和V参数的设置范围是 0 ~ 255, 用来调整U和Y通道的数值。 比如: --colfx 128:128 会讲图像设置成单色图。
--metering, -mm #设置测光模式
--rotation, -rot #设置图像旋转 (0 - 359)可以通过角度参数设置图像旋转角度
--hflip, -hf #设置图像水平翻转设置图像水平翻转
--vflip, -vf #设置图像垂直翻转垂直翻转图像
--roi, #裁剪图像 <x, y, w, h>根据参数裁剪图像,注意参数都是规划化在(0,0 ~ 1.0), 比如,如果要裁剪1/4图像,可以用指令 -roi 0.5,0.5,0.25,0.25
--shutter, --ss 设置快门速度/时间
设置快门时间(单位:ms)。 快门时间根据感光芯片的不同,可设置的最大快门时间不同。
型号 | 最大数字(ms) |
---|---|
V1 (OV5647) | 6000000 (6s) |
V2 (IMX219) | 10000000 (10s) |
HQ (IMX477 | 200000000 (200s) |
--drc, -drc #启用/关闭动态范围压缩
--stats, -st #通过静态图像帧来统计图像
--awbgains, -awbg设置蓝色和绿色增益, 在设置 --awb off 的情况下生效
--analoggain, -ag设置模拟增益值
--digitalgain, -dg设置数字增益值
--mode, -md设置传感器模式:
--camselect, -cs当系统接入多个摄像头时,选择摄像头, 0 或 1.
--annotate, -a #启用/设置注释在元数据中使用位掩码的方式来表示参数,可以直接用加法表示。 比如, 12 可以表示显示时间(4)和显示日期 (8), 就是通过加法 4+8 =12表示的。
--annotateex, -ae #设置额外注解参数
--stereo, -3d
设置双目模式。
--decimate, -dec将双目图像的宽度和高度减半
--setting, -set输出当前的摄像头设置
--width, -w #设置图像宽度 --height, -h #设置图像高度 --quality, 0q #设置JPEG质量 <0 ~ 100> --raw, -r #将原Bayer数据添加到JPEG元数据中 --output, -o #输出文件 <filename> --latest, -l #关联最后一帧图像到文件 <filename> --verbose, -v #打印详情 --timeout, -t #设置程序预览时间 --timelapse, -tl #设置演示摄影 --framestart, -fs #保存第一帧的编号 --datetime, -dt #用日期时间命名文件 --timestamp, -ts #用时间戳命名文件 --thumb, -th #设置缩略图参数 <x:y:qulity>, 默认为(64:48:35) --demo, -d #运行演示模式<ms》 --encoding, -e #按照指定格式编码, jpg, bmp或者png --restart, -rs #设置JPEG重启标志 --exif, -x #设置EXIF标记 --gpsdexif, -gps #设置实时exif 时间 (需要有GPS Dongle接入) --fullpreview, -fg #全屏预览 --keypress, -k #按键拍照模式 --signal, -s # 信号模式 --burst, -bm #抓拍模式raspivid 设置参数
--width, -w #设置视频宽度 --height, -h #设置视频高度 --bitrate, -b #设置比特率 --output, -o #设置输出文件名 <filename> --listen, -l #使用网络连接的时候,等待网络连接 --versbose, -v #打印详情 --timeout, -t #设置预览时间 --demo, -d #运行演示 <ms> --framerate, -fs #设置帧率 --penc, -e #显示编码后的预览图像 --intra, -g #设置内部刷新周期 --qp, -qp #设置量化参数 --profile, -pf #指定H264配置文件, baseline / main / high --level, -lev #设置H264编码等级 --irefresh, -if #设置 H264内部刷新类型 cyclic / adaptive / both / cyclicrows --inline, -ih #插入PPS,SPS头 --spstimings, -stm #将时序信息插入到SPS块中 --timed, -td #定时切换录制和暂停功能 --keypress, -k #按键暂停录制 --signal, -s #根据SIGUSR1 切换暂停和录制状态 --split, -sp #在signal和keypress 模式下,每次重新录制的时候都会重新创建文件 --vectors, -x #矢量输出 --flush, -fl #写入视频数据后立即强制刷新输出数据缓冲区, 绕过了写入数据的任何操作系统缓存,并且可以减少延迟。 --save-pts, -pts #将时间戳信息保存到指定文件。 --codec, -cd # 指定编码器 H264 / MJPEG --initial, -i #设置启动是的初始状态 --segment, -sg #将视频流分割到多个文件中 --wrap, -wr #设置分割的最大值 --start, -sn #设置初始分割编码 --raw, -r #设置元数据文件名 --raw-format, -rf #指定元数据格式 yuv / rgb / grey