Jade Dungeon

树莓派摄像头

安装

pi.cam

pi.cam

pi.cam

默认禁用摄像头。要在rasp-config 中 interface config 打开摄像头支持。

sudo raspi-config

依次选择:「Interfacing Options」 > 「Camera」

拍照

raspistill拍照

测试摄像头:

raspistill -t 2000 -o test.jpg
  • -t:延时,单位为毫秒
  • -o:保存文件

https://www.cnblogs.com/uestc-mm/p/7587783.html

这里讲一下raspistill命令的相关参数和实验的具体效果:

  • -t:获取图像前等待时间,单位为毫秒。默认为5000,即5秒
  • -tl:多久执行一次图像抓取
  • -o:图像输出地址,例如image.jpg,如果文件名为-,将输出发送至标准输出设备
  • -q:quality质量的意思越大文件占用存储空间越大,自己根据满意的画面质量设置吧,挨个试。 数值8是我尝试出来的画面质量还可以而且占用空间仅有大约52k;
  • -w:图像宽度
  • -h:图像高度
  • -rot:图像旋转角度,只支持 0、90、180、270 度(这里说明一下,测试发现其他角度的输入都会被转换到这四个角度之上)
  • -v:调试信息查看

例如,执行下面的指令:

raspistill -o image%d.jpg -rot 180 -w 1024 -h 768 -t 20000 -tl 5000 -v

注:这里解释一下图片的采集数量\(N\)、拍摄时间\(t\)和拍摄间隔\(tl\)的相关关系:

\[ n = \frac{t}{tl} + 1 \]

所以有\(\frac{20000}{5000} +1 = 5\)张图片

接着下面就会输出一系列的捕获的信息,如图片的大小,图片的总捕获时间,图像是否旋转,是否水平反转垂直反转

在光线较弱的情况下画面会偏黄,我们通过命令修改代码可以自动调节(毕竟就只有30来块钱)

raspistill -o my_photo.jpg -rot 180 -w 1024 -h 768 -t 2000 -q 8 \
	-br 62 -awd auto -ex auto

参数说明

图像参数与命令:

-? --help 帮助文档
-w --width 设置图像宽度 <尺寸>
-h --height 设置图像高度 <尺寸>
-q --quality 设置jpeg品质 <0到100>
-r --raw 增加raw原始拜尔数据到JPEG元数据
-o --output 输出文件名 <文件名>,如果要写到stdout,使用-o -,如果不特别指定,图像文件不会被保存
-l --latest 链接最近的完整图像到指定文件 <文件名>
-v --verbose 在运行摄像头时输出详细信息
-t --timeout 拍照和关闭时的延时指定,未指定时默认是5s
-d --demo 运行一个demo模式(cycle through range of camera options, no capture),括号里的我可以理解成循环测试模式吗?
-e --encoding 编码来输出指定格式文件 (jpg, bmp, gif, png)
-x --exif 将可交换图像文件应用到捕获中(格式:key=value)或者不设置
-k --keypress 按键触发,按ENTER键拍照,按X然后ENTER键退出
-s -signal 信号触发,等待另一个进程信号来拍摄一张照片
-g -gl 绘制预览到文本,而不是使用视频渲染组件(啥意思?)
-gc --glcapture 捕获GL帧buffer而不是摄像机图像
-tl --timelapse 间隔拍摄,每<ms>拍摄一张图片
-th --thumb 设置预览图(小图)参数(包括X、Y、品质)或者不设置
-fp --fullpreview 用静态捕捉分辨率运行预览(可能会减小预览帧率)
-cs --camselect 选择摄像头设备 <数字>,默认0
-bm --burst 运行burst capture mode
-set --settings 检索摄像机设置值然后写出到stdout
-sh --sharpness 设置图像锐度 (-100 到 100)
-co --contrast 设置图像对比度 (-100 到 100)
-br --brightness 设置图像亮度 (0 到 100)
-sa --saturation 设置图像饱和度 (-100 到 100)
-vs --vstab Turn on video stabilisation 开启摄像头防抖模式(是这个意思吗?)
-ev --ev 设置EV补偿
-ex --exposure 设置曝光模式(参见提示)
-mm --metering 设置测光模式(参见提示)
-hf --hflip 设置水平翻转 horizontal flip
-vf --vflip 设置垂直翻转 vertical flip
-roi --roi 设置interest区域 (啥叫interset?)
--ss --shutter 设置快门速度,微秒
-rot --rotation 设置图像旋转 (0到359)
-ISO --ISO 设置摄像头感光度
-awb --awb 设置AWB模式(参见提示)
-ifx --imxfx 设置图像效应(参见提示)
-cfx --colfx 设置色彩效应(参见提示)
--drc --drc 设置DRC水平
--awbg --awbgains 设置AWB阈值, AWB模式必须关闭

测光模式选项:

average 全画面平衡测光
spot 点测光
backlit 模拟背光图像
matrix 阵列测光

曝光模式选项:

auto 自动曝光模式
night 夜间拍摄模式
nightpreview 夜间预览拍摄模式
backlight 逆光拍摄模式
spotlight 聚光灯拍摄模式
sports 运动拍摄模式
snow 雪景拍摄模式
beach 海滩拍摄模式
verylong 长时间曝光拍摄模式
fixedfps 帧约束拍摄模式
antishake 防抖模式
fireworks 烟火拍摄模式

自动白平衡(AWB)选项:

