2023-简单点-树莓派picamera2介绍和要点

news2024/11/25 16:30:13

picamera2

  • requirements简介
  • preview windows预览窗口
    • GtGL preview【有 x windwows情况下 + 硬件加速】
    • Qt preview【软件加速】
    • DRM/KMS preview【没有 x windwows情况下】
    • NULL preview
    • preview的一些其他特征
  • 配置camera
    • 配置的细节
  • 捕捉图像capture images
    • 切换模式

requirements简介

  1. 树莓派OS Bullsye和之后的的images镜像 默认运行libcamera camera stack,这是Picamera2所必需的。可以通过打开一个命令窗口并输入:
libcamera-hello
  1. 截至2022年9月中旬,Picamera2已预装在所有树莓派操作系统图像中。您可以通过完整的系统更新来更新,或通过终端:
sudo apt install -y python3-picamera2

3.对于树莓派OS用户,这将包含所有的X Windows和GUI依赖项,但这些将在树莓派OS Lite中被省略。如果OS Lite用户希望使用这些功能,他们应该运行:

sudo apt install -y python3-pyqt5 python3-opengl

preview windows预览窗口

四种预览窗口

  • QtGL
  • QT
  • DRM/KMS
  • NULL
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()

有以下操作:
• Transform() - 等价转换,默认
• Transform(hflip=1) - horizontal flip 水平反转
• Transform(vflip=1) - vertical flip 垂直翻转
• Transform(hflip=1, vflip=1) - horizontal and vertical flip (equivalent to a 180 degree rotation)180°翻转

  • 重要的是要意识到,这里讨论的显示变换对从相机接收到的实际图像没有任何影响。

接下来的重点是 QtGL | Qt | DRM/KMS preview

GtGL preview【有 x windwows情况下 + 硬件加速】

  • 这个预览窗口使用Qt GUI工具包实现,并使用GLES硬件图形加速。当使用X Windows时,它是在屏幕上显示图像的最有效的方式,我们会在几乎所有的Picamera2库3.1中推荐它。预览窗口参数是指需要X Windows时的9种情况。
from picamera2 import Picamera2, Preview
picam2 = Picamera2()
picam2.start_preview(Preview.QTGL)

当图像需要显示在远程显示器上(未连接到Pi)时,不建议使用QtGL预览窗口

Qt preview【软件加速】

  • 与QtGL预览一样,这个窗口也使用Qt框架实现,但这次使用的是软件渲染,而不是3D硬件加速。因此,它在计算上是昂贵的,并且应该尽可能地避免使用

当使用VNC时:

  • 如果你还有一个显示器直接连接到树莓派,QtGL(硬件加速)窗口工作充分。
  • 如果你没有一个显示器直接连接到Pi,QtGL预览将工作得很差,此时应该使用Qt预览窗口
from picamera2 import Picamera2, Preview
picam2 = Picamera2()
picam2.start_preview(Preview.QT)

什么时候用呢:

  • Qt预览的主要用例是: 使用X转发或使用VNC远程桌面软件在另一台联网的计算机上显示预览窗口。在这些条件下,3d-硬件加速实现要么根本不工作,要么工作得不是很好。

DRM/KMS preview【没有 x windwows情况下】

  • DRM/KMS预览窗口用于X窗口不运行时,相机系统可以在显示屏上租用一个“layer”来显示图形。

  • 因为X Windows未运行,所以无法使用鼠标移动或调整此窗口的大小。DRM/KMS预览版将是树莓派OS Lite用户的自然选择。它也强烈推荐给低功率的树莓派,因为通过X Windows显示堆栈进行预览(例如每秒30帧)代价昂贵。


from picamera2 import Picamera2, Preview
picam2 = Picamera2()
picam2.start_preview(Preview.DRM)

如果您没有运行或挂起X-Winidows,但仍然有一个显示屏连接着树莓派,您可以登录到Pi而不需要x转发,并使用DRM/KMS预览实现。画面将出现在直接连接到Pi的显示器上。

x-windows应该是将树莓派的图像 转发到remote类似的软件级别app上。

NULL preview

通常是预览窗口通过接收相机图像,将其传递给应用程序中间商 传递,用户不再需要它们时再回收这些缓冲区,从而驱动自由摄像头系统。其结果是,即使preview图像没有被展示,仍然需要运行一些东西才能接收这些相机图像,然后返回这些相机图像。这正是空的预览所做的。它什么也不显示;它只是驱动着摄像系统。实际上,如果还没有预览运行,只要相机系统启动(picam2.start()),空预览就会自动启动,这就是为什么必须提前启动替代预览窗口!!

  • 注意:不建议自行启动和停止预览窗口,因为打开和关闭窗口可能相当昂贵,在此期间,相机帧可能会被丢弃。
