三維重建一: 相機幾何

參考這位大佬:https://zhuanlan.zhihu.com/p/458000359

一.?基本的投影模型

正如上面所說,相機是一個將三維物體投影為二維圖像的設備。

對于小孔相機,或者薄透鏡相機來說,基礎投影的數學模型可以表達為

我們把這個過程表達在笛卡爾坐標系中,是這樣的:

對這個模型,有幾個點需要注意:

第1, 為了數學計算的方便,將像平面移到了相機之前,如下圖所示

第2,薄透鏡成像模型中,假設了對焦距離和對應小孔相機的焦距一致

你在文獻里面可能經常會看到focal length, focus distance等等概念,有時候會比較讓人混淆。這里需要說明薄透鏡成像模型的一些假設:

  1. 薄透鏡成像時,通常只考慮了接近光軸的光線
  2. 薄透鏡成像時,假設像距和對應的小孔相機的焦距一致
  3. 我們上圖中的f,是指對焦距離,即清晰成像的像距(傳感器到鏡頭間的距離)。而并非透鏡的焦距。

第3,這里采用了齊次坐標

現在我們來談談點的坐標變換,以及齊次坐標,稍微補充一下這些知識,更有助于理解后面的內容。

二. 變換和齊次坐標

2.1 二維變換和齊次坐標表達

先來看看二維空間中的點,我們通常用一個二維向量來表示這個一個普通二維點p,一幅圖像會由很多個二維點構成,如下圖所示。

我們很容易用二維矩陣和點的乘法來表示對點(進而對圖像)的縮放、旋轉、錯切等操作,如下圖所示

不幸的是,用二維矩陣與點的乘法無法表達二維點的平移操作。你可以自己演算下,看看下圖中是否能夠找到合理的二維矩陣和點的乘法來表達平移。

現在讓我們引入齊次坐標。當我們用齊次坐標表達一個點時,我們只需要加入一個不為0的第三個坐標,就很容易用1個三維矩陣來表達平移了。要注意的是,加入任何不為0的w后,以齊次坐標的規則按下圖進行坐標的等比例變化,都表示的是同一個點。

采用齊次坐標,我們很容易將各種二維變換統一到一起,用矩陣來表達這種變換:

2.2 三維變換和齊次坐標表達

在討論相機成像時,我們需要處理三維空間中的點。因此我們來看看三維點的齊次坐標和相關的變換。

三維點的齊次表達是二維點的齊次表達的自然衍生,依然是加入1個不為0的新維度

一些基本變換用齊次坐標的表達的形式也非常相似,這里面唯一不同的是3D旋轉

三維空間中的旋轉有可能是繞著任何一個旋轉軸進行的,形式比較復雜。我們可以先看看繞著基本的坐標軸旋轉的情況:

這樣,繞著任何一個旋轉軸的旋轉,可以用上面這些基礎旋轉組合而成(絕大多數情況下是)

由于上面這些基礎旋轉都可以用4x4的變換矩陣表達,因此合并的旋轉矩陣也就是1個4x4的矩陣。

最終,采用了齊次坐標,我們就可以把各種三維變換也用矩陣和點的乘法來表達了:

2.3 旋轉矩陣的特別之處

看看下面這張圖,我們把原圖進行旋轉?θ?度,再把結果旋轉?θ?度。

很容易得到下面兩個結論,這說明旋轉矩陣是單位正交矩陣,這個性質對之后我們理解相機矩陣是很有用的。

基本上,理解投影和相機矩陣的基礎數學知識就回顧到這里,差不多夠了。下一節我們繼續來看看投影和相機矩陣。

三. 投影及相機矩陣

3.1 基礎小孔相機投影矩陣

回到我們的小孔成像模型,如下圖所示。我們的問題是空間點X和虛擬像平面上的點x之間的投影矩陣是什么?

很明顯這里可以利用相似三角形來求解這個關系

我們用齊次坐標來表達這個過程,注意點的二維齊次坐標的特性是任意等比例變換后,表示的是同一個點。

稍微思考一下,就可以用矩陣和點的乘法來表達,這里轉換矩陣就是P

這個轉換矩陣還可以進一步拆分成下面的樣子:

這里面的歸一化投影變換,可以按下圖來理解,即將三維空間點投影到了一個對焦距離為1的標準像平面上。

3.2 從投影圖像到像素坐標

當點X投影到虛擬像平面成為點x時,從三維上講,依然是在和三維點X同一個坐標系中,原點位于光心,點x的Z值為對焦距離f。而從二維上講,我們可以認為原點位于主點,如下圖所示

這里面就牽涉出兩個問題。

問題一:坐標原點問題

一般來說,實際圖像的坐標系原點并不是在主點。 常見的設定是將原點放置于左上角或左下角,就像下圖所示

