安装
目前2022年之后的镜像已经预装了picamera2, 如果需要安装使用
sudo apt install -y python3-picamera2
此包会安装X-windows和GUI依赖, 如果不需要使用,
sudo apt install -y python3-picamera2 --no-install-recommands
也可以使用pip安装
sudo apt install -y python3-libcamera python3-kms++
sudo apt install -y python3-prctl libatlas-base-dev ffmpeg python3-pip
sudo apt install -y python3-pyqt5 python3-opengl # only if you want GUI features
pip3 install numpy --upgrade
# 首先要安装上述依赖. 然后再安装picamrea2
pip3 install picamera2
自检例子
from picamera2 import Picamera2, Preview
import time
picam2 = Picamera2() # 打开系统
camera_config = picam2.create_preview_configuration() # 生成窗口配置
picam2.configure(camera_config) # 使用该预览配置配置照相机系统
picam2.start_preview(Preview.QTGL) # 打开 X windows窗口
# picam2.start_preview(Preview.DRM) # 非X windows窗口
picam2.start() # 开始运行相机
time.sleep(2)
picam2.capture_file("test.jpg") # 捕获一张照片
高级接口
适用于只想快速使用的情况, 无需关注过多细节.
from picamera2 import Picamera2
picam2 = Picamera2()
picam2.start_and_capture_file("test.jpg") # 直接捕获照片
picam2.start_and_capture_files("test%s.jpg") # 捕获多张照片
picam2.start_and_record_video("test.mp4", duration=5) # 捕获一段视频
安装其他软件
opencv
sudo apt install -y python3-opencv
sudo apt install -y opencv-data
TensorFlow Lite
pip3 install tflite-runtime
FFmpeg
sudo apt install -y ffmpeg
预览窗口
树莓派有四种预览窗口, 但是都使用同一种窗口参数
x 预览窗口的x偏移
y 预览窗口的y偏移
width 预览窗口宽度
height 预览窗口高度
transform 图像的水平反转和垂直翻转
Transform(hflip=1) 水平翻转
Transform(vflip=1) 垂直翻转
Transform(hflip=1, vflip=1) 水平和垂直翻转
例子. 下面会在屏幕(100, 200)位置设置一个800*600像素的水平镜像显示的预览窗口
from picamera2 import Picamera2, Preview
from libcamera import Transform
picam2 = Picamera2()
picam2.start_preview(Preview.QTGL, x=100, y=200, width=800, height=600, transform=Transform(hflip=1))
picam2.start()
这里翻转只能针对预览窗口, 不应用于实际图片数据.
QTGL
picam2.start_preview(Preview.QTGL) # 推荐 使用界面, 如果是远程访问,最好用QT
DRM/KMS
picam2.start_preview(Preview.DMR) # X windows无法使用时使用, 不能使用鼠标. Raspberry Pi OS Lite的首选.
QT
picam2.start_preview(Preview.QT) # 不推荐使用, 因为相比于QTGL,没有硬件加速. 比较费计算资源.
NULL
什么也不做, 只是驱动摄像系统. 接收相机图像, 然后传递给应用程序. 空窗口是默认启动的, 所以要启动其他窗口, 就需要提前设置(picam2.start_preview(Preview.QTGL)
).
picam2.start_preview(Preview.NULL)
开始停止预览窗口
开启预览窗口,需要使用start_preview
函数. 此函数接受一个参数, 参数的值可以是
- None 没有预览窗口启动. 需要应用自己的代码来驱动相机系统(???)
- False 使用NULL窗口
- True 程序决定使用哪个窗口更合适.
- Preview枚举中的一个值. 自己指定窗口
你建议中途停止/开启预览窗口, 有可能会导致相机帧的丢失.
Picamera2.start
函数也有一个show_preview
参数, 可以使用上述四个值, 来省略start_preview
函数的使用. 但是Picamera2.stop
函数不能停止预览窗口, 还需要主动调用stop_preview
函数来关闭预览窗口.
设置预览窗口标题栏
通过Picamera2
的title_fields
属性来设置预览窗口的标题.
from picamera2 import Picamera2
picam2 = Picamera2()
picam2.start(show_preview=True)
picam2.title_fields = ["ExposureTime", "AnalogueGain"]
camera的配置
在创建Picamera2
对象之后, 通常会生成一个相机配置, 来应用到相机系统. 一般可以直接使用提供的函数直接生成配置, 然后通过Picamera2.configure
函数使用.
提供了三个生成配置的函数
Picamera2.create_preview_configuration
生成一个适用于预览窗口的配置,
Picamera2.create_still_configuration
生成一个适用于捕获高质量静止图像的配置
Picamera2.create_video_configuration
生成一个捕获视频文件图像的配置
from picamera2 import Picamera2, Preview
picam2 = Picamera2()
camera_config = picam2.create_preview_configuration()
picam2.configure(camera_config) # 在使用之前, 可以修改配置
picam2.start()
上图是树莓派相机的工作流程.首先由相机产生数据, 之后由CSI
将数据写入内存.然后ISP
读取数据,进行处理. ISP
会产生两路输出, 第一路为Main Stream
其格式可以是RGB
或者YUV
. 另一路是低质量的输出模式,其格式是YUV
, 他不大于主图像. 最后从内存直接落盘的数据是原始图像.
配置可以分成
通用配置, 可以用在整个相机系统和ISP上.
ISP每个输出流上的配置. main stream总是交给应用程序. 如果没有指定配置,就会使用默认配置.
通用配置
-
transform 垂直翻转和水平翻转
-
color_space 颜色空间, 主流和低质量流使用相同的参数. 原始流总是在一个相机特定的颜色空间中。
-
buffer_count 设置缓冲区集数. 一组缓冲区代表已请求的每个流的一个缓冲区
-
queue 是否允许系统为捕获请求准备一个帧队列。
-
display 选择需要展示的流的名称, 并不影响实际图像. 只在
picamera2
中有 -
encode 设置录像的编码格式. 不会影响图像. 只在
picamera2
中有
transform
from libcamera import Transform
Transform()
Transform(hflip=True)
Transform(vflip=True)
Transform(hflip=True, vflip=True)
使用方式
from picamera2 import Picamera2
from libcamera import Transform
picam2 = Picamera2()
preview_config = picam2.create_preview_configuration(transform=Transform(hflip=True))
colorfpace
from libcamera import ColorSpace
ColorSpace.Sycc()
ColorSpace.Rec709()
使用方式
from picamera2 import Picamera2
from libcamera import ColorSpace
picam2 = Picamera2()
preview_config picam2.create_preview_configuration(colour_space=ColorSpace.Sycc())
当不指定参数的时候会使用默认值.默认值根据不同情况来选择.
create_preview_configuration
和create_till_configuration
默认使用Sycc
create_preview_configuration
中当main stream选择RGB
格式时,是Sycc
. 对于YUV
格式,如果分辨率小于1280x720,它将选择SMPTE 170M
,否则为Rec709
.
流配置
每个流都可以有一个配置, 可以通过给配置产生函数, 设置对应的参数来获取对应的流配置, 比如main
lores
raw
. 默认情况下, 主 流的配置是一直产生的, 所以main=
的参数可以省略, 比如
from picamera2 import Picamera2
picam2 = Picamera2()
config = picam2.create_preview_configuration(lores={
}) # 在生成main流的同时, 生成了lores流的配置.
配置的参数可以只传一个字典就行(应该是只要不是None就生成)
我们可以配置的参数主要是两类size
和 format
. size
主要指定图像的大小, format
指定图像的格式.
库还提供了一个align_configuration
函数用来校验图像大小是不是最佳大小.
from picamera2 import Picamera2
picam2 = Picamera2()
config = picam2.create_preview_configuration({
"size": (808, 606)})
picam2.align_configuration(config) # 校验参数.
picam2.configuration(config)
图像格式可以选用以下几种
XBGR8888
每个像素32位, 最后有一个虚拟的255值. 所以像素看起来是 [R,G,B,255]
XRGB8888
同上,但是顺序是 [B,G,R,255]
RGB888
每个像素24位, 顺序是[B,G,R]
BGR888
同上, 顺序是[R,G,B]
YUV420
Y平面值, U平面值, V平面值
lores 流默认使用YUV420
格式.
原始流配置
raw stream 也可以调整图像大小,但是这是有限制的并不像ISP那样可以任意调整. 使用传感器模式提供更为准确的模式控制.
from pprint import *
from picamera2 import Picamera2
picam2 = Picamera2()
pprint(picam2.sensor_modes) # 打印相机的配置. 这种配置是有多组可供选择的, 也就是说只能选择用或者不用, 而不是进行修改
bit_depth
= 12 每个像素占用的位数
crop_limits
= (0,0,4056,3040) 这告诉我们在全分辨率传感器输出中该模式的确切视野
exposure_limits
= (114, 127156999) 曝光的最大值和最小值(毫秒)
format
= SRGGB12_CSI2P 包装传感器格式。当请求原始流时,这可以作为“格式”传递
fps
10.0 最大帧率
unpacked
= SRGGB12 如果需要解压缩的原始图像,则使用此格式代替原始流请求中的早期格式
配置和运行时配置
这也许不是正式的配置, 但是有时是需要的.
from picamera2 import Picamera2
picam2 = Picamera2()
picam2.create_video_configuration()["controls"]
>> {
'NoiseReductionMode': <NoiseReductionMode.Fast: 1>, 'FrameDurationLimits': (33333, 33333)}
配置生成方法提供了与用例对应的推荐运行时控制值. 这些值可以被覆盖或更改, 但由于最优值或通常的值有时有点技术性,所以自动提供它们是很有帮助的. 推荐的配置是降噪和采样率. 修改配置
from picamera2 import Picamera2
picam2 = Picamera2()
config = picam2.create_video_configuration(cont