【鱼眼镜头10】等距Equidistant模型的Kannala-Brandt模型,opencv的鱼眼标定使用的模型。kalibr中的 pinhole + equidistant 都是指该模型。

news2024/9/20 15:20:36

Kannala Brandt 模型 / opencv中的fisheye / kalibr中的 pinhole + equidistant 都是指该模型。

  • opencv
    • https://docs.opencv.org/4.x/db/d58/group__calib3d__fisheye.html
  • kalibr
    • https://github.com/ethz-asl/kalibr/wiki/supported-models

在之前的博客【鱼眼镜头1】鱼眼镜头的四种投影模型(指导镜头的设计),中央镜头综述,说明了投影模型的重要性:为了从全向相机捕获的图像中提取有用的信息,我们需要知道光线如何从三维空间映射到二维图像平面。这就是投影模型的作用。一个准确的投影模型可以帮助我们更准确地估计场景中物体的位置、姿态和其他属性。

常见的鱼眼相机基本成像模型主要有四种,它们分别是等距投影(最广泛)、等立体角投影、体视投影、正交投影。镜头的设计基本是按照上述四种投影模型而制作的,可看出鱼眼相机成像模型通用性较差。

为了解决模型通用性较差的问题,可以引入畸变模型,将鱼眼成像模型等价成理想针孔成像模型与畸变模型的叠加作用。

以上是之前对鱼眼相机的标定和投影模型的理解。鱼眼相机由于其超大的视场角(Field of View, FOV),其成像过程并不完全符合传统的针孔相机模型。因此,需要使用特定的投影模型来描述鱼眼相机的成像过程。

  1. Equidistant模型

    • Equidistant模型(等距投影模型)是一种常用的鱼眼相机投影模型。在这个模型中,图像半径rd与入射角Θ(光线与相机光轴的夹角)之间的关系是线性的,即rd = f * Θ,其中f是相机的焦距。这个模型假设在图像平面上,沿各个方向上的距离都是等比例缩放的。
  2. 鱼眼相机的实际设计

    • 对于实际的鱼眼镜头来说,由于制造和设计的限制,它们不可能完全精确地按照某个特定的投影模型来设计。因此,为了更准确地描述鱼眼相机的成像过程,需要使用更复杂的模型或近似方法。
  3. Kannala的鱼眼相机多项式近似模型

    • Kannala提出了一种鱼眼相机的一般多项式近似模型。这个模型使用多项式来近似描述图像半径rd与入射角Θ之间的关系。这种方法的优点是可以更灵活地适应不同鱼眼相机的成像特性,提高标定的准确性。
  4. 奇函数和泰勒级数展开
    在这里插入图片描述

    • 在讨论鱼眼相机的投影模型时,提到了 Θ d \Theta_d Θd Θ \Theta Θ的奇函数。这意味着当 Θ \Theta Θ取正值和负值时, Θ d \Theta_d Θd的绝对值相同但符号相反。这是因为鱼眼相机的成像过程在光轴的两侧是对称的。
    • 将投影模型按泰勒级数展开,可以发现 Θ d \Theta_d Θd可以用 Θ \Theta Θ的奇次多项式来表示。这是因为奇次多项式在原点附近是对称的,这与鱼眼相机的成像特性相符。

综上所述,使用Equidistant模型可以简化鱼眼相机的成像过程,但实际的鱼眼镜头可能无法完全遵循这个模型。为了更准确地描述鱼眼相机的成像过程,可以使用更复杂的模型或近似方法,如Kannala的多项式近似模型。同时,通过泰勒级数展开和奇函数性质的分析,可以更好地理解这些投影模型的特点和适用性。
在这里插入图片描述在这里插入图片描述

其中使用最多的是Equidistant模型, 即rd=f*\Theta,对实际的鱼眼镜头来说,它们不可能精确地按照投影模型来设计,所以为了方便鱼眼相机的标定,Kannala提出了一种鱼眼相机的一般多项式近似模型。通过前面的四个模型,可以发现\Thetad 是 \Theta的奇函数,而且将这些式子按泰勒级数展开,发现 可以用 的奇次多项式表示

opencv中的fisheye::calibrate就是用的该模型. 也叫作kannala-brandt模型.

3D到2D投影

在这里插入图片描述

