相機內參 opencv

視場角定相機內參

import numpy as np
import cv2
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Ddef calculate_camera_intrinsics(image_width=640, image_height=480, fov=55, is_horizontal=True):"""計算相機內參矩陣參數:image_width: 圖像寬度(像素)image_height: 圖像高度(像素)fov: 視野角(度)is_horizontal: 是否為水平視野角返回:K: 相機內參矩陣focal_length: 焦距(像素)"""# 將FOV從度轉換為弧度fov_rad = np.radians(fov)# 計算焦距if is_horizontal:focal_length = (image_width / 2) / np.tan(fov_rad / 2)else:focal_length = (image_height / 2) / np.tan(fov_rad / 2)# 主點(通常位于圖像中心)cx = image_width / 2cy = image_height / 2# 構建相機內參矩陣K = np.array([[focal_length, 0, cx], [0, focal_length, cy], [0, 0, 1]], dtype=np.float32)return K, focal_lengthdef visualize_camera_model(K, image_size, title="相機模型可視化"):"""可視化相機模型和視野"""fig = plt.figure(figsize=(10, 8))ax = fig.add_subplot(111, projection='3d')# 相機位置camera_pos = np.array([0, 0, 0])# 圖像平面尺寸width, height = image_size# 焦距fx = K[0, 0]fy = K[1, 1]cx = K[0, 2]cy = K[1, 2]# 假設圖像平面在z=f處z = fx# 計算圖像平面四個角點的3D坐標top_left = np.array([(0 - cx) * z / fx, (0 - cy) * z / fy, z])top_right = np.array([(width - cx) * z / fx, (0 - cy) * z / fy, z])bottom_left = np.array([(0 - cx) * z / fx, (height - cy) * z / fy, z])bottom_right = np.array([(width - cx) * z / fx, (height - cy) * z / fy, z])# 繪制相機位置ax.scatter(camera_pos[0], camera_pos[1], camera_pos[2], c='r', marker='o', s=100, label='相機位置')# 繪制從相機到圖像平面四角的視線for corner in [top_left, top_right, bottom_left, bottom_right]:ax.plot([camera_pos[0], corner[0]], [camera_pos[1], corner[1]], [camera_pos[2], corner[2]], 'b-', alpha=0.5)# 繪制圖像平面x = np.array([top_left[0], top_right[0], bottom_right[0], bottom_left[0], top_left[0]])y = np.array([top_left[1], top_right[1], bottom_right[1], bottom_left[1], top_left[1]])z = np.array([top_left[2], top_right[2], bottom_right[2], bottom_left[2], top_left[2]])ax.plot(x, y, z, 'g-', alpha=0.8)# 設置坐標軸范圍max_range = max(width, height, fx) * 0.5ax.set_xlim([-max_range, max_range])ax.set_ylim([-max_range, max_range])ax.set_zlim([0, max_range * 2])# 設置坐標軸標簽ax.set_xlabel('X軸')ax.set_ylabel('Y軸')ax.set_zlabel('Z軸')# 設置視角ax.view_init(elev=20, azim=30)# 添加標題和圖例ax.set_title(title)ax.legend()plt.tight_layout()plt.show()def visualize_camera_model_opencv(K, image_size, title="相機模型可視化"):"""使用OpenCV可視化相機模型和視野"""# 創建空白圖像width, height = image_sizecanvas = np.ones((height, width, 3), dtype=np.uint8) * 255# 焦距和主點fx = K[0, 0]fy = K[1, 1]cx = K[0, 2]cy = K[1, 2]# 相機位置(圖像中心)camera_center = (int(cx), int(cy))# 計算視野邊界點fov_scale = min(width, height) * 0.4  # 視野顯示比例# 計算四個方向的視野邊界點points = [(int(cx), int(cy - fov_scale)),  # 上(int(cx + fov_scale), int(cy)),  # 右(int(cx), int(cy + fov_scale)),  # 下(int(cx - fov_scale), int(cy)),  # 左]# 繪制視野范圍(矩形)cv2.rectangle(canvas, (points[3][0], points[0][1]), (points[1][0], points[2][1]), (0, 255, 0), 2)# 繪制主點cv2.circle(canvas, camera_center, 5, (0, 0, 255), -1)cv2.putText(canvas, "主點", (camera_center[0] + 10, camera_center[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)# 繪制坐標軸axis_length = 100cv2.arrowedLine(canvas, camera_center, (camera_center[0] + axis_length, camera_center[1]), (255, 0, 0), 2)  # X軸(藍色)cv2.arrowedLine(canvas, camera_center, (camera_center[0], camera_center[1] + axis_length), (0, 0, 255), 2)  # Y軸(紅色)# 添加焦距信息cv2.putText(canvas, f"fx: {fx:.2f}", (20, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2)cv2.putText(canvas, f"fy: {fy:.2f}", (20, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2)# 添加標題cv2.putText(canvas, title, (20, height - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2)# 顯示圖像cv2.imshow(title, canvas)cv2.waitKey(0)cv2.destroyAllWindows()
def main():# 圖像尺寸image_width = 640image_height = 480# FOV(度)fov = 55# 計算相機內參(假設為水平FOV)K, focal_length = calculate_camera_intrinsics(image_width=image_width, image_height=image_height, fov=fov, is_horizontal=True)# 打印結果print(f"圖像尺寸: {image_width}x{image_height} 像素")print(f"視野角(FOV): {fov} 度")print(f"焦距: {focal_length:.2f} 像素")print("\n相機內參矩陣:")print(K)# 可視化相機模型visualize_camera_model(K, (image_width, image_height))# visualize_camera_model_opencv(K, (image_width, image_height), title="相機模型可視化")# 如果是垂直FOV,也可以計算K_vertical, _ = calculate_camera_intrinsics(image_width=image_width, image_height=image_height, fov=fov, is_horizontal=False)print("\n如果這是垂直FOV,相機內參矩陣為:")print(K_vertical)if __name__ == "__main__":main()

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84512.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84512.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84512.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MATLAB 各個工具箱 功能說明

