用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
英文地址,請注明出處:http://en.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…