魚眼相機模型

魚眼相機模型

??最近涉及魚眼相機模型、標定使用等,作為記錄,更新很久不曾更新的博客。

文章目錄

  • 魚眼相機模型
  • 1 相機成像
  • 2 魚眼模型
  • 3 畸變
    • 3.1 適用針孔和MEI
    • 3.2 Kannala-Brandt魚眼模型
  • 4 代碼實現

1 相機成像

針孔相機:所有光線從一個孔(光心)透過,入射角θ\thetaθ = 出射角θd\theta_{d}θd?。0-180°的光線匯聚的圖像是無窮大的,所以針孔相機的視場角一般都很小。

魚眼相機:類似于凸透鏡成像,光線被聚集,入射角θ\thetaθ > 出射角θd\theta_{d}θd?。光線匯聚的圖像變小,所以魚眼相機的視場角一般可以達到18-270°。

在這里插入圖片描述

2 魚眼模型

常見模型,注意,這里的θ\thetaθ是入射角!!θd\theta_{d}θd?才是出射角。

在這里插入圖片描述

VINSAVP-SLAM中采用的MEI模型--------

在這里插入圖片描述

注意,常規魚眼模型的去畸變和針孔相機不同,可以見opencv中解釋;但是MEI模型經過變換后,可以直接套用針孔相機模型

3 畸變

畸變包括徑向畸變(Radial Distortion)和切向畸變(Tangential Distortion

魚眼相機本質是利用了相機的畸變獲取無窮遠處的投影,主要是徑向畸變

在這里插入圖片描述

3.1 適用針孔和MEI

首先來看下去畸變的本質,如圖所示,一共是四步

① 相機坐標系下某一點,是投影到光心矢量射線(相機成像原理),與圖像產生交點。歸一化這個坐標(如果再乘以焦距就是圖像坐標系上的坐標了),獲取畸變的xy。(這里為什么不乘以f呢,本質是矯正這一條投影到光心的矢量射線,沒有本質區別,歸一化計算更簡單)

② 計算成像半徑r(相機成像半徑r理論為r=f*tan(θd),3.2中有提到,也有圖)

③ 基于畸變參數,計算去畸變后的xy,此時,該點再圖像坐標系中的位置被矯正

④ 然后基于去畸變后的xy再變換到像素坐標系下,就可以獲取一個矯正的像素坐標

在這里插入圖片描述

但是實際上,我們只知道像素坐標,而非相機系坐標!所以實際中將像素坐標反變換到相機坐標系(歸一化),然后就可以按照這里的去畸變流程處理了。

? opencv中的MEI描述

3.2 Kannala-Brandt魚眼模型

參考opencv,注意,通用模型不是上面哪些等距模型,和哪些完全沒關系

相機系

Xc=RX+tXc = RX + t Xc=RX+t

把相機系坐標單獨取出來

x=Xc1y=Xc2z=Xc3x = Xc_1\\ y = Xc_2\\ z = Xc_3 x=Xc1?y=Xc2?z=Xc3?

歸一化,計算成像半徑、夾角

a=xzandb=yzr2=a2+b2θ=arctan?(r/1)a = \frac{x}{z} \quad \text{and} \quad b = \frac{y}{z} \quad r^2 = a^2 + b^2 \quad \theta = \arctan(r/1) a=zx?andb=zy?r2=a2+b2θ=arctan(r/1)

去畸變,注意這里的θdr\frac{\theta_d}{r}rθd??實際代碼是rdr\frac{r_d}{r}rrd??獲取的一個比例關系,opencv給出的公式有點誤導,可以參考原始論文(成像半徑rd=f?tan(θd)≈f?θdr_{d} = f*tan(\theta_{d}) ≈ f* \theta_{d}rd?=f?tan(θd?)f?θd?,歸一化,取f=1tanxx接近0時候約等于x

θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8)x′=(θdr)ay′=(θdr)b\theta_d = \theta (1 + k_1 \theta^2 + k_2 \theta^4 + k_3 \theta^6 + k_4 \theta^8) \\ x' = \left(\frac{\theta_d}{r}\right) a \\ y' = \left(\frac{\theta_d}{r}\right) b θd?=θ(1+k1?θ2+k2?θ4+k3?θ6+k4?θ8)x=(rθd??)ay=(rθd??)b

獲取去畸變后的像素坐標(α是偏斜系數,默認為0)

u=fx(x′+αy′)+cxv=fyy′+cyu = f_x (x' + \alpha y') + c_x \\ v = f_y y' + c_y u=fx?(x+αy)+cx?v=fy?y+cy?

注:通過上述模型,也就是棋盤格標定得到的去畸變圖像,相對于原圖,會小很多!距離中心越遠的區域,拉伸會很嚴重,校正后會被切除

4 代碼實現

可以參考opencv中映射矩陣來實現

bool UnDistortMap()
{if(is_init){return true;}// 畸變映射,每一張圖像的畸變映射是一致的cv::fisheye::initUndistortRectifyMap(mK, mD, cv::Matx33d::eye(), mK,cv::Size(Width, Height), CV_16SC2, m_undistortMapX, m_undistortMapY);// 通過調整cx,cy來增大去畸變后的視野// cv::fisheye::initUndistortRectifyMap(mK, mD, cv::Matx33d::eye(), mK,//                                     cv::Size(mK.at<double>(0,2), mK.at<double>(1,2)), CV_16SC2, //                                    m_undistortMapX, m_undistortMapY);    // 或者直接把fxfy調小,縮小相機焦距,視野變大了(分辨率dx不變)                               if (m_undistortMapX.empty() || m_undistortMapY.empty()) {std::cerr << "Failed to compute undistort maps!" << std::endl;return false;}else{}is_init = true;return true;
}bool undistortImage(const cv::Mat& src, cv::Mat& dst)
{if(!is_init)return false;cv::remap(src, dst, m_undistortMapX, m_undistortMapY, cv::INTER_LINEAR); // 去畸變return true;
}
Computes undistortion and rectification maps for image transform by cv::remap(). If D is empty zero distortion is used, if R or P is empty identity matrixes are used.Parameters:
K – Camera matrix \f$K = \vecthreethree{f_x}{0}{c_x}{0}{f_y}{c_y}{0}{0}{_1}.
D – Input vector of distortion coefficients k_1, k_2, k_3, k_4).
R – Rectification transformation in the object space: 3x3 1-channel, or vector: 3x1/1x3 1-channel or 1x1 3-channel
P – New camera matrix (3x3) or new projection matrix (3x4)
size – Undistorted image size.
m1type – Type of the first output map that can be CV_32FC1 or CV_16SC2 . See convertMaps() for details.
map1 – The first output map.
map2 – The second output map.

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

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

