鱼眼相机模型

  最近涉及鱼眼相机模型、标定使用等,作为记录,更新很久不曾更新的博客。

文章目录

  • 鱼眼相机模型
  • 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=Xc1y=Xc2z=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=zxandb=zyr2=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=ftan(θ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)+cxv=fyy+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…