? 想必大家在安裝MATLAB時,或多或少會疑惑應該安裝哪些工具箱。筆者遇到了兩種情況——只安裝了MATLAB主程序,老師讓用MATLAB的時候卻發現沒有安裝對應安裝包;第二次安裝學聰明了,全選安裝,嗯……占用了20多個G。 ?…

學習日記-day14-5.23

完成目標: 學習java下半段課程 知識點: 1.多態轉型 知識點 核心內容 重點 多態轉型 向上轉型(父類引用指向子類對象) 與向下轉型(強制類型轉換)的機制與區別 向上轉型自動完成,向下轉型需…

【編程語言】【Java】一篇文章學習java,復習完善知識體系

第一章 Java基礎 1.1 變量與數據類型 1.1.1 基本數據類型 1.1.1.1 整數類型(byte、short、int、long) 在 Java 中,整數類型用于表示沒有小數部分的數字,不同的整數類型有不同的取值范圍和占用的存儲空間: byte&am…

匯量科技前端面試題及參考答案

數組去重的方法有哪些? 在 JavaScript 中,數組去重是一個常見的操作,有多種方法可以實現這一目標。每種方法都有其適用場景和性能特點,下面將詳細介紹幾種主要的去重方法。 使用 Set 數據結構 Set 是 ES6 引入的一種新數據結構&a…

Git實戰演練,模擬日常使用,快速掌握命令

01 引言 上一期借助Idea,完成了Git倉庫的建立、配置、代碼提交等操作,初步入門了Git的使用。然而日常開發中經常面臨各種各樣的問題,入門級的命令遠遠不夠使用。 這一期,我們將展開介紹Git的日常處理命令,解決日常問…

wordpress主題開發中常用的12個模板文件

在WordPress主題開發中,有多種常用的模板文件,它們負責控制網站不同部分的顯示內容和布局,以下是一些常見的模板文件: 1.index.php 這是WordPress主題的核心模板文件。當沒有其他更具體的模板文件匹配當前頁面時,Wor…

數據庫blog5_數據庫軟件架構介紹(以Mysql為例)

🌿軟件的架構 🍂分類 軟件架構總結為兩種主要類型:一體式架構和分布式架構 ● 一體化架構 一體式架構是一種將所有功能集成到一個單一的、不可分割的應用程序中的架構模式。這種架構通常是一個大型的、復雜的單一應用程序,包含所…

離線服務器算法部署環境配置