相關文章

大語言模型提示詞工程詳盡實戰指南

引言&#xff1a;與大型語言模型&#xff08;LLM&#xff09;高效對話的藝術大型語言模型&#xff08;LLM&#xff09;——例如我們熟知的GPT系列、Claude、Llama等——在自然語言處理&#xff08;NLP&#xff09;領域展現了驚人的能力&#xff0c;能夠執行文本摘要、翻譯、代碼…

HTTP 請求體格式詳解

1. 概覽與概念 Content-Type&#xff1a;HTTP 請求/響應頭&#xff0c;表示消息體的媒體類型&#xff08;MIME type&#xff09;。服務端用它決定如何解析請求體。常見場景&#xff1a; 純結構化數據&#xff08;JSON&#xff09; → application/json表單 文件上傳 → multip…

事務設置和消息分發

事務 RabbitMQ是基于AMQP協議實現的&#xff0c;該協議實現了事務機制&#xff0c;因此RabbitMQ也支持事務機制. SpringAMQP也提供了對事務相關的操作&#xff0c;RabbitMQ事務允許開發者確保消息的發送和接收是原子性的&#xff0c;要么 全部成功&#xff0c;要么全部失敗.| 前…

Python 中 try / except / else / finally 異常處理詳解

1. 基本結構 try:# 可能會拋出異常的代碼 except SomeException as e:# 捕獲并處理異常 else:# 如果 try 中代碼沒有異常&#xff0c;就執行這里 finally:# 無論是否發生異常&#xff0c;最后都會執行這里2. 各部分的作用 try 用途&#xff1a;包含可能發生異常的代碼段。如果代…

冰火島 Tech 傳:Apple Foundation Models 心法解密(下集)

引子 上集說到冰火島冰屋內,謝遜、張翠山、殷素素三人親見 “指令(Instructions)” 如何讓 AI 脫胎換骨,從木訥報地名的 “愣頭青”,變身為文采斐然的 “旅行作家”。 正當素素驚嘆這 AI 武學的奇妙時,謝遜卻突然神色一凜,指著手腕上用冰屑刻的 “4096” 字樣道:“這等…

Qt信號與槽機制全面解析

? 1. 核心概念信號與槽是Qt獨創的一種對象間通信機制&#xff0c;它使得一個對象的狀態變化或事件發生能夠自動通知其他對象作出響應&#xff0c;從而實現高度解耦的代碼設計。1.1 信號&#xff08;Signals&#xff09;定義&#xff1a;信號是由對象在特定事件發生時發出&…

2025年COR SCI2區,基于近似細胞分解的能源高效無人機路徑規劃問題用于地質災害監測,深度解析+性能實測

目錄1.摘要2.問題描述與數學模型3.能源網格混合元啟發式算法4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流1.摘要 本文提出了一種能源高效的無人機路徑規劃方法&#xff08;EURP&#xff09;用于監測分散的地質災害易發區域&#xff0c;通過建立無人機飛行模式的…

LangChain關于提示詞的幾種寫法

上文中 <---->(可點擊移步查閱),我們已經了解到LangChain如何編寫調用大模型的一個基本框架, 在編寫完這個基本框架后,就要與大模型進行交互了,這時候,就需要我們編寫提示詞了, 那么以下,就會介紹提示詞的幾種編寫方式 1 可攜帶變量的提示詞 1.1 PromptTempla…

CyberPoC 是一個現代化的網絡安全練習和競賽平臺,支持容器化部署的安全挑戰,為用戶提供實踐網絡安全技能的環境。

