利用Python制作一个计算镜头FOV的小工具

本文介绍了一个用Python编写的Camera参数计算工具,通过用户输入镜头焦距和传感器尺寸,计算并显示HFOV、VFOV和DFOV。使用Tkinter库设计了用户界面,允许用户验证FOV计算公式的准确性。
摘要由CSDN通过智能技术生成

在Camera工作中,有时候我们会去了解一些Camera的参数,包括焦距、CCD/COMS Sensor的尺寸,以便了解该镜头的视场角(FOV)范围等信息,所以利用编程来计算FOV(HFOV、VFOV、DFOV),HFOV、VFOV、DFOV的计算公式:

制成一个小工具方便使用,话不多说,先看下UI效果:

上面一栏主要是如果知道镜头的焦距以及sensor的尺寸情况计算,当然有时候我们可以自己利用仪器简单测出镜头的HFOV和VFOV,然后计算一下DFOV即可,DFOV与HFOV、VFOV的计算公式可由上面的计算公式推导出来:

DFOV = 2*arctan(sqrt(tan(0.5*HFOV)^2 + tan(0.5*VFOV)^2))

看下计算结果:

这边可以将上面由sensor信息计算出来的FOV填入来验证一下公式的准确性(一开始就是没注意,后来一检验发现公式有错误)。

完整代码:

import tkinter as tk
from tkinter import messagebox
import math

def calculate_fov():
    try:
        focal_length = float(entry_focal_length.get())
        sensor_width = float(entry_sensor_width.get())
        sensor_height = float(entry_sensor_height.get())
            
        hfov = 2 * math.degrees(math.atan(sensor_width / (2 * focal_length)))
        vfov = 2 * math.degrees(math.atan(sensor_height / (2 * focal_length)))
        dfov = 2 * math.degrees(math.atan(math.sqrt(sensor_width**2 + sensor_height**2) / (2 * focal_length)))
        
        label_hfov_result.config(text="HFOV: {:.2f} °".format(hfov))
        label_vfov_result.config(text="VFOV: {:.2f} °".format(vfov))
        label_dfov_result.config(text="DFOV: {:.2f} °".format(dfov))
    except ValueError:
        label_hfov_result.config(text="Invalid input!")
        label_vfov_result.config(text="Invalid input!")
        label_dfov_result.config(text="Invalid input!")

def calculate_dfov():
    try:
        hfov = float(entry_hfov.get())
        vfov = float(entry_vfov.get())
        
        hfov_rad = math.radians(hfov)
        vfov_rad = math.radians(vfov)
        
        tan_hfov = math.tan(0.5 * hfov_rad)
        tan_vfov = math.tan(0.5 * vfov_rad)
        
        dfov = 2 * math.degrees(math.atan(math.sqrt(tan_hfov**2 + tan_vfov**2)))
        
        dfov_result.config(text="DFOV : {:.2f} °".format(dfov))
    except ValueError:
        messagebox.showerror("Invalid input!", "Please input valid numbers!")
# 创建主窗口
root = tk.Tk()
root.geometry("500x500")
root.title("Camera FOV Calculator")

# 创建输入框和标签
calc_fov =tk.LabelFrame(root, text="Calculate Fov",padx=10, pady=10)
calc_fov.pack(padx=10, pady=10)
label_focal_length = tk.Label(calc_fov, text="Focal Length (mm):")
label_focal_length.pack()
entry_focal_length = tk.Entry(calc_fov)
entry_focal_length.pack()

label_sensor_width = tk.Label(calc_fov, text="Sensor Width (mm):")
label_sensor_width.pack()
entry_sensor_width = tk.Entry(calc_fov)
entry_sensor_width.pack()

label_sensor_height = tk.Label(calc_fov, text="Sensor Height (mm):")
label_sensor_height.pack()
entry_sensor_height = tk.Entry(calc_fov)
entry_sensor_height.pack()

# 创建计算按钮
button_calculate = tk.Button(calc_fov, text="Calculate FOV", command=calculate_fov)
button_calculate.pack()

# 创建显示结果的标签
label_hfov_result = tk.Label(calc_fov, text="")
label_hfov_result.pack()

label_vfov_result = tk.Label(calc_fov, text="")
label_vfov_result.pack()

label_dfov_result = tk.Label(calc_fov, text="")
label_dfov_result.pack()

# 计算DFOV
calc_dfov =tk.LabelFrame(root, text="Calculate DFov",padx=10, pady=10)
calc_dfov.pack(padx=10, pady=10)
label_hfov = tk.Label(calc_dfov, text="HFOV (°):")
label_hfov.pack()
entry_hfov = tk.Entry(calc_dfov)
entry_hfov.pack()

label_vfov = tk.Label(calc_dfov, text="VFOV (°):")
label_vfov.pack()
entry_vfov = tk.Entry(calc_dfov)
entry_vfov.pack()

button_calculate = tk.Button(calc_dfov, text="Calculate DFOV", command=calculate_dfov)
button_calculate.pack()

dfov_result = tk.Label(calc_dfov, text="")
dfov_result.pack()

# 运行主循环
root.mainloop()

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值