這意味著我們按照3.1節所示進行投影,得到的坐標值需要按照新老原點的相對位置進行偏移。

這樣,我們的投影矩陣需要加入偏移量:

問題二:坐標單位問題

當我們投影到虛擬像平面時,所有的單位都是不變的。 例如我們采用毫米來描述三維點相對相機光心(原點)的位置時,虛擬像平面上的像點的坐標就依然用毫米來描述。然而,真正轉換成最終的圖像時,我們習慣于用像素來描述相關的坐標。這意味著我們按照3.1節所示投影得到的坐標值,里面相關元素都需要按照毫米到像素的比例進行等比例的變化。

那么,投影矩陣進一步變為:

3.3 從世界坐標到相機坐標

我們當前在表達小孔相機的投影模型時,認為三維空間點X的坐標是位于相機坐標系的,如下圖所示:

然而,在實際的投影時,我們有時很難用相對于光心的位置來表達坐標。比如在拍攝下面這個美女時,除非經過精確的相機于她的臉部的空間關系的測量,否則我們很難表達她的右眼角相對于相機光心的物理坐標。而且就算能夠測量出來,但實際表達時也會很不自然。但如果把坐標原點定位于她的鼻尖,我們就能較為自然的表達出她臉上的任何一點的坐標了。

我們把這種方式表達的坐標叫做世界坐標,而原來相對于相機光心表達的則是相機坐標。如果你知道了一個點X的世界坐標,想知道它投影到圖像上的像素坐標,你是不能直接采用上面描述的相機投影矩陣來計算的。而是需要先把世界坐標轉換為相機坐標值。比如,上面鼻尖的世界坐標值(非齊次表達)是[0, 0, 0](單位mm),而它相對于光心的坐標值可能是[50, 50, 500](單位mm)。

因此,為了構成一個從世界坐標系到圖像像素坐標系的完整投影矩陣,還需要考慮到上面這種坐標系的轉換。

從世界坐標系到相機坐標系的變化包括兩步:

- 坐標原點平移到光心

- 各個世界坐標軸經3維旋轉到和相機坐標軸對齊

所以這是一個先平移,再旋轉的操作,用非齊次坐標表示時,是這樣的:

而如果用齊次坐標表達,則是:

現在我們整合前面所有的變換分量,可以把從世界坐標系到圖像坐標系的變換表達如下:

所以投影矩陣就是一個3x4的矩陣,而這個式子還可以簡潔的表示為:

其中我們把K稱為內參,P的其余部分是外參:

3.4 錯切的影響

現在的傳感器工藝已經非常好了,很少出現長寬不等的像素。但某些時候,我們依然要考慮這種情況,這樣K就需要另外一個元素來描述,表示如下:

既然傳感器工藝已經不再有不方正的像素了,那么什么情況下s不為0?其中一種情況就是當我們拍攝一個已經拍攝好的照片時,比如拍一個雜志封面,如果相機和雜志間不是平行的,那么整體的投影矩陣會出現不為0的s。

總之,考慮到這個情況,整個3x4的投影矩陣的自由度就變成了11個,其中包括了5個內參數,3個旋轉分量,3個平移分量。

3.5 透視現象

前面我們已經看到,當物體投影的虛擬像平面時,坐標會等比例的變化,形成“近大遠小”的現象

我在文章手機中的計算攝影4-超廣角畸變校正中已經為你展示了透視現象的特點,現在引用其中內容如下:

人們很早就學會了利用透視效應來拍攝有趣的攝影作品:

透視投影還會使得三維空間中的平行線在畫面中相交,其交點稱作為消失點。

藝術家早就會使用透視技術,來突出主體了,例如下面這幅畫是荷蘭著名畫家約翰內斯·維米爾(Johannes Vermeer)的作品鋼琴課。畫家利用透視效應,將主人公安排在了整個畫面幾條直線的消失點上,從而實現了突出主體的作用。

然而,透視效應也會導致畫面的形變,我們看到拍攝同一個姑娘時,短焦鏡頭(廣角鏡頭)出現了強烈的透視畸變。這是因為為了拍出同樣尺寸的像,短焦鏡頭拍攝時物距更近,因為透視效應的近大遠小法則,這種形變顯得更加明顯。尤其是在近距離拍攝時,人臉上鼻子相比臉側面距離鏡頭更近,所以鼻子成像時放大得更大,于是人臉就顯得更加詭異了。

除了上面這種因為近距離拍攝導致的形變,透視效應還會導致遠離相機中心的物體被拉伸,比如下面這張用iPhone13 Mini的廣角鏡頭拍攝的照片。相比起上面因為近距離拍攝導致的形變,這種邊緣物體被拉伸的現象是我們更常見的情況。

那么問題來了,有沒有相機在成像時沒有透視效應呢?下一小節我們就來探討這個問題。

