Picamera2 Python

本文介绍了如何使用Python库Picamera2进行图像和视频捕获,包括安装、预览窗口配置、相机配置、对焦控制、捕获图像和视频、高级API以及调试日志等。内容涵盖了从基本的安装和自检到复杂的配置选项,如自动对焦、预览窗口的设置、不同编码器和输出对象的使用,以及如何在Qt应用中整合相机功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装

目前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函数来关闭预览窗口.

设置预览窗口标题栏

通过Picamera2title_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_configurationcreate_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就生成)

我们可以配置的参数主要是两类sizeformat. 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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值