KannalaBrandt8 鱼眼相机模型
1. 鱼眼相机鱼眼相机镜头是由十几个不同的透镜组合而成在成像的过程中入射光线经过不同程度的折射投影到尺寸有限的成像平面上使得鱼眼镜头拥有更大的视野范围。下图为鱼眼相机的组成结构与针孔相机原理不同鱼眼镜头采用非相似成像在成像过程中引入畸变通过对直径空间的压缩突破成像视角的局限从而达到广角成像。鱼眼相机是一种焦距小于等于16mm且视角接近或者等于180°的极端广角镜头但是正是因为他极端的短焦和广角导致它因为光学原理而产生的畸变非常剧烈所以针孔模型并不能很好的描述鱼眼相机所以需要一种新的相机模型来对鱼眼相机进行近似模拟。2. 相机畸变鱼眼镜头无论如何它的边缘线条都是要弯曲的即使90度的鱼眼也是这样这种畸变我们在很多广角镜头上都可以看到而这就是明显的桶形畸变。同样的120度的鱼眼看起来弯曲的更加厉害一些了而且被容纳进范围的景物更多150度同样如此而180度的鱼眼则可以把镜头周围180度范围内的所有物体都拍摄进去。众所周知焦距越短视角越大因光学原理产生的变形也就越强烈。为了达到180度的超大视角鱼眼镜头不得不允许这种变形桶形畸变的合理存在。针对原始图像进行畸变校正后带有冗余边界需要做进一步截取。如下图3. KannalaBrandt8模型KB模型能够很好的适用于普通广角以及鱼眼镜头。KB模型假设图像光心到投影点的距离和角度的多项式存在比例关系角度的定义是点所在的投影光纤和主轴之间的夹角。3.1. 投影过程其中3.2. 反投影过程给定图像上一点可以得到归一化坐标可以得到带畸变的入射角去畸变后得到最后得到单位球面坐标4. KannalaBrandt8算法在ORB-SLAM3的实现4.1. 投影/** * brief 投影 * param 3D点 * return 像素坐标 * 注意ORBSLAM3为投影重载了许多方法以接受各种不同的数据类型在此就不一一列举了 * 它们只是进行了数据类型之间的转换然后统一以本方式实现不再赘述 **/ cv::Point2f KannalaBrandt8::project(const cv::Point3f p3D) { // r^2 x^2 y^2 const float x2_plus_y2 p3D.x * p3D.x p3D.y * p3D.y; // θ atan2(r,z) const float theta atan2f(sqrtf(x2_plus_y2), p3D.z); const float psi atan2f(p3D.y, p3D.x); // 计算θ的3579次方 // 计算2次方是为了方便计算3579次 相当于中间变量 const float theta2 theta * theta; const float theta3 theta * theta2; const float theta5 theta3 * theta2; const float theta7 theta5 * theta2; const float theta9 theta7 * theta2; // mvParameters是存放相机参数和畸变系数的数组 // [4] [5] [6] [7] 分别代表k1 k2 k3 k4 // 是不是感觉很熟悉 其实KB模型也常被用于针孔的畸变模型 // 计算获得d(θ) const float r theta mvParameters[4] * theta3 mvParameters[5] * theta5 mvParameters[6] * theta7 mvParameters[7] * theta9; // 注意注释的r和代码的r不是一个东西 代码r 注释d(θ) 注释r 代码x2_plus_y2 // [0] [1] [2] [3] 分别代表 fx fy cx cy // 利用公式 u (fx * d(θ) * xc) / r // v (fy * d(θ) * yc) / r // cos(psi) xc/r sin(psi) yc/r return cv::Point2f(mvParameters[0] * r * cos(psi) mvParameters[2], mvParameters[1] * r * sin(psi) mvParameters[3]); }4.2. 反投影/** * brief 反投影过程 * param 像素坐标 * return 归一化坐标 **/ cv::Point3f KannalaBrandt8::unproject(const cv::Point2f p2D) { //Use Newton method to solve for theta with good precision (err ~ e-6) // 使用Newton法来求解θ获得了很好的效果 // 获取归一化的x,y坐标 // x (u - cx) / fx // y (v - cy) / fy cv::Point2f pw((p2D.x - mvParameters[2]) / mvParameters[0], (p2D.y - mvParameters[3]) / mvParameters[1]); // xd yd // 设置尺度为1 float scale 1.f; // xd θd/r * xc yd θd/r * yc // xd^2 yd^2 (θd^2 / r^2) * (xc^2 yc^2) // xc^2 yc^2 r^2 // θ (xd^2 yd^2)^(1/2) float theta_d sqrtf(pw.x * pw.x pw.y * pw.y); // sin(psi) yc / r //确保θd在[-π,π]的范围内 theta_d fminf(fmaxf(-CV_PI / 2.f, theta_d), CV_PI / 2.f); // 不能超过180度 // 已知θd 求解 θ if (theta_d 1e-8) { //Compensate distortion iteratively float theta theta_d; // θ的初始值定为了θd // 开始迭代 for (int j 0; j 10; j) { float theta2 theta * theta, theta4 theta2 * theta2, theta6 theta4 * theta2, theta8 theta4 * theta4; float k0_theta2 mvParameters[4] * theta2, k1_theta4 mvParameters[5] * theta4; float k2_theta6 mvParameters[6] * theta6, k3_theta8 mvParameters[7] * theta8; // f(θ) θ k1 * θ^3 k2 * θ^5 k3 * θ^7 k4 * θ^9 // e(θ) f(θ) - θd // 直接求解θ很难 所以通过求导优化的方法 // 目标是优化获得e(θ) 0对应的θ // e(θ) 1 3 * k1 * θ^2 5 * k2 * θ^4 7 * k3 * θ^6 9 * k4 * θ^8 // δ(θ) e(θ) / e(θ) 修正量 float theta_fix (theta * (1 k0_theta2 k1_theta4 k2_theta6 k3_theta8) - theta_d) / (1 3 * k0_theta2 5 * k1_theta4 7 * k2_theta6 9 * k3_theta8); // 进行修正 theta theta - theta_fix; // 如果更新量变得很小表示接近最终值 if (fabsf(theta_fix) precision) break; } //scale theta - theta_d; // 求得tan(θ) / θd scale std::tan(theta) / theta_d; } // 获取归一化坐标 return cv::Point3f(pw.x * scale, pw.y * scale, 1.f); }4.3. 求解雅各比矩阵/** * breif 求解像素坐标关于三维点的雅各比矩阵 * param p3D 三维点 * return 雅各比矩阵[一个两行三列的矩阵] **/ cv::Mat KannalaBrandt8::projectJac(const cv::Point3f p3D) { float x2 p3D.x * p3D.x, y2 p3D.y * p3D.y, z2 p3D.z * p3D.z; float r2 x2 y2; float r sqrt(r2); float r3 r2 * r; float theta atan2(r, p3D.z); float theta2 theta * theta, theta3 theta2 * theta; float theta4 theta2 * theta2, theta5 theta4 * theta; float theta6 theta2 * theta4, theta7 theta6 * theta; float theta8 theta4 * theta4, theta9 theta8 * theta; float f theta theta3 * mvParameters[4] theta5 * mvParameters[5] theta7 * mvParameters[6] theta9 * mvParameters[7]; float fd 1 3 * mvParameters[4] * theta2 5 * mvParameters[5] * theta4 7 * mvParameters[6] * theta6 9 * mvParameters[7] * theta8; // u (fx * θd * x) / r cx // v (fy * θd * y) / r cy // θd θ k1 * θ^3 k2 * θ^5 k3 * θ^7 k4 * θ^9 // θ arctan(r,z) // r (x^2 y^2)^(1/2) cv::Mat Jac(2, 3, CV_32F); Jac.atfloat(0, 0) mvParameters[0] * (fd * p3D.z * x2 / (r2 * (r2 z2)) f * y2 / r3); // ∂u/∂x Jac.atfloat(1, 0) mvParameters[1] * (fd * p3D.z * p3D.y * p3D.x / (r2 * (r2 z2)) - f * p3D.y * p3D.x / r3); // ∂v/∂x Jac.atfloat(0, 1) mvParameters[0] * (fd * p3D.z * p3D.y * p3D.x / (r2 * (r2 z2)) - f * p3D.y * p3D.x / r3); // ∂u/∂y Jac.atfloat(1, 1) mvParameters[1] * (fd * p3D.z * y2 / (r2 * (r2 z2)) f * x2 / r3); // ∂v/∂y Jac.atfloat(0, 2) -mvParameters[0] * fd * p3D.x / (r2 z2); // ∂u/∂z Jac.atfloat(1, 2) -mvParameters[1] * fd * p3D.y / (r2 z2); // ∂v/∂z std::cout CV JAC: Jac std::endl; return Jac.clone(); }参考文献ORBSLAM3(六) Kannala_Brandt鱼眼相机模型_Y.Q.Shi的博客-CSDN博客_鱼眼相机slam一文搞懂鱼眼相机模型

相关新闻

5分钟掌握网盘直链解析:告别龟速下载的终极解决方案

5分钟掌握网盘直链解析:告别龟速下载的终极解决方案

5分钟掌握网盘直链解析:告别龟速下载的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…

2026/7/10 13:10:10 阅读更多 →
模型响应速度差3.8倍,文件解析上限缩水92%,ChatGPT Plus与免费版关键差异全解析,现在看还来得及

模型响应速度差3.8倍,文件解析上限缩水92%,ChatGPT Plus与免费版关键差异全解析,现在看还来得及

更多请点击: https://codechina.net 第一章:ChatGPT Plus与免费版的核心差异概览 ChatGPT Plus 是 OpenAI 提供的订阅服务,面向对响应速度、功能可用性及模型能力有更高要求的用户;而免费版则基于基础模型(如 GPT-3.5…

2026/7/10 13:08:09 阅读更多 →
Kodi字幕插件完全指南:如何告别手动搜索,实现智能字幕匹配?

Kodi字幕插件完全指南:如何告别手动搜索,实现智能字幕匹配?

Kodi字幕插件完全指南:如何告别手动搜索,实现智能字幕匹配? 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还在为找不到合适的…

2026/7/10 13:03:48 阅读更多 →

最新新闻

酷安UWP客户端:Windows电脑端畅享酷安社区完整指南

酷安UWP客户端:Windows电脑端畅享酷安社区完整指南

酷安UWP客户端:Windows电脑端畅享酷安社区完整指南 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 想在Windows电脑上享受酷安社区的全功能体验吗?酷安UWP客户端为…

2026/7/10 14:03:53 阅读更多 →
Fable 5与Opus 4.8对比:AI Agent开发实战与企业级应用指南

Fable 5与Opus 4.8对比:AI Agent开发实战与企业级应用指南

这次我们来看一个关于 AI Agent 开发的实战案例。项目标题直接点出了核心:Fable 5 在 Agent 功能实现上相比 Opus 4.8 有了质的飞跃,让公司内部工具的智能体功能变得丝滑好用。对于正在探索 AI Agent 落地的开发者来说,这个对比结果很有参考价…

2026/7/10 14:03:53 阅读更多 →
Nature|首个经过完整同行评审、配套真实湿实验的AI科研智能体证据

Nature|首个经过完整同行评审、配套真实湿实验的AI科研智能体证据

Nature刊发2套AI「科研助手」孪生系统,可设计并解析真实实验Google DeepMind的Co-Scientist与FutureHouse的Robin于本周同步完成同行评审,2者针对白血病、黄斑变性筛选出候选药物,且相关结果均通过实验室实操验证。#Na…

2026/7/10 14:01:52 阅读更多 →
nodejs-websocket实战案例:构建实时聊天应用的完整指南

nodejs-websocket实战案例:构建实时聊天应用的完整指南

nodejs-websocket实战案例:构建实时聊天应用的完整指南 【免费下载链接】nodejs-websocket A node.js module for websocket server and client 项目地址: https://gitcode.com/gh_mirrors/no/nodejs-websocket 想要构建高性能的实时聊天应用吗?n…

2026/7/10 14:01:52 阅读更多 →
【亲测免费】 探索网络安全的新领域:Hello CTF,你的CTF启蒙之路

【亲测免费】 探索网络安全的新领域:Hello CTF,你的CTF启蒙之路

探索网络安全的新领域:Hello CTF,你的CTF启蒙之路 【免费下载链接】Hello-CTF 【Hello CTF】题目配套,免费开源的CTF入门教程,针对0基础新手编写,同时兼顾信息差的填补,对各阶段的CTFer都友好的开源教程&am…

2026/7/10 14:01:52 阅读更多 →
A3910与PIC18F25K50组合的电机控制方案详解

A3910与PIC18F25K50组合的电机控制方案详解

1. 项目概述:A3910与PIC18F25K50的黄金组合在嵌入式控制领域,电机驱动与微控制器的搭配就像赛车引擎与驾驶员的配合——前者提供动力,后者掌控全局。A3910作为Allegro MicroSystems推出的全桥电机驱动芯片,与Microchip的PIC18F25K…

2026/7/10 13:59:51 阅读更多 →

日新闻

STM32与LTC1864高精度ADC的SPI通信实现

STM32与LTC1864高精度ADC的SPI通信实现

1. 项目背景与核心需求在工业控制和嵌入式系统开发中,模拟信号与数字系统的无缝集成一直是工程师面临的关键挑战。LTC1864作为一款16位高精度ADC转换器,配合STM32F101ZG这类主流微控制器,能够构建高性能的模拟信号采集系统。这种组合特别适合…

2026/7/10 0:03:07 阅读更多 →
猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼吗&am…

2026/7/10 0:05:09 阅读更多 →
直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

1. 直流有刷电机驱动方案概述在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H653FTG作为东芝推出的新一代H桥驱动器,与MKV46F256VLH16微控制器配合使用&#xff0c…

2026/7/10 0:05:09 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