from picamera2 import Picamera2, Preview
import time
picam2 = Picamera2()
config = picam2.create_preview_configuration()
picam2.configure(config)
picam2.start()
time.sleep(2)
picam2.stop_preview()
picam2.start_preview(True)
time.sleep(2)
  • 值得注意的是,如果您停止预览,然后没有重新启动另一个,或者没有立即启动另一个,就不会发生任何特别糟糕的情况。所有可用的缓冲区将被自由相机图像填充。但是没有预览运行,没有任何东西会读出这些图像并回收缓冲区,所以libcamera只会停止。当预览重新启动时,正常的操作将恢复,从那些仍在排队等待读取之前的的相机图像开始读取。
  • 许多程序员都会熟悉事件循环的概念。每种类型的预览窗口都实现了一个事件循环,以将帧从相机中pop出队列,因此当没有其他事件循环(如Qt提供的事件循环)运行时,NULL预览将执行此功能。

preview的一些其他特征

  1. 设置窗口title
from picamera2 import Picamera2
picam2 = Picamera2()
picam2.start(show_preview=True)
picam2.title_fields = ["ExposureTime", "AnalogueGain"]

配置camera

一旦创建了一个Picamera2对象,一般的模式是必须为相机生成一个配置,该配置必须应用于相机系统(使用Picamera2.configure方法),然后就可以启动相机系统。

  • [设置配置,应用配置,启动相机]
  • 一旦创建了一个配置对象,应用程序就可以在调用picam2.configure 之前自由地更改该对象的建议参数。配置只是Python字典,我们很容易检查它们并查看它们在说什么。
  1. Picamera2.create_preview_configuration将生成一个适合于在显示器上显示相机预览图像的配置,或在捕获静止图像之前
  2. Picamera2.create_still_configuration将生成一个适合捕获高分辨率静止图像的配置
  3. Picamera2.create_video_configuration将生成一个适合录制视频文件的配置

配置的细节

在这里插入图片描述
事件的顺序如下:

  1. 在左边是相机模块,它通过flat ribbon cable将图像传送到Pi。照相机提供的图像不是人类可以看到的图像,但需要做大量的工作来清理它们,并产生一幅真实的图像。
  2. Pi上一个称为CSI-2接收器的硬件将传入的相机图像传输到内存中。
  3. Pi有一个图像信号处理器(ISP),它可以从内存中读取该图像。它对从相机接收到的像素执行所有这些清洗和处理步骤。
  4. ISP可以为相机的每一个输入帧产生最多两个输出图像。我们将其中一个指定为主映像main image,它可以是RGB或YUV格式。
  5. 第二幅图像是一幅较低分辨率的图像,通常被称为 lore image;它必须是YUV格式的。它也必须不大于主图像。
  6. 最后,从传感器接收到并直接写入存储器的图像数据也可以发送到应用程序。这叫做原始图像–bayer 阵列图。
  7. 对于lores流,实际上只使用了“YUV420”。

因此,Picamera2的配置分为:

  • 全局适用于Picamera2系统和跨整个ISP的一般参数。
  • ISP中的每个流配置,以确定主流和循环流的输出格式和大小。我们注意到,主流总是被定义并交付给应用程序,如果应用程序没有显式地请求一个流,则使用默认值。
  • 此外,原始流与其他流有很大的不同,因为它影响了更直接地驱动图像传感器的模式,因此对此有一些单独的讨论。
  • 通常情况下,配置不包括可以在运行时更改的相机设置(如亮度或对比度)。但是,某些用例有时确实对这些某些控制值有特定的首选项,它们可以作为配置的一部分存储,以便应用配置也会自动应用运行时控件。

捕捉图像capture images

  • capture arrays
  • capture images
  • capture buffers

相机图像通常用numpy数组表示,所以熟悉numpy将会有所帮助。这也是OpenCV使用的表示,因此picamera2、numpy和OpenCV都可以无缝地一起工作。

当捕获图像时,Picamera2函数在其捕获函数中使用以下命名法:

  1. arrays:这些是像素的二维像素数组,通常是操作图像最方便的方法。它们通常是三维的numpy数组,因为每个像素都有几个颜色通道,从而增加了另一个维度。
from picamera2 import Picamera2
import time
picam2 = Picamera2()
picam2.start()
time.sleep(1)
The Picamera2 Library
6.1. Capturing images 31
array = picam2.capture_array("main")
  1. images:这指的是Python PIL Image对象