本文將詳細記錄我如何為一臺全新的離線服務器配置必要的運行環境,包括基礎編譯工具、NVIDIA顯卡驅動以及NVIDIA-Docker,以便順利部署深度學習算法。 前提條件: 目標離線服務器已安裝操作系統(本文以Ubuntu 18.04為例&#xff09…

chromedp -—— 基于 go 的自動化操作瀏覽器庫

chromedp chromedp 是一個用于 Chrome 瀏覽器的自動化測試工具,基于 Go 語言開發,專門用于控制和操作 Chrome 瀏覽器實例。 chromedp 安裝 go get -u github.com/chromedp/chromedp基于chromedp 實現的的簡易學習通刷課系統 目前實現的功能&#xff…

高級特性實戰:死信隊列、延遲隊列與優先級隊列(三)

四、優先級隊列:優先處理重要任務 4.1 優先級隊列概念解析 優先級隊列(Priority Queue)是一種特殊的隊列數據結構,它與普通隊列的主要區別在于,普通隊列遵循先進先出(FIFO)的原則,…

python打卡day34

GPU訓練及類的call方法 知識點回歸: CPU性能的查看:看架構代際、核心數、線程數GPU性能的查看:看顯存、看級別、看架構代際GPU訓練的方法:數據和模型移動到GPU device上類的call方法:為什么定義前向傳播時可以直接寫作…

Newtonsoft Json序列化數據不序列化默認數據

問題描述 數據在序列號為json時,一些默認值也序列化了,像旋轉rot都是0、縮放scal都是1,這樣的默認值完全可以去掉,減少和服務器通信數據量 核心代碼 數據結構字段增加[DefaultValue(1.0)]屬性,縮放的默認值為1 public class Vec3DataOne{[DefaultValue(1.0)] public flo…

可增添功能的鼠標右鍵優化工具

軟件介紹 本文介紹一款能優化Windows電腦的軟件,它可以讓鼠標右鍵菜單添加多種功能。 軟件基本信息 這款名為Easy Context Menu的鼠標右鍵菜單工具非常小巧,軟件大小僅1.14MB,打開即可直接使用,無需進行安裝。 添加功能列舉 它…

Gemini 2.5 Pro 一次測試

您好,您遇到的重定向循環問題,即在 /user/messaging、/user/login?return_to/user/messaging 和 /user/login 之間反復跳轉,通常是由于客戶端的身份驗證狀態檢查和頁面重定向邏輯存在沖突或競爭條件。 在分析了您提供的代碼(特別…

vue3前端后端地址可配置方案

在開發vue3項目過程中,需要切換不同的服務器部署,代碼中配置的服務需要可靈活配置,不隨著run npm build把網址打包到代碼資源中,不然每次切換都需要重新run npm build。需要一個配置文件可以修改服務地址,而打包的代碼…

大模型微調與高效訓練

隨著預訓練大模型(如BERT、GPT、ViT、LLaMA、CLIP等)的崛起,人工智能進入了一個新的范式:預訓練-微調(Pre-train, Fine-tune)。這些大模型在海量數據上學習到了通用的、強大的表示能力和世界知識。然而,要將這些通用模型應用于特定的下游任務或領域,通常還需要進行微調…

編程技能:字符串函數10,strchr

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄,故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 (一)WIn32 專欄導航 上一篇:編程技能:字符串函數09,strncmp 回到目錄…

動態規劃-53.最大子數組和-力扣(LeetCode)

一、題目解析 在給定順序的數組中找出一段具有最大和的連續子數組,且大小最小為1. 二、算法原理 1.狀態表示 我們可以意一一枚舉出所有的子數組,但我們想要的是最大子數組,所以f[i]表示:以i位置為結尾,所有子數組的最…

C++ queue對象創建、queue賦值操作、queue入隊、出隊、獲得隊首、獲得隊尾操作、queue大小操作、代碼練習

對象創建&#xff0c;代碼見下 #include<iostream> #include<queue>using namespace std;int main() {// 1 默認構造函數queue<int> q1;// 2 拷貝構造函數queue<int> q2(q1);return 0;} queue賦值操作&#xff0c;代碼見下 #include<iostream>…

全鏈路解析:影刀RPA+Coze API自動化工作流實戰指南

在數字化轉型加速的今天&#xff0c;如何通過RPA與API的深度融合實現業務自動化提效&#xff0c;已成為企業降本增效的核心命題。本文以「影刀RPA」與「Coze API」的深度協作為例&#xff0c;系統性拆解從授權配置、數據交互到批量執行的完整技術鏈路&#xff0c;助你快速掌握跨…