用Python做一个手机镜头

文章目录

    • 设置光学参数
    • 添加光学器件

设置光学参数

官方文档:设计手机镜头

rayoptics中提供了OpticalModel类,可用于创建光学模型对象。OpticalModel类中的【optical_spec】成员,是一个OpticalSpecs对象,可用于指定光圈、视野、光谱和焦点位置等信息。

from rayoptics.environment import *opm = OpticalModel()
osp = opm.optical_specosp.title = 'Cell Phone Lens'
osp.dimensions = 'mm'
osp.pupil = PupilSpec(osp, key=['image', 'f/#'], value=3.5)
osp.fov = FieldSpec(osp, key=['image', 'height'], value=3.5, is_relative=True, flds=[0., .7071, 1])
osp.wvls = WvlSpec([('F', 0.5), ('d', 1.0), ('C', 0.5)], ref_wl=1)

上述代码中,

  • 【PupilSpec】即孔径,其值为3.5,key表示孔径类型,[‘image’, ‘f/#’]表示以像面F数为主
  • 【FieldSpec】即视场,其值为3.5,key表示视场类型,[‘image’, ‘height’]表示像面高度。
  • 【WvlSpec】即波长,其输入为波长列表,其中F(氢蓝线)、d(氦黄线)、c(氢红线)的权重分别为0.5,1,0.5。

添加光学器件

opm中提供的seq_model成员,是一个SequentialModel对象,可用于定义接口和间隙,光通过这些接口和间隙传播形成图像,示意如下,其中【Ifc】为接口,【G】表示间隙。

IfcObj  Ifc1  Ifc2  Ifc3 ... Ifci-1   IfcImg\  /  \  /  \  /             \   /GObj   G1    G2              Gi-1

下面通过成员函数【add_surface】为模型添加光学表面,以设计如下镜头

在这里插入图片描述

【add_surface】其输入参数为列表,列表中元素含义为

  1. curvature,即曲率,若如果 radius_mode 为 True, 则为曲率半径。
  2. thickness,即厚度,该表面到下一个表面的距离,单位 mm。
  3. v-number,一般为折射率。
  4. semi-diameter,半径。

代码如下

sm = opm.seq_model
opm.radius_mode = Truesm.gaps[0].thi=1e10sm.add_surface([0., 0.])
sm.set_stop()sm.add_surface([1.962, 1.19, 1.471, 76.6])
sm.ifcs[sm.cur_surface].profile = RadialPolynomial(r=1.962, ec=2.153,coefs=[0., 0., -1.895e-2, 2.426e-2, -5.123e-2, 8.371e-4, 7.850e-3, 4.091e-3, -7.732e-3, -4.265e-3])sm.add_surface([33.398, .93])
sm.ifcs[sm.cur_surface].profile = RadialPolynomial(r=33.398, ec=40.18,coefs=[0., 0., -4.966e-3, -1.434e-2, -6.139e-3, -9.284e-5, 6.438e-3, -5.72e-3, -2.385e-2, 1.108e-2])sm.add_surface([-2.182, .75, 1.603, 27.5])
sm.ifcs[sm.cur_surface].profile = RadialPolynomial(r=-2.182, ec=2.105,coefs=[0., 0., -4.388e-2, -2.555e-2, 5.16e-2, -4.307e-2, -2.831e-2, 3.162e-2, 4.630e-2, -4.877e-2])sm.add_surface([-6.367, 0.1])
sm.ifcs[sm.cur_surface].profile = RadialPolynomial(r=-6.367, ec=3.382,coefs=[0., 0., -1.131e-1, -7.863e-2, 1.094e-1, 6.228e-3, -2.216e-2, -5.89e-3, 4.123e-3, 1.041e-3])sm.add_surface([5.694, .89, 1.510, 56.2])
sm.ifcs[sm.cur_surface].profile = RadialPolynomial(r=5.694, ec=-221.1,coefs=[0., 0., -7.876e-2, 7.02e-2, 1.575e-3, -9.958e-3, -7.322e-3, 6.914e-4, 2.54e-3, -7.65e-4])sm.add_surface([9.192, .16])
sm.ifcs[sm.cur_surface].profile = RadialPolynomial(r=9.192, ec=0.9331,coefs=[0., 0., 9.694e-3, -2.516e-3, -3.606e-3, -2.497e-4, -6.84e-4, -1.414e-4, 2.932e-4, -7.284e-5])sm.add_surface([1.674, .85, 1.510, 56.2])
sm.ifcs[sm.cur_surface].profile = RadialPolynomial(r=1.674, ec=-7.617,coefs=[0., 0., 7.429e-2, -6.933e-2, -5.811e-3, 2.396e-3, 2.100e-3, -3.119e-4, -5.552e-5, 7.969e-6])sm.add_surface([1.509, .70])
sm.ifcs[sm.cur_surface].profile = RadialPolynomial(r=1.509, ec=-2.707,coefs=[0., 0., 1.767e-3, -4.652e-2, 1.625e-2, -3.522e-3, -7.106e-4, 3.825e-4, 6.271e-5, -2.631e-5])sm.add_surface([0., .40, 1.516, 64.1])
sm.add_surface([0., .64])opm.update_model()
sm.do_apertures = False
sm.list_model()

对模型进行罗列的结果为

              r            t        medium     mode   zdr      sdObj:     0.000000  1.00000e+10       air      dummy  1  1.7455e+08Stop:     0.000000      0.00000       air             1     0.793582:     1.962000      1.19000   471.766             1     0.796453:    33.398000     0.930000       air             1     0.672434:    -2.182000     0.750000   603.275             1     0.511955:    -6.367000     0.100000       air             1     0.510076:     5.694000     0.890000   510.562             1     0.493557:     9.192000     0.160000       air             1     0.419758:     1.674000     0.850000   510.562             1     0.400099:     1.509000     0.700000       air             1     0.2846010:     0.000000     0.400000   516.641             1     0.2035711:     0.000000     0.640000       air             1     0.17198Img:     0.000000      0.00000                dummy  1     0.10146

绘图代码如下

import matplotlib.pyplot as plt
layout_plt0 = plt.figure(FigureClass=InteractiveLayout, opt_model=opm,do_draw_rays=True, do_paraxial_layout=False, is_dark=False).plot()
plt.show()

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

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

相关文章

16.1 Python应用容器化终极指南:Dockerfile多阶段构建与安全优化实战

Python应用容器化终极指南:Dockerfile多阶段构建与安全优化实战 #mermaid-svg-6Yor3ONhmPaQAcY6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6Yor3ONhmPaQAcY6 .error-icon{fill:#552222;}#mermaid-svg-6Yor3ON…

基于SpringBoot + Vue打造的画师约稿平台实现

概述 基于SpringBoot Vue打造的画师约稿平台,该平台设计精美、功能完善,无论是想要搭建类似平台的开发者,还是对画师约稿系统感兴趣的人士,都能从中获取有价值的信息。 主要内容 ​​用户端功能​​: 如图所示&…

杰理-耳机-可视化sdk-最大音量提示音-7016G

杰理-耳机-可视化sdk-最大音量提示音 1.音量最大的时候发出消息 2.通过 MSG_FROM_AUDIO 进行发送 3.创建地方接收,并且播放提示音 学习q群:187115320

抖音图文带货权限怎么开通

在这个数字化营销蓬勃发展的时代,抖音作为一个流量巨大的平台,为广大创作者和商家提供了丰富的变现途径。其中,图文带货权限就是一个有效的拓宽变现能力的一个渠道。 那么,如何才能开通抖音的图文带货功能呢? 开通抖…

80、指标监控-Boot Admin Server

80、指标监控-Boot Admin Server Boot Admin Server是一个用于监控和管理Spring Boot应用程序的开源工具,以下是其相关介绍: #### 主要功能 - **应用状态监控** - 显示应用的在线状态、启动时间、运行时长等基本信息。 - 监控JVM指标,如内存…

Linux系统之Nginx反向代理与缓存

目录 一、正向代理和反向代理 1.1 正向代理概述 1.1.1 什么是正向代理 1.1.2 正向代理的作用 1.1.3 正向代理的基本格式 1.2 反向代理概述 1.2.1 什么是反向代理 1.2.2 反向代理可实现的功能 1.2.3 反向代理的可用模块 二、配置反向代理 2.1 反向代理配置参数 2.1.…

SpringBoot定时任务 - Timer实现方式

定时任务在实际开发中有着广泛的用途,本文主要帮助你构建定时任务的知识体系,同时展示Timer 的schedule和scheduleAtFixedRate例子;后续的文章中我们将逐一介绍其它常见的与SpringBoot的集成。 知识准备 需要对定时任务的使用场景和常见的实…

系统分析师学习笔记

系统分析师学习笔记 目录 系统分析师学习笔记前言1 数学与工程基础(选择题2-4分)1.1 图论与应用(考选择题)1.1.1 最小生成树1.1.2 最短路径1.1.3 网络与最大流量(常考) 1.2 预测与决策(在原有基…

《仿盒马》app开发技术分享-- 逻辑优化第三弹(83)

技术栈 Appgallery connect 开发准备 现在我们的app功能已经趋近完善,bug和缺失的细节也越来越少了,我们继续对app进行优化,首先是我们的积分页面,我们只实现了全部的积分展示内容,对收入和支出的积分明细并没有进行…

(七)Dockerfile文件20个命令大全详解

目录 1. FROM 基于基础镜像构建 1.1 FROM 指令开头 1.2 ARG和FROM使用 1.3 FROM可以多个 1.4 AS name 1.5 tag和digest 2. RUN 执行任何命令 2.1 shell和exec两种使用方式 2.2 [OPTIONS]参数 3. CMD 指定默认执行命令 3.1 使用格式shell和exec两种使用方式 3.2 只…

攻防世界-MISC-4-2

知识点 1.字频分析 步骤 下载附件是一段文本, 在线网站处理:quipqiup - cryptoquip and cryptogram solver flag{classical-cipher_is_not_security_hs}

Nordic nRF54L15 SoC对包含电池监测、中断处理和电源轨控制的定制 nPM1300 示例

1:以下是适用于 nRF Connect SDK (NCS) 的基于 Zephyr 的示例应用程序,展示了: 读取电池电压和状态处理来自 nPM1300 的中断(例如,电池或电源轨事件)控制电源轨(通过 GPIO 启用/禁用&#xff0…

MySQL 单机部署

文章目录 1、准备阶段1.1、部署规划1.2、硬件准备1.3、软件准备1.4、环境清理 2、实施阶段2.1、操作系统实施2.2、数据库部署实施 3、完成 1、准备阶段 1.1、部署规划 本次部署用于测试环境,单机模式,不需要主备;MySQL数据库版本要MySQL5.7…

小程序学习笔记:实现上拉触底加载随机颜色案例全解析

在前端开发中,上拉触底加载数据是一个常见的交互需求。今天,我们就来详细探讨如何实现一个上拉触底加载随机颜色的案例,帮助大家更好地理解相关技术的应用。 案例效果展示 在这个案例里,我们最终要实现的效果是这样的&#xff1…

Java+GcExcel,生成自定义工作表

引言 在当今数字化办公和数据处理的时代,电子表格的应用无处不在。对于 Java 开发人员来说,如何高效地创建、操作和处理兼容 Microsoft Excel 的电子表格是一个常见的需求。GcExcel Java 作为葡萄城表格解决方案中的后端表格组件,为 Java 开…

跨平台C++软件开发之基本数据类型介绍

跨平台C软件开发过程中,原生数据类型的字节宽度差异是一个常见且关键的问题,不同操作系统、编译器、硬件架构可能会为相同的数据类型分配不同的字节数,这可能导致代码在移植过程中出现未定义的行为或兼容性问题。本文简要介绍C原生数据类型字…

Java编程中的单例模式

在Java中实现单例模式有几种方式,但最常见的是懒汉式和饿汉式。我们先来看一个简单的懒汉式实现: public class Singleton {private static Singleton instance;private Singleton() {} // 构造方法私有化,防止外部实例化public static Sin…

原生微信小程序网络请求与上传接口封装实战指南

本文基于微信小程序原生 API,封装 request 和 uploadFile 接口,最终实现统一请求管理、请求拦截、错误处理等能力。 📦 一、为什么要封装网络请求? 微信小程序提供了 wx.request 和 wx.uploadFile 原生 API,但直接使用…

软件测试基础知识详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、软件测试定义 软件测试是指在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行…

Spring Boot 文件上传大小配置错误解决方案

问题描述 在Spring Boot应用中出现以下错误: Failed to bind properties under spring.servlet.multipart.max-file-size’ to org.springframework.util.unit.Datasize Property:spring.servlet.multipart.max-file-sizeValue: 10Mb Origin: URL [file:./applicat…