from picamera2 import Picamera2
import time
picam2 = Picamera2()
picam2.start()
time.sleep(1)
image = picam2.capture_image("main")
  1. buffers:缓冲区我们只是指整个内存块图像存储为一维numpy数组,但二(或三维)数组形式通常是更有用的。

还有捕获功能,可以将图像直接保存到文件中,并在相机模式之间切换,从而将快速帧率预览与高分辨率捕获相结合。

那么如何进行切换?

切换模式

from picamera2 import Picamera2
import time
picam2 = Picamera2()
capture_config = picam2.create_still_configuration()
picam2.start(show_preview=True)
time.sleep(1)
array = picam2.switch_mode_and_capture_array(capture_config, "main")

这将切换到高分辨率捕获模式,并返回numpy数组,然后将自动切换回预览模式,无需任何用户干预。

当然如果不自动切回去原模式:

from picamera2 import Picamera2
import time

picam2 = Picamera2()
preview_config = picam2.create_preview_configuration()
capture_config = picam2.create_still_configuration()
picam2 = picam2.configure(preview_config)
picam2.start(show_preview=True)
time.sleep(1)
picam2.switch_mode(capture_config)
array = picam2.capture_array("main")
picam2.switch_mode(preview_config)

直接存为文件

from picamera2 import Picamera2
import time
picam2 = Picamera2()
capture_config = picam2.create_still_configuration()
picam2.start(show_preview=True)
time.sleep(1)
picam2.switch_mode_and_capture_file(capture_config, "image.jpg")

存储于内存缓冲中

from picamera2 import Picamera2
import io
import time
picam2 = Picamera2()
picam2.start()
time.sleep(1)
data = io.BytesIO()
picam2.capture_file(data, format='jpeg')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1229619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Colab跑项目