四. 其他相機模型

我們知道小孔相機因為透視效應,會呈現近大遠小的情況。下圖你可以看到Z在像坐標的分母,這也說明了這一點。

現在想想,如果我們能不斷增大Z,同時還讓f也不斷增大,并且f/Z始終是一個常量,那會怎么樣呢?

很明顯,這個時候就不再有近大遠小的現象了,不管遠近所成的像的大小都一樣!當成像系統物距很大且像距也很大時,此時的投影關系就變成了弱透視投影,成像的幾何尺寸與物距的關系就非常弱甚至沒有了。《計算機視覺中的多視角幾何》一書中的插圖形象的說明了這一點:

比如,當我們拍攝遠景時,此時的成像系統可以近似認為滿足弱透視投影關系

另外如果成像系統滿足如下幾何關系,也能形成弱透視投影,只要物距大于Zo,那么不管遠近成像的尺寸都與物距無關了,只與圖中中間平面的物距Zo相關。

要構成這樣的投影關系也比較容易,只需要用透鏡成像+小孔成像即可。這種相機我們稱為仿射相機

那么仿射相機的投影矩陣是什么呢?

仿射相機的投影矩陣的最后一行可以轉換為[0 0 0 1],這是它最大的特點。

如果上圖中Zo=1,會如何呢?我們看到

Zo=1,意味著S' = 2f,這時候小孔相機放大倍率為1, 于是投影關系就變成了所謂的正交投影

事實上,還有很多種投影方式,限于篇幅,我就不再詳述了。大家可看《計算機視覺:算法與應用》中的下圖,感受一下:

五. 總結

今天這篇文章主要回顧了小孔相機和薄透鏡成像相機的幾何模型,結合2D、3D齊次坐標和坐標變換的知識,講解了相機矩陣。我們知道了相機矩陣由幾個部分組成:內參矩陣K,以及外參矩陣,后者由投影矩陣、世界坐標系到相機坐標轉換的矩陣組合而成。對于普通的透視成像,一共有11個自由度。它包括了5個內參,3個旋轉角度,以及3個平移量。

當我們知道一個點在世界坐標系的坐標,同時又知道了投影矩陣P時,可以很容易的計算出它在圖像中的坐標。

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

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

相關文章

mysql 字符集不一致導致索引失效問題

mysql 字符集不一致導致索引失效問題 問題: 兩張表,同一個字段,由于字符集不一致,導致雖然都有索引,在關聯查詢時,索引失效身份表 identity_info ,查詢索引信息 show index from identity_info …

Linux內核設計與實現 - 第6章 內核數據結構

目錄1. 鏈表 (Linked Lists)2. 隊列 (Queues)3. 映射 (Maps)4. 二叉樹 (Binary Trees)5. 位圖 (Bitmaps)6. 其他數據結構性能考量1. 鏈表 (Linked Lists) 單向鏈表 vs 雙向鏈表 struct list_head 標準實現內核鏈表API:LIST_HEAD(), list_add(), list_del() 環形鏈表…

十五、K8s可觀測能力:日志收集

十五、K8s可觀測能力:日志收集 文章目錄十五、K8s可觀測能力:日志收集1、云原生日志框架-ECK介紹1.1 什么是ECK?1.2 ECK核心資源:1.3 生產級日志收集架構2、日志收集-ECK2.1 集群規劃2.2 ECK 安裝2.3 一鍵部署高可用 ES 集群2.4 一…

微服務變更?自動化測試利器Parasoft SOAtest修復快、準、穩!

微服務架構憑借靈活和可擴展的優勢越來越普及,但隨之而來的變更也成了開發團隊的“心頭大患”。服務之間依賴復雜,接口改來改去,不僅讓開發更費勁,還容易導致測試用例失效、測試效率下降,甚至埋下系統不穩的隱患。 自…

將Android Studio創建的一個apk工程放到Android15源碼中構建

背景描述:起初Android Studio創建的apk工程,為了方便系統版本發布和后期維護需要同時支持兩種構建方式:Android Studio Gradle構建 IDE界面環境,對習慣java環境變成的友好、UI設計方便看效果Android15系統構建時自動構建 So…

yolo8目標檢測+訓練(識別和平精英人物)

?步驟一:安裝 PyTorch(M1 專用)# 推薦使用官方 MPS 后端(Apple Metal 加速) pip install torch torchvision torchaudio確認是否使用了 Apple MPS:import torch print(torch.backends.mps.is_available()…

【ArcGISPro】修改conda虛擬安裝包路徑

問題在ArcGISPro中經常使用克隆,導致C盤默認虛擬安裝包內存越來越大,導致電腦很卡解決方案打開ArcGISPro所在conda文件夾D:\Program Files\ArcGIS\Pro\bin\Python\Scripts打開命令行工具(如 CMD 或終端)。輸入以下命令&#xff0c…

