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

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.mfbz.cn/a/167365.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】细谈SQL高级查询

文章目录 一、前言 & 准备工作二、简易高级查询⚙ 准备工作1、查询每一门课程及其先修课程2、查询和“刘涛”在一个班级的学生的信息3、查询选修了‘计算机基础’课的学生的学号、姓名③ 连接方式④ 子查询嵌套方式 4、查询没有选修课程的学生的信息① 子查询in方式② 子查…

typora整理markdown笔记

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

nvm 安装后出现的各种问题解决方法

1、nvm安装后无法安装node版本 首先需要确定删除了电脑上所有的node版本,如果不会卸载那么请移步到 查看 ,我们是要通过nvm来下载node环境,所以之前下载的node有冲突,所以都要清除。 2、下载后的nvm环境,无法使用node、…

Linux入门攻坚——6、磁盘管理——分区及文件系统管理

磁盘管理主要涉及分区的管理,以及分区后的文件系统管理。 磁盘的使用大体要分两步: 文件系统也是一个软件,根是自引用的。 文件系统的全局结构:物理格式: 一个磁盘刚被生产出来的时候,它里边没有划分扇区…

[OpenAirInterface-01]什么是OAI?OAI在github中源代码的存放结构

文章目录 前言:什么是软件无线电SDR第1章 什么是OAI(OpenAirInterface)1.1 来自官网的概述1.2 来自github的概述1.3 来自我的解读 第2章 什么是OSA2.1 OSA概述:2.2 OSA联盟职责2.3 OpenAirInterface github成员的角色 第3章 常见的…

服务号转为订阅号可以吗

服务号和订阅号有什么区别?服务号转为订阅号有哪些作用?很多小伙伴想把服务号改为订阅号,但是不知道改了之后具体有什么作用,今天跟大家具体讲解一下。首先我们知道服务号一个月只能发四次文章,但是订阅号每天都可以发…

赴日开发工程师是做什么的?

日本的软件开发岗位对技术要求和沟通能力都有较高的要求,赴日开发工程师主要负责软件设计、开发和测试,包括编写代码、测试代码和修复漏洞等工作。开发人员必须对软件架构、设计模式和业务逻辑有深入的理解,并能做出合适的技术决策。 当然&a…

探索SPI:深入理解原理、源码与应用场景

文章目录 一、初步认识1、概念2、工作原理3、作用场景 二、源码分析1、ServiceLoader结构2、相关字段3、核心方法 三、案例connector连接器小案例1、新建SPI项目2、创建扩展实现项目1-MongoDB3、创建扩展实现项目2-Oracle4、测试 Spring应用1、创建study工程2、创建forlan-test…

系列六、多线程集合不安全

一、多线程List集合不安全 1.1、List集合不安全案例代码 /*** Author : 一叶浮萍归大海* Date: 2023/11/20 12:38* Description: 多线层环境下List集合不安全案例代码*/ public class NotSafeListMainApp {public static void main(String[] args) {List<String> list …

使用JDK自带java.util.logging.Logger引起的冲突问题

现象&#xff1a; 应用代码如下&#xff1a; import javax.script.ScriptEngineManager;ScriptEngineManager manager new ScriptEngineManager(); manager.getEngineByName("JavaScript"); 在TongWeb8上运行出错&#xff0c;日志如下&#xff1a; Servlet.servi…

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

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

Docker部署MinIO对象存储服务器结合Cpolar实现远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远…

同城跑腿服务预约小程序的作用是什么

随着生活质量逐渐提升&#xff0c;围绕人们生活的行业或产品非常多&#xff0c;同时互联网赋能下&#xff0c;也出现了很多便捷人们日常消费的场景&#xff0c;如外卖服务、快递服务等。 跑腿仅依赖微信私聊及电话预约是很低效且容易出错及造成极大工作压力的&#xff0c;同时…

Matlab论文插图绘制模板第127期—进阶气泡矩阵/热图

​在之前的文章中&#xff0c;分享了Matlab散点图矩阵的绘制模板&#xff1a; 也分享过气泡矩阵图的绘制模板&#xff1a; 考虑到规范性和便捷性&#xff0c;再来分享一下进阶版的气泡矩阵/热图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已…

ospf路由选路及路由汇总

一、知识补充 1、ABR和ASBR 1.1 ABR ABR指的是边界路由&#xff0c;通常位于两个或多个区域之间&#xff0c;用于在不同的OSPF区域之间传递信息。当一个路由器同时连接到两个或多个区域时&#xff0c;它就成为了ABR&#xff0c;它需要维护每个区域的拓扑信息和路由表&#x…

SSL证书对网站SEO的好处

随着网络安全意识的提高&#xff0c;越来越多的网站开始采用SSL证书来保护自己的数据传输过程。那么&#xff0c;SSL证书真的能为网站SEO带来好处吗&#xff1f;下面将为您分析这个问题。 加强用户体验和信任度 SSL证书不仅能确保数据传输的安全性&#xff0c;还能让客户感受…

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

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

宝塔站点配置

我这里使用的thinkphp 框架部署的

计算机毕业设计选题推荐-个人博客微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

在Linux上安装RStudio工具并实现本地远程访问【内网穿透】

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…