class SVCCalibrationSDK:
    def __init__(self, intrinsic_param, width, height):
        self.image_size = np.array([height, width])  # rows, cols
        self.world2cam = np.array(intrinsic_param["world2cam"]).reshape(-1, 1)
        self.world2cam_len = np.array(intrinsic_param["world2cam_len"])
        self.svc_rotation = np.array([[1., intrinsic_param["affine_e"]],
                                     [intrinsic_param["affine_d"], intrinsic_param["affine_c"]]])
        self.svc_translation = np.array(intrinsic_param["center"])
 
    def cam_to_pixel(self, points):
        num_points = len(points)
 
        if num_points == 0:
            return np.empty((0, 3))
        else:
            norm = np.sqrt(np.sum(points[:, 0:2] * points[:, 0:2], axis=1, keepdims=True))
            theta = np.arctan(points[:, 2:3] * (-1 / norm))
 
            poly_theta = np.power(theta, np.arange(self.world2cam_len))
            rho = (poly_theta @ self.world2cam)
 
            pixels = (points[:, 0:2] * (rho / norm)) @ self.svc_rotation + self.svc_translation
 
        return pixels

2D到3D投影

在这里插入图片描述

参考

https://zhuanlan.zhihu.com/p/532501102

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1703255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux centos磁盘清理相关

清理磁盘流程 1、查看磁盘挂载路径及使用率 df -h2、查看当前文件下文件大小 du -sh *3、制空文件内容 > 文件名 ###制空当前文件内容,直接清0 列子 >access.loglinux操作系统中,经常会遇到磁盘空间满的问题。遇到这样的问题,先查下…

实战 | 使用YoloV8实例分割识别猪的姿态(含数据集)

导 读 本文主要介绍如何使用YoloV8实例分割识别猪的姿态(含数据集)。 背景介绍 在本文中,我将介绍如何使用YoloV8在猪的自定义数据集上进行实例分割,以识别和跟踪它们的不同姿态。 数据集 使用的数据集来源于Kokkenborg Aps&…

