2023-简单点-picamera2中的取消auto focus,进行手动焦距设定

2023-11-30 04:52

本文主要是介绍2023-简单点-picamera2中的取消auto focus,进行手动焦距设定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Auto Focus

  • 什么是auto focus?简介
  • picamera2支持的 Auto Focus state
  • Auto
  • Manual手动模式下的重要参数 lens position
  • 未完待续。。
    • Af Wondows参数

什么是auto focus?简介

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一个像素有两个 前置并列透镜阵列,左右可以纠正相位差

参考

picamera2支持的 Auto Focus state

简而言之,就三种模式:

	1.Manual2.Auto3.Continuous

自动对焦(AF)状态机有3种模式:

可以通过读取每张图像返回的“AfState”元数据来监控其在每种模式下的活动。

种模式是:

  • mannual手动:镜头永远不会自动移动,但“镜头位置”控制可以用来“手动”移动镜头。
    这个控制的单位是屈光度(1 /米,单位),所以零可以用来表示“无穷大”。
    “镜头位置”也可以在图像元数据中进行监控,并将指示镜头何时到达请求的位置。
  • auto自动:在这种模式下,“后触发”控制可用于启动一个自动对焦循环。可以检查与图像一起接收的“AfState”元数据,以确定它何时完成以及是否成功,尽管我们建议使用辅助函数,使用户不必实现此操作。在这种模式下,镜头也永远不会自动移动,直到它被应用程序“触发”。
  • 连续Continuous-自动对焦算法将连续运行,并在必要时自动重新对焦。应用程序可以根据需要在这些模式之间自由切换。

Auto

from picamera2 import Picamera2
from libcamera import controls
picam2 = Picamera2()
picam2.start(show_preview=True)
picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})

Manual手动模式下的重要参数 lens position

from picamera2 import Picamera2
from libcamera import controls
picam2 = Picamera2()
picam2.start(show_preview=True)
picam2.set_controls({"AfMode": controls.AfModeEnum.Manual, "LensPosition": 0.0})

lens position control( picam2.camera_controls['LensPosition'])给出三个值,即最小、最大和默认镜头位置

  • 最小值定义了 最远的焦距,
  • 最大值指定了 最近的可实现的焦距(通过取其倒数)。
  • 第三个值给出了一个“默认”值,这通常是镜头的超焦位置。

透镜位置的最小值通常为0.0(表示无穷大)。
对于最大值,一个值为10.0将表示最近的焦距为1 / 10米,或10厘米。
默认值通常可能在0.5到1.0左右,这意味着超焦距离约为1到2米。
一般来说,用户应该期望距离校准是近似的,因为它将取决于调整的准确性和用户的模块和执行校准的模块之间的变化程度。

特别注意:lensPosition 中设置的屈光度(焦距的倒数)是近似值,根本不能信任这种东西

实际上,对应关系可能是这样的

这里是引用

具体可以参考:这个

这里直接给出gui调焦的代码:

from picamera2 import Picamera2
import time
from libcamera import controlsdef getVideo(duration,name="test.mp4"):picam2 = Picamera2()#picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})picam2.set_controls({"AfMode": controls.AfModeEnum.Manual, "LensPosition": 7.53})video_config = picam2.create_video_configuration(main={"size": (1080, 720)})picam2.configure(video_config) picam2.start_and_record_video(name, duration=duration,config=video_config)def getStill(nums):picam2 = Picamera2()picam2.set_controls({"AfMode": controls.AfModeEnum.Manual, "LensPosition": 7.53})#picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous})config = picam2.create_still_configuration()picam2.configure(config)picam2.start()time.sleep(2)i = 1while i <= nums:picam2.capture_file(f"{i}.jpg")i += 1def getPreview():from picamera2 import Picamera2picam2 = Picamera2()config = picam2.create_preview_configuration(main={"size":(1080,720)})picam2.configure(config)picam2.start(show_preview=True)picam2.set_controls({"AfMode": controls.AfModeEnum.Manual, "LensPosition": 7.53,})time.sleep(100)picam2.stop()def autoAdjust():from picamera2 import Picamera2from libcamera import controlsimport tkinterimport mathpc2  = Picamera2() # 焦距调节参数N    = 0.08        # 最近焦点距離(m)M    = 0.25        # 中間焦点距離(m)F    = 1.0         # 最遠焦点距離(m)IN   = 1.0 / NIM   = 1.0 / MIF   = 1.0 / F# 将滑块的值转换为焦距def convSliderToFocusLen( t ):a = ( IM - IF ) / ( 2.0 * IM - IN - IF )b = a * ( 1.0 - 2.0 * a ) * ( IM - IN )c = IN + b / aID = b / ( t - a ) + c   # 1/Dなので注意return 1.0 / ID# 将焦距转换为设定距离def convFocusLenToSetLen( focusLen ) :Px = 0.2   # 焦点距離PxPy = 0.12  # 焦点距離PyQx = 1.0   # 基准焦距设定距離QxQy = 0.16  # 基准焦距设定距離QybP = ( Py - N ) / ( Px - N )bQ = ( Qy - N ) / ( Qx - N )a = ( bQ * Qx - bP * Px ) / ( bQ - bP )b = ( Px - a ) * ( N - a ) * ( Py - N ) / ( N - Px )c = N - b / ( N - a )return b / ( focusLen - a ) + c# 	给相机设定手动对焦距离
def setFocusLen( focusLen ):# 将焦距转换为设定距离setLen = convFocusLenToSetLen( focusLen )# 给照相机设定设定距离pc2.set_controls( {"LensPosition" : 1.0 / setLen} )# 焦点距离表示label["text"] = "{:.4f}m".format( focusLen )print(f"current parm:    {1.0 / setLen}")# 滑块变更的回调def onChangeSlider( event ):focusLen = convSliderToFocusLen( slider.get() )setFocusLen( focusLen )# 主窗口root = tkinter.Tk()root.title( "Camera manual focus test" )# 追加焦距调整滑块sliderLen = 250sliderWidth = 15slider = tkinter.Scale(root,orient = tkinter.HORIZONTAL,    # 水平滑块from_ = 0.0, to = 1.0,          # 0〜1之间resolution = 0.01,              # 0.01步宽length = sliderLen,             # 滑块的长度width = sliderWidth,            # 滑块的宽度showvalue = 0,                  # 不显示值command = onChangeSlider        #注册值改变时被调用的函数	initFocusPos = 0.5slider.set( initFocusPos );        #初始值slider.place( x = 30, y = 20 )# 焦距标示标签label = tkinter.Label( root )label.place( x = 34 + sliderLen, y = 5 + sliderWidth )# 相机初始化# 显示预览,将自动聚焦模式设置为Manual	pc2.start_preview( True )pc2.start()pc2.set_controls( {"AfMode" : controls.AfModeEnum.Manual} )# 循环开始root.mainloop()if __name__ == "__main__":#getVideo(5) #getStill(3)#getPreview()autoAdjust()

print(f"current parm: {1.0 / setLen}")
这个会给出设置的lensposition

在这里插入图片描述

滑块拖动修改参数,
实时获得结果,看上面print(f"current parm: {1.0 / setLen}")打印的结果,然后手动设置参数picam2.set_controls({"AfMode": controls.AfModeEnum.Manual, "LensPosition":参数})

未完待续。。

Af Wondows参数

设置用来定焦的图片区域
在这里插入图片描述

这篇关于2023-简单点-picamera2中的取消auto focus,进行手动焦距设定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/435702

相关文章

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

使用zabbix进行监控网络设备流量

《使用zabbix进行监控网络设备流量》这篇文章主要为大家详细介绍了如何使用zabbix进行监控网络设备流量,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装zabbix配置ENSP环境配置zabbix实行监控交换机测试一台liunx服务器,这里使用的为Ubuntu22.04(

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

python安装完成后可以进行的后续步骤和注意事项小结

《python安装完成后可以进行的后续步骤和注意事项小结》本文详细介绍了安装Python3后的后续步骤,包括验证安装、配置环境、安装包、创建和运行脚本,以及使用虚拟环境,还强调了注意事项,如系统更新、... 目录验证安装配置环境(可选)安装python包创建和运行Python脚本虚拟环境(可选)注意事项安装