用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.pswp.cn/bicheng/78747.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78747.shtml
英文地址,請注明出處:http://en.pswp.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;結合極…