多視圖幾何--結構恢復--三角測量

三角測量

1. 核心公式推導

假設兩個相機的投影矩陣為 P P P P ′ P' P,對應的匹配圖像點(同名點)為 ( u , v ) (u, v) (u,v) ( u ′ , v ′ ) (u', v') (u,v),目標是求解三維點 X = [ X x , X y , X z , 1 ] T X = [X_x, X_y, X_z, 1]^T X=[Xx?,Xy?,Xz?,1]T(齊次坐標)。

投影方程

每個相機的投影方程可以表示為:
{ u = P 00 X x + P 01 X y + P 02 X z + P 03 P 20 X x + P 21 X y + P 22 X z + P 23 v = P 10 X x + P 11 X y + P 12 X z + P 13 P 20 X x + P 21 X y + P 22 X z + P 23 u ′ = P 00 ′ X x + P 01 ′ X y + P 02 ′ X z + P 03 ′ P 20 ′ X x + P 21 ′ X y + P 22 ′ X z + P 23 ′ v ′ = P 10 ′ X x + P 11 ′ X y + P 12 ′ X z + P 13 ′ P 20 ′ X x + P 21 ′ X y + P 22 ′ X z + P 23 ′ \begin{cases} u = \frac{P_{00}X_x + P_{01}X_y + P_{02}X_z + P_{03}}{P_{20}X_x + P_{21}X_y + P_{22}X_z + P_{23}} \\ v = \frac{P_{10}X_x + P_{11}X_y + P_{12}X_z + P_{13}}{P_{20}X_x + P_{21}X_y + P_{22}X_z + P_{23}} \\ u' = \frac{P'_{00}X_x + P'_{01}X_y + P'_{02}X_z + P'_{03}}{P'_{20}X_x + P'_{21}X_y + P'_{22}X_z + P'_{23}} \\ v' = \frac{P'_{10}X_x + P'_{11}X_y + P'_{12}X_z + P'_{13}}{P'_{20}X_x + P'_{21}X_y + P'_{22}X_z + P'_{23}} \\ \end{cases} ? ? ??u=P20?Xx?+P21?Xy?+P22?Xz?+P23?P00?Xx?+P01?Xy?+P02?Xz?+P03??v=P20?Xx?+P21?Xy?+P22?Xz?+P23?P10?Xx?+P11?Xy?+P12?Xz?+P13??u=P20?Xx?+P21?Xy?+P22?Xz?+P23?P00?Xx?+P01?Xy?+P02?Xz?+P03??v=P20?Xx?+P21?Xy?+P22?Xz?+P23?P10?Xx?+P11?Xy?+P12?Xz?+P13???

消去分母

將分母移到等式左邊,得到四個線性方程:
{ u ( P 20 X x + P 21 X y + P 22 X z + P 23 ) = P 00 X x + P 01 X y + P 02 X z + P 03 v ( P 20 X x + P 21 X y + P 22 X z + P 23 ) = P 10 X x + P 11 X y + P 12 X z + P 13 u ′ ( P 20 ′ X x + P 21 ′ X y + P 22 ′ X z + P 23 ′ ) = P 00 ′ X x + P 01 ′ X y + P 02 ′ X z + P 03 ′ v ′ ( P 20 ′ X x + P 21 ′ X y + P 22 ′ X z + P 23 ′ ) = P 10 ′ X x + P 11 ′ X y + P 12 ′ X z + P 13 ′ \begin{cases} u (P_{20}X_x + P_{21}X_y + P_{22}X_z + P_{23}) = P_{00}X_x + P_{01}X_y + P_{02}X_z + P_{03} \\ v (P_{20}X_x + P_{21}X_y + P_{22}X_z + P_{23}) = P_{10}X_x + P_{11}X_y + P_{12}X_z + P_{13} \\ u' (P'_{20}X_x + P'_{21}X_y + P'_{22}X_z + P'_{23}) = P'_{00}X_x + P'_{01}X_y + P'_{02}X_z + P'_{03} \\ v' (P'_{20}X_x + P'_{21}X_y + P'_{22}X_z + P'_{23}) = P'_{10}X_x + P'_{11}X_y + P'_{12}X_z + P'_{13} \\ \end{cases} ? ? ??u(P20?Xx?+P21?Xy?+P22?Xz?+P23?)=P00?Xx?+P01?Xy?+P02?Xz?+P03?v(P20?Xx?+P21?Xy?+P22?Xz?+P23?)=P10?Xx?+P11?Xy?+P12?Xz?+P13?u(P20?Xx?+P21?Xy?+P22?Xz?+P23?)=P00?Xx?+P01?Xy?+P02?Xz?+P03?v(P20?Xx?+P21?Xy?+P22?Xz?+P23?)=P10?Xx?+P11?Xy?+P12?Xz?+P13??

矩陣形式

將上述方程整理為齊次方程組 A ? X = 0 A \cdot X = 0 A?X=0,其中系數矩陣 A A A 的每一行對應一個方程:
A = [ u P 2 ? P 0 v P 2 ? P 1 u ′ P 2 ′ ? P 0 ′ v ′ P 2 ′ ? P 1 ′ ] A = \begin{bmatrix} u P_{2} - P_{0} \\ v P_{2} - P_{1} \\ u' P'_{2} - P'_{0} \\ v' P'_{2} - P'_{1} \\ \end{bmatrix} A= ?uP2??P0?vP2??P1?uP2??P0?vP2??P1?? ?

這里 P i P_{i} Pi? 表示投影矩陣的第 i i i 行(如 P 0 = [ P 00 , P 01 , P 02 , P 03 ] P_{0} = [P_{00}, P_{01}, P_{02}, P_{03}] P0?=[P00?,P01?,P02?,P03?]),進而通過SVD求解 X X X的齊次坐標。


2. 代碼實現步驟

以下是基于公式的手動實現(Python + NumPy):

步驟1:構造系數矩陣 $ A $
def triangulate_point(P1, P2, pt1, pt2):"""P1, P2: 3x4 投影矩陣pt1, pt2: 匹配的二維點 (u, v)"""u1, v1 = pt1u2, v2 = pt2# 構造矩陣A的每一行row1 = u1 * P1[2, :] - P1[0, :]  # u * P1[2] - P1[0]row2 = v1 * P1[2, :] - P1[1, :]  # v * P1[2] - P1[1]row3 = u2 * P2[2, :] - P2[0, :]  # u' * P2[2] - P2[0]row4 = v2 * P2[2, :] - P2[1, :]  # v' * P2[2] - P2[1]A = np.vstack([row1, row2, row3, row4])return A
步驟2:SVD分解求解最小二乘解
def solve_svd(A):# 奇異值分解U, S, Vt = np.linalg.svd(A)# V的最后一列對應最小奇異值的解X = Vt[-1, :]# 歸一化齊次坐標X = X / X[3]return X[:3]  # 返回三維坐標 (X, Y, Z)

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

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

相關文章

共享內存的原理和創建

目錄 共享內存的原理 共享內存的創建 代碼實現創建 共享內存的管理指令 我們今天來學習共享內存!!! 共享內存的原理 兩個進程同時使用內存中開辟的共享空間進行通信就是建立并使用共享內存進行進程間的通信。System V 共享內存&#xf…

3.10[A]cv

核心模塊: rasterizer:光柵化器,負責三角形遍歷和像素繪制Shader:包含頂點著色器和多種片元著色器Texture:紋理處理模塊 頂點著色器的計算量一般遠小于片元著色器。因為組成三角形的頂點相對有限,而片元需…

mac使用Homebrew安裝miniconda(mac搭建python環境),并在IDEA中集成miniconda環境

一、安裝Homebrew mac安裝brew 二、使用Homebrew安裝miniconda brew search condabrew install miniconda安裝完成后的截圖: # 查看是否安裝成功 brew list環境變量(無需手動配置) 先執行命令看能不能正常返回,如果不能正常…

多視圖幾何--相機標定--從0-1理解張正友標定法

1基本原理 1.1 單應性矩陣(Homography)的建立 相機模型:世界坐標系下棋盤格平面(Z0)到圖像平面的投影關系為: s [ u v 1 ] K [ r 1 r 2 t ] [ X Y 1 ] s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} K…

WWDG窗口看門狗原理

WWDG(窗口看門狗)在窗口期喂狗 作用: 原理: 框圖 WWDG寄存器: WWDG_CR控制寄存器 WWDG_CFR配置寄存器 狀態寄存器WWDG_SR 超時時間計算公式 最小最大超時值 HAL配置函數: 1. IWDG 和 WWDG 的區別 IWDG&…

無公網IP也能遠程控制Windows:Linux rdesktop內網穿透實戰

文章目錄 前言1. Windows 開啟遠程桌面2. Linux安裝rdesktop工具3. Win安裝Cpolar工具4. 配置遠程桌面地址5. 遠程桌面連接測試6. 設置固定遠程地址7. 固定地址連接測試 前言 如今遠程辦公已經從一種選擇變成了許多企業和個人的必修課,而如何在Linux系統上高效地訪…

Pygame實現射擊鴨子游戲3-2

2 鴨子類Target的創建 2.1 __init__()函數 Target類的__init__()函數代碼如圖5所示。 圖5 __init__()函數代碼 其中,第18行將Target類聲明為pygame.sprite.Sprite類的子類;第19行代碼中,__init__()函數的img_path參數表示鴨子圖片的文件名…

利用Java爬蟲獲取衣聯網商品詳情:實戰指南

在電商領域,獲取商品詳情是數據分析和市場研究的重要環節。衣聯網作為知名的電商平臺,提供了豐富的服裝商品資源。本文將詳細介紹如何利用Java編寫爬蟲程序,通過商品ID獲取衣聯網商品詳情。 一、準備工作 (一)環境搭…

五、OpenGL中Shader與C++數據傳輸

文章目錄 一、概述二、Shader 代碼文件的基本格式三、Shader的向量語法介紹四、Shader之間的數據傳輸五、Shader與C的數據傳輸uniform六、完整示例 一、概述 在 OpenGL 中,Shader(著色器)使用 GLSL(OpenGL Shading Language&…

【3DMAX插件】3DMAX建筑大師插件MasterBuilder使用方法

3DMAX建筑大師插件是一款專為3DMAX設計的程序化(參數化)建筑建模工具,其最大特點是能夠一鍵生成建筑模型,極大地提升了工作效率。該插件配備了多種結構控制選項,涵蓋陽臺、門窗、欄桿、樓頂水塔等附屬建筑元素&#xf…

隱私保護在 Facebook 用戶身份驗證中的應用

在這個數字化的時代,個人隱私保護成為了公眾關注的焦點。社交媒體巨頭 Facebook 作為全球最大的社交平臺之一,擁有數十億用戶,其在用戶身份驗證過程中對隱私保護的重視程度直接影響著用戶的安全感和信任度。本文將探討 Facebook 在用戶身份驗…

Swift Package Manager (SPM) 創建并集成本地庫

在macOS 項目中,使用 Swift Package Manager (SPM) 創建并集成本地庫的完整步驟。 創建一個macos應用程序,選擇 swift、oc、swiftui都可以。 創建好應用之后,開始創建SPM本地庫。 打開終端app,進入項目根目錄,逐次輸…

滲透測試之利用sql拿shell(附完整流程+防御方案)【下】

導讀: 時刻保持謙遜,始終保持學習,探尋事物的本質,不要把事情復雜化 話不多說,書接上回 三、利用日志getshell 利用條件: 擁有網站的寫入權限知道網站的絕對路徑數據庫日志開啟 實際操作: (1)查看數據庫日志是否開啟以及路徑 show variables like %general%; (2…

LeetCode 熱題 100_每日溫度(72_739_中等_C++)(棧)(暴力破解;棧(從左到右);棧(從右到左))

LeetCode 熱題 100_每日溫度(72_739) 題目描述:輸入輸出樣例:題解:解題思路:思路一(暴力破解法(雙重循環)):思路二(棧:從左到右)&…

【HarmonyOS Next之旅】DevEco Studio使用指南(二)

目錄 1 -> 工程模板介紹 2 -> 創建一個新的工程 2.1 -> 創建和配置新工程 2.1.1 -> 創建HarmonyOS工程 2.2.2 -> 創建OpenHarmony工程 1 -> 工程模板介紹 DevEco Studio支持多種品類的應用/元服務開發,預置豐富的工程模板,可以根…

unity3d 背景是桌面3d數字人,前面是web的表單

是可以實現的,但涉及多個技術棧的結合,包括 Unity3D、Web 技術(HTML、JavaScript)、以及可能的 WebGL 或 WebRTC 技術。大致有以下幾種實現方案: 方案 1:Unity 作為獨立應用(桌面端&#xff0…

貓耳大型活動提效——組件低代碼化

1. 引言 貓耳前端在開發活動的過程中,經歷過傳統的 pro code 階段,即活動頁面完全由前端開發編碼實現,直到 2020 年接入公司內部的低代碼活動平臺,滿足了大部分日常活動的需求,運營可自主配置活動并上線,釋…

深度學習系列79:Text2sql調研

參考 https://github.com/topics/text-to-sql 這里是一些資源:https://github.com/eosphoros-ai/Awesome-Text2SQL/blob/main/README.zh.md 這里是綜述文章:https://zhuanlan.zhihu.com/p/647249972 1. 數據集 Spider: 一個跨域的復雜text2sql數據集&a…

Linux 系統負載過高的排查思路

技術探討:Linux系統負載過高的排查思路 在Linux服務器運行過程中,如果系統負載過高,可能會導致性能下降和服務不穩定。以下是針對Linux系統負載過高問題的排查思路和解決方法: 1. 查看系統負載: 使用uptime或top命令查…

【互聯網性能指標】QPS/TPS/PV/UV/IP/GMV/DAU/MAU/RPS

📕我是廖志偉,一名Java開發工程師、《Java項目實戰——深入理解大型互聯網企業通用技術》(基礎篇)、(進階篇)、(架構篇)清華大學出版社簽約作家、Java領域優質創作者、CSDN博客專家、…