三格電子—西門子PLC串口轉網口模塊

一、功能概述本文檔是西門子PLC串口轉以太網系列產品,包含SG-S7-200-ETH、S7-200-ETH(2P),SG-S7-300-ETH,SG-S7-300-ETH(2P)共四個產品。使用框圖如下圖所示意。1.1 產品功能本系列產品用來給西門子S7-200/300 PLC串口擴展出網口來&#xff0…

Python—requests模塊

Python requests 模塊代碼演示 requests 是 Python 中一個簡單易用的 HTTP 庫,用于發送各種 HTTP 請求。下面是一些常見的使用示例: 1. 基本 GET 請求 import requests# 發送 GET 請求 response requests.get(https://api.github.com)# 檢查請求是否成功…

華為倉頡編程語言語法簡介與示例

華為倉頡編程語言語法簡介與示例 倉頡編程語言是華為自主研發的新一代通用編程語言,由南京大學馮新宇教授團隊主導設計,于 2024 年華為開發者大會(HDC)正式發布,并在 2025 年 7 月推出首個長期支持版本(LTS…

觸發器的創建

- 建立product表,操作方式operate表要求1.定義觸發器實現在產品表(product)中每多一個產品,就在操作表(operate)中記錄操作方式和時間以及編號記錄。注:操作說明:標記執行delete 、insert、update2.定義觸發器實現在產品表(product)中每更新一…

論文略讀: RASA: RANK-SHARING LOW-RANK ADAPTATION

ICLR 2025盡管 LoRA 有諸多優勢,但近期研究表明,它在大規模訓練數據集和復雜任務(如數學推理和代碼生成)中,仍然落后于全參數微調(FFT)一個合理的解釋是:低秩約束限制了 LoRA 的表達…

VSCode - VSCode 查找中文字符

VSCode 查找中文字符 1、查找中文字符使用快捷鍵 Ctrl F 打開查找框點擊正則表達式按鈕 .*在搜索框中輸入 [\u4e00-\u9fa5],這個范圍涵蓋了基本的中文字符2、查找中文字符串使用快捷鍵 Ctrl F 打開查找框點擊正則表達式按鈕 .*在搜索框中輸入 [\u4e00-\u9fa5]&a…

SQL基礎操作指南:增刪改查入門

前言 在日常數據庫操作中,掌握增刪查改是每個開發者必備的技能。下面我將通過實例解析SQL的核心操作要點,幫你避開常見陷阱。一、新增數據(INSERT) 單行插入:明確指定字段和值 INSERT INTO 表名(字段1, 字段2) VALUES …

Linux系統安裝Docker及部署Node.js 20.15.0(含pnpm、pm2)完整指南

前言:在應用項目部署中,“環境不一致”往往是開發與運維的痛點——本地能跑的代碼到了服務器就報錯,依賴版本、系統配置差異都可能成為隱患。而Docker的容器化技術恰好能解決這一問題,通過“一次構建,到處運行”的特性…

python的多線程無法并行只能并發,why?

標題python的多線程無法并行只能并發,why?python的多線程無法并行只能并發,why? 在 Python 中,特別是使用 CPython 解釋器時,由于存在 全局解釋器鎖(GIL),即使在多核處理…

Kotlin比較接口

在 Kotlin 中,Comparable 和 Comparator 是兩個允許開發者對相同或不同類的對象進行比較的接口。這兩個接口通常用于基于一個或多個屬性對對象集合進行排序與排序操作。本文將概述 Kotlin 的 Comparable 和 Comparator 接口,解釋它們的用法,并…

day41 簡單CNN

DAY 41 首先回顧下昨天的代碼。 # import torch # import torch.nn as nn # import torch.optim as optim # from torchvision import datasets, transforms # from torch.utils.data import DataLoader # import matplotlib.pyplot as plt # import numpy as np# # 設置中文字…

[實戰]巴特沃斯濾波器全流程解析:從數學原理到硬件實現

巴特沃斯濾波器全流程解析:從數學原理到硬件實現 文章目錄巴特沃斯濾波器全流程解析:從數學原理到硬件實現1. 數學原理2. 工程實現梯形網絡結構3. Python理論仿真4. 硬件仿真與PCB考慮5. 完整設計工具6. 輸出結果示例7. 設計注意事項巴特沃斯濾波器是特別…

《機器學習數學基礎》補充資料:標準差與標準化

1 標準差 我們經常使用平均數來大致了解一組數據,例如平均成績、平均身高、平均壽命等等。但是如果只看平均數,不一定能充分了解整體情況。比如說你和某首富住同一個社區,你們社區平均每戶年收入兩千萬,那么你家是有錢還是沒錢&am…