工具介紹 CyberPoC 是一個現代化的網絡安全練習和競賽平臺&#xff0c;支持容器化部署的安全挑戰&#xff0c;為用戶提供實踐網絡安全技能的環境。 &#x1f680; 快速開始 使用 Docker Compose (推薦) 克隆項目 git clone https://github.com/dushixiang/cyberpoc.gitcd cy…

【單片機day03】

UART串口通用異步收發器&#xff0c;2個串口(1個串口被用于ISP下載程序&#xff0c;1個串口被用于和主機之間的通信)全雙工&#xff08;兩根線TX、RX&#xff09;、串行、異步通信方式&#xff1a;單工&#xff1a;發送方和接收方是固定的&#xff0c;數據只能從發送方 發給 …

react16到react19更新及底層實現是什么以及區別

好問題 &#x1f44d;。React 16 → 19 的更新跨度其實涵蓋了 React 的幾個“時代級”的演進&#xff1a;從 Fiber 架構 的重寫、到 并發特性 的引入&#xff0c;再到 React Server Components 和 現代語法支持。我幫你梳理下主要更新點和底層實現的區別&#xff0c;方便你系統…

【分享】基于百度腦圖,并使用Vue二次開發的用例腦圖編輯器組件

偶然間發現了這個項目&#xff0c;分享出來。 【分享】基于百度腦圖&#xff0c;并使用Vue二次開發的用例腦圖編輯器組件1 項目地址2 項目簡介3 項目部署3.1 安裝node和npm3.2 項目下載3.3 修改npm鏡像源3.4 部署4 項目中使用1 項目地址 基于百度腦圖&#xff0c;并使用Vue二次…

Kotlin中抽象類和開放類

抽象類 (Abstract Class) 定義和特點 抽象類使用 abstract 關鍵字聲明&#xff0c;是一種不能被直接實例化的特殊類&#xff0c;主要用于被其他類繼承。 abstract class Base {open fun f() {} }abstract class Derived : Base() {override abstract fun f() // 抽象成員在類中…

TensorFlow深度學習實戰(37)——深度學習的數學原理

TensorFlow深度學習實戰&#xff08;37&#xff09;——深度學習的數學原理0. 前言1. 反向傳播歷史2. 微積分相關概念2.1 向量2.2 導數和梯度2.3 梯度下降2.4 鏈式法則2.5 常用求導公式2.6 矩陣運算3. 激活函數4. 反向傳播4.1 前向計算4.2 反向傳播5. 交叉熵及其導數6. 批量梯度…

1.1 汽車運行滾動阻力

汽車運行阻力由4部分構成&#xff1a;滾動阻力、空氣阻力、坡度阻力、加速阻力。 1).汽車在水平道路上等速行駛時&#xff0c;必須克服來自地面的滾動阻力和來自空氣的空氣阻力。 2). 當汽車在坡道上上坡行駛時&#xff0c;還必須克服重力沿坡道的分力&#xff0c;稱為坡度阻…

e203000

1&#xff09;①BIU作為核心通信樞紐&#xff0c;主要承擔兩大功能&#xff1a;一是連接處理器核內的關鍵執行單元&#xff08;包括IFU、LSU和EAI協處理器&#xff09;&#xff0c;統一管理指令和數據的內部傳輸路徑&#xff1b;二是作為"核內計算"與"核外資源&…

Infortrend普安科技IEC私有云平臺VM解決方案

Infortrend企業云&#xff08;IEC&#xff09;內置Hypervisor運行VM。功能完整、無需額外付費。在本文中&#xff0c;我們將為您詳細介紹IEC是如何支持 VM的。市場現狀與挑戰市場現狀 虛擬化市場面臨轉型&#xff0c;主流廠商&#xff08;如 VMware&#xff09;改用訂閱制…

【代碼隨想錄算法訓練營——Day6(Day5周日休息)】哈希表——242.有效的字母異位詞、349.兩個數組的交集、202.快樂數、1.兩數之和

LeetCode題目鏈接 https://leetcode.cn/problems/valid-anagram/ https://leetcode.cn/problems/intersection-of-two-arrays/ https://leetcode.cn/problems/happy-number/ https://leetcode.cn/problems/two-sum/ 題解 242.有效的字母異位詞 這道題要想到用哈希表來做。同時注…

安科瑞基站智慧運維云平臺:安全管控與節能降耗雙效賦能

功能&#xff1a;基站智慧用電云平臺通過對5G宏站和室分站點加裝交/直流智能監控設備、無線采集設備以及系統管理平臺&#xff0c;完成夜間無業務時段的下電操作&#xff0c;減少電能消耗&#xff0c;降低運營成本支出&#xff0c;以及提升通信設備供電線路狀態的實時監測保護功…

處理省市區excel數據加工成SQL

原始數據相關內容鏈接 處理excel數據加工成SQL的腳本 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Excel行政區域數據轉SQL腳本 - 支持特殊行政單位處理&#xff08;如省直轄縣級行政單位&#xff09; - 支持批量處理 """import pand…