【智能算法】青蒿素优化算法(AO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年,C Yuan受到青蒿素药物治疗疟疾过程启发,提出了青蒿素优化算法(Artemisinin Optimization, AO)。 2.算法原理 2.1算法思想 AO灵感来…

在C++中自定义命名空间,在命名空间中定义string变量,同时定义一个函数实现单词逆置

代码 #include <iostream> #include <cstring> using namespace std; namespace my_space {string s;void reverse(string s);//定义逆置函数 } using namespace my_space; void my_space::reverse(string s){int lens.size();int i0;int jlen-1;while(i<j){//…

MongoDB 和 AI 赋能行业应用:电信和媒体

欢迎阅读“MongoDB 和 AI 赋能行业应用”系列的第二篇。 本系列重点介绍 AI 应用于不同行业的关键用例&#xff0c;涵盖制造业和汽车行业、金融服务、零售、电信和媒体、保险以及医疗保健行业。 电信行业的经营环境以利润空间狭小为特点&#xff0c;尤其是在差异化极小的商品…

markdown画时序图的时候,如何自动显示每一条时序的序号

1: 现象描述 今天画时序图的时候&#xff0c;发现时序上面没有显示序号&#xff0c;看起来不够清晰&#xff0c;只有单纯的说明; 如下图所示 刚测试CSDN的时序图&#xff0c;默认是带序号的&#xff0c;看起来和实际使用的markdown工具有关系&#xff1b; 2&#xff1a;解决办…

MIT6.828 Lab2-1 Using gdb

Using gdb gdb使用&#xff1a; xv6 gdb调试方法 问题1&#xff1a; Looking at the backtrace output, which function called syscall? 按照提示开启gdb后键入&#xff1a; b syscall c layout src backtrace输出结果&#xff1a; (gdb) backtrace #0 syscall () at k…

nodejs开发入门01启动服务器

目录 1 创建项目2 初始化项目3 创建app.js4 服务器启动代码5 浏览器里访问6 部署到云服务器总结 nodejs是一个服务器运行环境&#xff0c;可以让我们搭建我们自己的服务器&#xff0c;接收客户端的请求&#xff0c;并给出响应。第一篇我们介绍一下服务器的搭建以及启动过程。 1…

Compose学习记录(1)

Compose学习记录(1) 简易使用HelloWorld。 新建一个工程&#xff0c;它已经默认启用了compose特性。MainActivity继承自 ComponentActivity&#xff0c;可以用compose来编写UI界面。 // sample 1: simple VersionsetContent {Text("Hello World.")}一个函数&#xf…

【项目】教你手把手完成博客系统(三)显示用户信息 | 实现退出登录 | 实现发布博客

文章目录 教你手把手完成博客系统&#xff08;三&#xff09;7.实现显示用户信息1.约定前后端交互接口2.前端通过ajax发起请求3.服务器处理请求 8.实现退出登录1.约定前后端的接口2.前端发起请求3.服务器处理请求 9.实现发布博客1.约定前后端的交互接口2.前端构造请求3.服务器处…

.NET调用阿里云人脸核身服务端 (ExecuteServerSideVerification)简易流程保姆级教学

需要注意的是&#xff0c;以下内容仅限基础调用 功能说明 该功能是输入核验人的姓名和身份证以及人脸照片&#xff0c;去阿里库里面匹配&#xff0c;3个信息是否一致&#xff0c;一致则验证通过&#xff0c;需要注意的是&#xff0c;人脸有遮挡&#xff0c;或者刘海&#xff0…

三分钟“手撕”顺序表与ArrayList

前言&#xff1a; 实现顺序表的代码放开头&#xff0c;供大家更好的查阅&#xff0c;每个方法都有代码的实现。 其次我会讲解Java自带的ArrayList的实例&#xff0c;扩容机制ArrayList使用方法&#xff0c;遍历以及它的优缺点。 目录 一、自己实现的顺序表 二、Java的ArrayLi…

Flutter中如何让Android的手势导航栏完全透明?

Flutter 开发中 安卓机器都有 像ios 的手势操作栏&#xff0c; 也就是屏幕底下的 那条线。 但这条线默认是有颜色的 &#xff08;像下面这样&#xff09; 一、全屏幕方式 void main() {// 全屏沉浸式SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []…

解决Error: error:0308010C:digital envelope routines::unsupported的四种解决方案

问题描述&#xff1a; 报错&#xff1a;Error: error:0308010C:digital envelope routines::unsupported 报错原因&#xff1a; 主要是因为 nodeJs V17 版本发布了 OpenSSL3.0 对算法和秘钥大小增加了更为严格的限制&#xff0c;nodeJs v17 之前版本没影响&am…

ROS学习笔记(16):夹缝循迹

0.前言 在笔记的第15期对巡墙驾驶的原理进行了简单讲解&#xff0c;而这期我们来讲一下夹缝循迹&#xff0c;也常被叫follow the gap&#xff0c;也更新一些概念。 1.探索式路径规划与避障 1.概念 无预先建图的路径规划叫探索式路径规划&#xff0c;例如巡墙循迹和夹缝循迹&…

解决 Spring Boot 应用启动失败的问题:Unexpected end of file from server

解决 Spring Boot 应用启动失败的问题&#xff1a;Unexpected end of file from server 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的…

启动docker报错:Failed to listen on Docker Socket for the API.

说明&#xff1a; 1、安装部署docker完成后&#xff0c;启动docker报错&#xff1a;Failed to listen on Docker Socket for the API&#xff0c;如下图所示&#xff1a; 2、将SocketGroupdocker更改成&#xff1a;SocketGrouproot即可 一、解决方法&#xff1a; 1、执行命令…

nodejs安装配置

nodejs安装 打开nodejs官网(https://nodejs.org/en/download/package-manager)&#xff0c;参考安装步骤操作。 更新镜像源 输入以下命令&#xff0c;将npm的镜像源设置为淘宝镜像。网上资料中&#xff0c;淘宝镜像地址多为https://registry.npm.taobao.org&#xff0c;这个…

OpenBayes 一周速览|TripoSR 开源:1 秒即 2D 变 3D、经典 GTZAN 音乐数据集上线

公共资源速递 This Weekly Snapshots &#xff01;5 个数据集&#xff1a; FER2013 面部表情识别数据集 GTZAN 音乐流派分类数据集 MVTec-AD 工业异常检测数据集 UCAS-AOD 遥感目标检测数据集 Oxford 102 Flowers 花卉图片数据集 3 个教程&#xff1a; Latte 全球首个开…

C++青少年简明教程:switch语句

C青少年简明教程&#xff1a;switch语句 在C中&#xff0c;switch语句用于基于一个表达式的值来执行不同的代码块。这个表达式通常是一个整数类型&#xff08;如int&#xff0c;char&#xff0c;或枚举类型&#xff09;&#xff0c;并且case标签必须是整数常量表达式。 语法格…