这里写目录标题 Colab文件目录路径显示更改colab当前工作文件夹Colab挂载谷歌云盘colab使用命令(从这开始看,前面no zuo no die)最紧要,首先,修改笔记本设置使用启用gpu![在这里插入图片描述](https://img-blog.csdnimg.cn/591a6c…

Sam Altman重回OpenAI,工牌成亮点

11月20日凌晨,Sam Altman在社交平台发布了一条内容“我第一次,也是最后一次穿这些。”他胸前挂着OpenAI的工牌,写的却是“客人04”。目前,Sam在OpenAI总部。 Sam在19日发了一条内容“我非常喜欢OpenAI团队”。结合微软等主要投资…

html-网站菜单-点击菜单展开相应的导航栏,加减号可切换

一、效果图 1.点击显示菜单栏&#xff0c;点击x号关闭&#xff1b; 2.点击一级菜单&#xff0c;展开显示二级&#xff0c;并且加号变为减号&#xff1b; 3.点击其他一级导航&#xff0c;自动收起展开的导航。 二、代码实现 <!DOCTYPE html> <html><head>&…

typora整理markdown笔记

效果 符号 快捷键 斜体 * * ctrlB(代表同时按) 加粗 ** ** ctrlI 竖线 > 超链接 清除样式 ctrl\ 图片 ![图片描述][图片绝对路径/相对路径] 如何在Typora中插入图像&#xff1f; ➊ 使用Markdown语法 &#xff08;不推荐&#xff0c;太慢&#xff09; ➋ 直接拷贝图…

解决 Python requests 库中 方法选择错误问题

在使用Python库requests进行网页请求时&#xff0c;可能会遇到一个问题&#xff0c;即在处理重定向时&#xff0c;requests的Session.resolve_redirects方法会复制原始请求对象&#xff0c;这可能导致后续请求的HTTP方法选择错误。 解决方案&#xff1a; 针对上述问题&#x…

创建maven项目

创建maven项目 使用命令行创建 mvn archetype:generate如果是第一次创建&#xff0c;这个过程会有点久 之后会提示是否使用7&#xff0c;7是quickstart正常选择默认的就可以了&#xff0c;按回车继续 groupid填写&#xff0c;如果有域名将域名反写即可&#xff0c;如果想随便…

Unity 中 TextMesh Pro 认识学习

TextMesh Pro User Guide | TextMeshPro | 3.0.6官方文档 有两个 TextMesh Pro 组件可用。 第一个 TMP 文本组件的类型为 <TextMeshPro> 旨在与 MeshRenderer 配合使用。该组件是旧版 TextMesh 组件的理想替代品。 要添加新的 <TextMeshPro> 文本对象&#xff…

ModStartCMS v7.6.0 CMS备份恢复优化,主题开发文档更新

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

无痛卸载流氓杀毒软件Avast

文章目录 1\. 引言2\. 操作 1. 引言 与其说Avast是一个杀毒软件&#xff0c;不如说它是一个流氓软件&#xff0c;对于常用的微信QQ也进行拦截&#xff0c;我真的不知道意义何在 此外如果不小心安装上它之后&#xff0c;会出现一个问题&#xff1a;鼠标正常&#xff0c;电脑打字…

医院陪诊服务预约小程序的作用如何

对陪诊服务提供者及需求者来说&#xff0c;平台很重要&#xff0c;对服务提供者而言&#xff0c;通过微信私信/电话联系的形式很容易出现漏服务的情况&#xff0c;如遇需求者内容/地址/联系方式/哪家医院等信息提供不清或临时改变主意等&#xff0c;非常烦恼&#xff0c;同时各…

Redis 学习

Redis 集群共3种集群模式&#xff1a; 1. 主从模式 &#xff08;主写从读&#xff09;&#xff0c;写请求分配到主库&#xff0c;完后数据同步到从库&#xff0c;从库主要负责读请求 同步过程&#xff1a; 从库启动向主库发送同步请求&#xff0c;数据传输的形式是RDB文件&am…

CImage通过WinApi的SetWorldTransform来实现图片旋转

SetWorldTransform的功能是旋转画布&#xff0c;这样产生的效果就是图像旋转。因此&#xff0c;在旋转画布之前&#xff0c;要把要旋转的图像的位置和大小准备好&#xff0c;这样旋转之后&#xff0c;才能使图像正好出现在显示区域内。这需要计算两个关键参数&#xff0c;图像的…

Python编程基础(华为在线课程)

一、免费课程链接 https://e.huawei.com/cn/talent/outPage/#/sxz-course/home?courseId3mCm7X8-UyWyS6pioCSJeUI0yFo 二、学习环境搭建 0、参考文章 搭建 Python 高效开发环境&#xff1a; Pycharm Anaconda - 知乎 1、下载anaconda 官网地址&#xff1a; https://ww…

基于单片机GPS轨迹定位和里程统计系统

**单片机设计介绍&#xff0c; 基于单片机GPS轨迹定位和里程统计系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 一个基于单片机、GPS和里程计的轨迹定位和里程统计系统可以被设计成能够在移动的交通工具中精确定位车辆的位置…

淘宝详情api(获取主图)2023年11月20日最新版本

返回数据格式&#xff1a; 请求链接 {"item": {"apiStack": [{"name": "esi","value": "{\"delivery\": {\"from\": \"福建莆田\", \"to\": \"全国\", \"com…

px、em、rem、百分比的区别

文章目录 1. 单位类型与相对基准2. 相对长度1.em2.rem3.%百分比4.vw 和 vh5.vmin 和 vmax6.vm7.ch8. ex 3. 总结 1. 单位类型与相对基准 单位名称 单位类型&#xff08;相对/绝对&#xff09; 相对基准 px 相对 屏幕像素缩放后的尺寸 百分比 相对 font-size相对于继承&#xf…

yolov8使用opencv2实时检测,两种物品,左上角显示信息

效果为&#xff1a; 左上角显示 帧率&#xff1a;FPS 序列号&#xff1a;SN 两种物品的检测数量和总数 可以应用于工业检测 import cv2 from ultralytics import YOLO from cv2 import getTickCount, getTickFrequency # 加载 YOLOv8 模型 model YOLO("weights/yolov8s.…

反渗透水处理成套设备有哪些

反渗透水处理成套设备主要包括反渗透装置、预处理系统、控制系统等部分。 反渗透装置&#xff1a;反渗透水处理设备的核心部分&#xff0c;由反渗透膜、压力容器、膜组件等组成。反渗透膜是一种高分子材料制成的半透膜&#xff0c;能够截留水中的溶解盐、有机物、细菌等杂质&a…

华为笔记本MateBook D 14 2021款锐龙版R7集显非触屏(NbM-WFP9)原装出厂Windows10-20H2系统

链接&#xff1a;https://pan.baidu.com/s/13Kyy95GME-asli4woNN_ww?pwdbqa8 提取码&#xff1a;bqa8 HUAWEI华为MateBookD14原厂Win10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、华为电脑管家等预装程序

一篇详解,Postman设置token依赖步骤

前言 postman做接口测试时&#xff0c;大多数的接口必须在有token的情况下才能运行&#xff0c;我们可以获取token后设置一个环境变量供所在同一个集合中的所有接口使用。 一般是通过调用登录接口&#xff0c;获取到token的值 实战项目&#xff1a;jeecg boot项目 项目官网…