off 关闭白平衡测算
auto 自动模式(默认)
sun 日光模式
cloud 多云模式
shade 阴影模式
tungsten 钨灯模式
fluorescent 荧光灯模式
incandescent 白炽灯模式
flash 闪光模式
horizon 地平线模式

图像特效选项:

none 无特效(默认)
negative 反色图像
solarise 曝光过度图像
posterize 色调图像
whiteboard 白板特效
blackboard 黑板特效
sketch 素描风格特效
denoise 降噪图像
emboss 浮雕图像
oilpaint 油画风格特效
hatch 草图特效
gpen 马克笔特效
pastel 柔化风格特效
watercolour 水彩风格特效
film 胶片颗粒风格特效
blur 模糊图像
saturation 色彩饱和图像
colourswap 暂未可用
washedout 暂未可用
posterise 暂未可用
colourpoint 暂未可用
colourbalance 暂未可用
cartoon 暂未可用

预览参数与命令

-p --preview 预览窗口大小设置 <x,y,w,h>
-f --fullscreen 全屏幕预览模式
-op --opacity 预览窗口透明度 (0-255)
-n --nopreview 不显示预览窗口
-gs -glscene GL屏幕尺寸等参数
-gw -glwin GL窗口参数

例子

# 仅显示两秒钟预览图像,而不对图像进行保存。
raspistill -t 2000

# 两秒钟(时间单位为毫秒)延迟后获取一张照片并发送至标准输出设备
raspistill -t 2000 -o -

# 两秒钟(时间单位为毫秒)延迟后获取一张照片并发送至标准输出设备
# 然后重定向标准输出到文件`my_file.jpg`
raspistill -t 2000 -o - > my_file.jpg

# 两秒钟(时间单位为毫秒)延迟后拍摄一张照片,并保存为 image.jpg
raspistill -t 2000 -o image.jpg

# 将图像保存为 PNG 文件(无损压缩格式,但是要比 JPEG 速度慢)。
# 注意,当选择图像编码时,文件扩展名将被忽略。
raspistill -t 2000 -o image.png –e png

# 降低图像质量,减小文件尺寸
raspistill -t 2000 -o image.jpg -q 5

# 拍摄一张自定义大小的照片。
raspistill -t 2000 -o image.jpg -w 640 -h 480

# 间隔获取图片,
# 在 10 分钟(10 分钟 = 600000 毫秒)的时间里,每 10 秒获取一张,
# 并且命名为`image_number_1_today.jpg`,`image_number_2_today.jpg` ... 的形式。
raspistill -t 600000 -tl 10000 -o image_num_%d_today.jpg

# 强制使预览窗口出现在坐标为 100,100 的位置,
# 并且尺寸为宽 300 和高 200 像素。
raspistill -t 2000 -o image.jpg -p 100,100,300,200

# 禁用预览窗口
raspistill -t 2000 -o image.jpg -n

# 向 JPEG 文件中添加一些 EXIF 信息。
# 该命令将会把作者名称标签设置为`Dreamcolor`,GPS 海拔高度为`123.5`米。
raspistill -t 2000 -o image.jpg \
  -x IFD0.Artist=Dreamcolor -x GPS.GPSAltitude=1235/10

# 设置浮雕风格图像特效
raspistill -t 2000 -o image.jpg -ifx emboss

# 设置 YUV 图像的 U 和 V 通道为指定的值(128:128 为黑白图像)
raspistill -t 2000 -o image.jpg -cfx 128:128

摄像

raspivid指令来生成.h246的文件

raspivid -o mykeychain.h264 -t 10000 -w 1280 -h 720  
  • -o:保存文件名
  • -t:时间长度,单位为毫秒。为0表示一直拍下去。
  • -w:分辨率宽度,单位为像素。
  • -h:分辨率高度,单位为像素。
  • -fps;帧数。

这样就会在当前文件夹下面生成mykeychain.h264的文件:

如果你想转换视频格式,可以使用gpac包中所带有的MP4Box应用;

sudo apt-get install -y gpac

然后将这段 flv 格式的视频流转换为每秒30帧的.mp4格式视频:

MP4Box -fps 30 -add my_video.flv video_achieve.mp4

使用VLC等来实现http的视屏流传输:

首先需要在你的树莓派上面安装VLC的软件

sudo apt-get update
sudo apt-get install vlc --fix-missing
sudo apt-get install vlc

启动你的树莓派摄像头

sudo raspivid -o - -rot 180 -t 0 -fps 15 | cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8080}' :demux=h264  

打开你PC机电脑上的VLC软件,选择打开网络串流(Ctrl+N),输入上面指令的端口号以及对应的树莓派的IP地址

(如下图所示我的树莓派的IP地址是192.168.1.129),运行结果如下图所示,当然也发现http的视频流的确比较卡, 当然我采用的视频的画质是500W像素的画质,所以视频的质量比较差,当我将视频的画质调节到720*360时, 感觉非常的流畅。(@局域网测试环境)

http://192.168.1.129:8080

另一种方式是用rtsp协议:

#!/bin/bash
raspivid -w 853 -h 480 -fps 10 -rot 180 -t 0 -n -o - | \
  cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' \
  :demux=h264

用ffmpeg推送rmtp直播流

raspivid -fps 10 -w 853 -h 480 -b 700000 -t 0 -a 12 -a 1024 \
  -a "CAM-1 %Y-%m-%d %X" -ae 18,0xff,0x808000 -o - | ffmpeg -re -i - \
  -s 640x480 -vcodec copy -acodec copy -b:v 800k -b:a 32k -f flv \
  rtmp://118.178.197.156/hls/video01