用python写一个相机选型的简易程序

最近有点忙,上来写的时间不多。

今天就把之前写的一个选型的简易程序,供大家参考。

在这里插入图片描述
代码:

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,QLabel, QLineEdit, QPushButton, QGroupBox, QFormLayout,QComboBox, QFileDialog, QMessageBox)
from PyQt5.QtCore import Qtclass CameraLensCalculator(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("相机与镜头选型工具")self.setFixedSize(600, 650)# 主窗口布局central_widget = QWidget()self.setCentralWidget(central_widget)main_layout = QVBoxLayout(central_widget)# 输入参数区域self.setup_input_group()main_layout.addWidget(self.input_group)# 计算按钮self.calculate_btn = QPushButton("计算", clicked=self.calculate)main_layout.addWidget(self.calculate_btn, alignment=Qt.AlignCenter)# 结果显示区域self.setup_result_group()main_layout.addWidget(self.result_group)# 保存按钮self.save_btn = QPushButton("保存报告", clicked=self.save_report)self.save_btn.setEnabled(False)main_layout.addWidget(self.save_btn, alignment=Qt.AlignCenter)# 设置默认值self.set_default_values()def setup_input_group(self):"""初始化输入参数区域"""self.input_group = QGroupBox("输入参数")layout = QFormLayout()# 物体尺寸self.obj_width = QLineEdit()self.obj_height = QLineEdit()layout.addRow(QLabel("物体宽度 (mm):"), self.obj_width)layout.addRow(QLabel("物体高度 (mm):"), self.obj_height)# 边缘余量self.margin = QLineEdit()layout.addRow(QLabel("边缘余量 (%):"), self.margin)# 检测精度self.accuracy = QLineEdit()layout.addRow(QLabel("检测精度 (mm):"), self.accuracy)# 工作距离self.working_distance = QLineEdit()layout.addRow(QLabel("工作距离 (mm):"), self.working_distance)# 传感器类型(下拉选择)self.sensor_combo = QComboBox()self.sensor_combo.addItems(["1/2\" (6.4x4.8mm)","1/1.8\" (7.2x5.3mm)","2/3\" (8.8x6.6mm)","自定义"])self.sensor_combo.currentTextChanged.connect(self.handle_sensor_change)layout.addRow(QLabel("传感器类型:"), self.sensor_combo)# 自定义传感器尺寸(默认隐藏)self.sensor_custom = QLineEdit()self.sensor_custom.setPlaceholderText("输入宽x高(如 10.0x8.0)")self.sensor_custom.setVisible(False)layout.addRow(QLabel("自定义尺寸:"), self.sensor_custom)# 光圈值(景深计算用)self.aperture = QLineEdit()self.aperture.setPlaceholderText("F值(如 2.8)")layout.addRow(QLabel("光圈 (F):"), self.aperture)self.input_group.setLayout(layout)def setup_result_group(self):"""初始化结果显示区域"""self.result_group = QGroupBox("计算结果")self.result_label = QLabel("请填写参数后点击计算")self.result_label.setAlignment(Qt.AlignLeft)self.result_label.setStyleSheet("font-family: monospace;")layout = QVBoxLayout()layout.addWidget(self.result_label)self.result_group.setLayout(layout)def handle_sensor_change(self, text):"""切换传感器类型时显示/隐藏自定义输入框"""self.sensor_custom.setVisible(text == "自定义")def set_default_values(self):"""设置默认参数值"""self.obj_width.setText("100")self.obj_height.setText("50")self.margin.setText("20")self.accuracy.setText("0.1")self.working_distance.setText("400")self.aperture.setText("4.0")def calculate(self):"""执行计算逻辑"""try:# 获取输入值obj_w = float(self.obj_width.text())obj_h = float(self.obj_height.text())margin = float(self.margin.text()) / 100  # 转为小数accuracy = float(self.accuracy.text())wd = float(self.working_distance.text())aperture = float(self.aperture.text()) if self.aperture.text() else 4.0# 解析传感器尺寸sensor_text = self.sensor_combo.currentText()if sensor_text == "自定义":sensor_w, sensor_h = map(float, self.sensor_custom.text().split('x'))else:sensor_str = sensor_text.split('(')[1].split(')')[0].replace('mm', '')sensor_w, sensor_h = map(float, sensor_str.split('x'))# 计算FOV(含余量)fov_w = obj_w * (1 + margin)fov_h = obj_h * (1 + margin)# 计算分辨率(安全系数1.5)res_w = int((fov_w / accuracy) * 1.5)res_h = int((fov_h / accuracy) * 1.5)mp = (res_w * res_h) / 1e4  # 万像素# 计算焦距(公式:f = (WD * 传感器尺寸) / FOV)focal_w = (wd * sensor_w) / fov_wfocal_h = (wd * sensor_h) / fov_hfocal_length = max(focal_w, focal_h)# 计算景深(简化公式)coc = 0.005  # 容许模糊圆直径(默认0.005mm)depth_of_field = (2 * coc * aperture * (wd ** 2)) / (focal_length ** 2)# 显示结果result_text = f"""=== 计算结果 ===视场(FOV): {fov_w:.2f} mm × {fov_h:.2f} mm所需分辨率: {res_w} × {res_h} 像素推荐相机: ≥ {mp:.1f} 万像素镜头焦距: ≈ {focal_length:.1f} mm景深(DoF): ≈ {depth_of_field:.2f} mm(基于传感器: {sensor_w}x{sensor_h} mm, 光圈 F{aperture})"""self.result_label.setText(result_text.strip())self.save_btn.setEnabled(True)self.calculation_result = result_text  # 保存结果用于导出except Exception as e:QMessageBox.warning(self, "错误", f"参数输入无效!\n{str(e)}")def save_report(self):"""保存计算结果到文件"""try:file_path, _ = QFileDialog.getSaveFileName(self, "保存报告", "", "Text Files (*.txt);;All Files (*)")if file_path:with open(file_path, 'w') as f:f.write("=== 相机与镜头选型报告 ===\n")f.write(f"物体尺寸: {self.obj_width.text()}x{self.obj_height.text()} mm\n")f.write(f"边缘余量: {self.margin.text()}%\n")f.write(f"检测精度: {self.accuracy.text()} mm\n")f.write(f"工作距离: {self.working_distance.text()} mm\n")f.write(f"传感器: {self.sensor_combo.currentText()}\n")f.write(f"光圈: F{self.aperture.text()}\n")f.write("\n" + self.calculation_result.strip())QMessageBox.information(self, "成功", "报告已保存!")except Exception as e:QMessageBox.critical(self, "错误", f"保存失败!\n{str(e)}")if __name__ == "__main__":app = QApplication(sys.argv)window = CameraLensCalculator()window.show()sys.exit(app.exec_())

以上对选型提供初步的想法,具体可以根据个人需求进一步优化。

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

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

相关文章

【实战篇】数字化打印——打印格式设计器的功能说明

前言 myBuilder内置了覆盖丰富场景的打印格式设计器,效果统一,功能完善。 设计器一:小票 用于设计小票、水单等滚筒纸张的场景,例如:超市购物小票 主要功能 打印格式的保存、下载、上传设计时功能:撤销…

Qt 中 QSQLITE 和 QODBC 数据库连接的区别

Qt 中 QSQLITE 和 QODBC 数据库连接的区别 这两行代码都是创建 Qt 数据库连接,但使用了不同的数据库驱动和连接方式: 1. QSqlDatabase::addDatabase("QSQLITE") 特点: 使用 SQLite 数据库的 原生驱动直接与 SQLite 数据库文件(…

Eigen核心矩阵/向量类 (Matrix, Vector, Array)

1. Matrix 类&#xff08;稠密矩阵&#xff09; 模板参数 cpp Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> Scalar: 元素类型&#xff08;如 float, double, int&#xff09;。 Rows/Cols: 行数和列数&#xff08;Dynamic 表示动态大小&#xff09;。 O…

汽车免拆诊断案例 | 2016款奔驰C200L车组合仪表上多个故障灯偶尔点亮

故障现象 一辆2016款奔驰C200L车&#xff0c;搭载274 920发动机&#xff0c;累计行驶里程约为13万km。该车组合仪表上的防侧滑故障灯、转向助力故障灯、安全气囊故障灯等偶尔异常点亮&#xff0c;且此时将挡位置于R挡&#xff0c;中控显示屏提示“后视摄像头不可用”&#xff…

实现 Babylon.js 鼠标输入管理单例 (MouseController) 的最佳实践

在现代 Web3D 开发中&#xff0c;高效的输入管理是创建流畅交互体验的关键。本文将详细介绍如何在 Babylon.js 中实现一个强大的鼠标输入管理单例&#xff0c;帮助你优雅地处理所有指针事件。 为什么需要鼠标输入管理单例&#xff1f; 在复杂的 3D 场景中&#xff0c;鼠标/指…

【LLM+Code】Cursor Agent 46.11 版本PromptTools最细致解读

一、cursor Agent cursor的agent模式, 多说一句&#xff0c;cursor目前我付费使用&#xff0c;是我目前为止使用过AI coding工具里最喜欢的一个&#xff0c;cursor nb&#xff01; https://gist.github.com/sshh12/25ad2e40529b269a88b80e7cf1c38084version&#xff1a;46.11 …

Flask + ajax上传文件(二)--多文件上传

Flask多文件上传完整教程 本教程将详细介绍如何使用Flask实现多文件上传功能,并使用时间戳为上传文件自动命名,避免文件名冲突。 一、环境准备 确保已安装Python和Flask pip install flask项目结构 flask_upload/ ├── app.py ├── upload/ # 上传文…

多级缓存入门:Caffeine、Lua、OpenResty、Canal

之前写过——Google Guava Cache简介 本文系统学习一下多级缓存 目录 0.什么是多级缓存商品查询业务案例导入1.JVM进程缓存初识Caffeine实现JVM进程缓存2.Lua语法入门HelloWorld数据类型、变量和循环函数、条件控制3.Nginx业务编码实现多级缓存安装OpenRestyOpenResty快速入门…

Python + Playwright:如何在Docker 容器运行测试?

Python + Playwright:如何在Docker 容器运行测试? 前言一、简介二、环境准备1. 安装 DockerWindows 用户macOS 用户Linux 用户(以 Ubuntu 为例)2. 启动 browserless 服务拉取 browserless 镜像启动 browserless 容器验证 browserless 是否启动成功三、创建自动化测试项目1.…

语音合成之四大语言模型(LLM)与TTS的深度融合

基于LLM的语音合成 1.技术架构1.1 LlaSA1.2 CosyVoice (和 CosyVoice2)1.3 SparkTTS 2 特性对比2.1 零样本语音克隆2.2 多语种支持2.3 可控语音生成2.4 计算效率和模型大小 总结 当前&#xff0c;在大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;…

使用 Conda 创建新环境

使用 Conda 创建新环境 在使用 Conda 进行包管理和环境隔离时&#xff0c;创建新环境是一个非常常见的操作。通过创建独立的环境&#xff0c;可以避免不同项目之间的依赖冲突&#xff0c;并且能够灵活地管理各个项目的运行环境。 以下是使用 Conda 创建和管理新环境的详细步骤…

Unity AssetBundle (AB) 打包详解

AssetBundle 是 Unity 提供的一种资源打包机制&#xff0c;允许开发者将游戏资源&#xff08;如模型、纹理、预制体等&#xff09;打包成独立的文件&#xff0c;便于动态加载和热更新。 一、AssetBundle 基础概念 1. 什么是 AssetBundle 资源压缩包&#xff0c;包含序列化资源…

Python flask入门

Python flask入门 一、路由1.1 常规路由1.2 动态路由1.3 路由的其他高级用法 二、变量规则2.1 示例1&#xff1a;字符串类型&#xff08;默认&#xff09;2.2 示例2&#xff1a;整数类型2.3 示例3&#xff1a;路径类型 三、自定义转换器3.1 核心组件详解3.2 工作流程详解 四、f…

AI赋能守护行车安全新防线,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建驾驶车辆场景下驾驶员疲劳分心驾驶行为智能检测预警系统

在当今社会&#xff0c;随着科技生产力的飞速发展&#xff0c;汽车早已成为人们日常出行不可或缺的交通工具。它不仅极大地提高了人们的出行效率&#xff0c;也为生活带来了诸多便利。然而&#xff0c;随着汽车保有量的不断增加&#xff0c;交通安全问题也日益凸显。疲劳驾驶和…

onloyoffice历史版本功能实现,版本恢复功能,编辑器功能实现 springboot+vue2

文章目录 onloyoffice历史版本功能实现&#xff0c;版本恢复功能&#xff0c;编辑器功能实现 springbootvue2前提 需要注意把这个 (改成自己服务器的ip或者域名) 改成 自己服务器的域名或者地址我使用的onloyoffice版本 8.1.3.41. onloyoffice服务器部署 搜索其他文章2. 前段代…

概率论与统计(不确定性分析)主要应用在什么方面?涉及到具体知识是什么?

用户问的是概率论与统计&#xff08;不确定性分析&#xff09;的主要应用方面&#xff0c;涉及的具体知识以及具体公式。首先&#xff0c;我需要确定概率论与统计在哪些领域有应用&#xff0c;比如工程、金融、医学、数据科学等等。然后&#xff0c;具体知识部分应该包括概率论…

如何利用快照与备份快速恢复服务器的数据

在服务器上利用**快照&#xff08;Snapshot&#xff09;**和**备份&#xff08;Backup&#xff09;**快速恢复数据&#xff0c;可显著减少停机时间并确保业务连续性。以下是具体操作步骤和最佳实践&#xff1a; --- ### **1. 快照&#xff08;Snapshot&#xff09;恢复** **适…

安卓APP开发项目源码

在移动互联网蓬勃发展的今天&#xff0c;安卓应用几乎覆盖了人们生活的方方面面。从社交、购物&#xff0c;到医疗、教育&#xff0c;APP 的需求呈指数级增长。然而&#xff0c;如何高效、低成本地开发一款质量可靠的安卓应用&#xff0c;仍是很多开发者和团队关注的核心问题。…

遨游三防|30200mAh、双露营灯三防平板,见证堆料天花板

在工业4.0与智能化转型的浪潮中&#xff0c;专业设备对性能、防护及场景适应性的要求日益严苛。遨游通讯作为国家级高新技术企业&#xff0c;依托“危、急、特”场景的深耕经验&#xff0c;推出的旗舰级产品AORO-P300三防平板&#xff0c;以30200mAh超大容量电池、双露营灯设计…

【Python】Matplotlib:立体永生花绘制

本文代码部分实现参考自CSDN博客&#xff1a;https://blog.csdn.net/ak_bingbing/article/details/135852038 一、引言 Matplotlib作为Python生态中最著名的可视化库&#xff0c;其三维绘图功能可以创造出令人惊叹的数学艺术。本文将通过一个独特的参数方程&#xff0c;结合极…