zemax设置 像方远心_ZEMAX相机标定非常不完全指南

70ddc0464fb32eebbfe9ec6ec132803d.png

ZEMAX是广为使用的一款光学仿真软件,是进行光路设计和分析的利器;而相机标定,则是进行机器视觉任务时,拿到一款相机,对其实际参数进行确定的过程。

因此看起来,二者其实主要是针对不同的侧重点。前者主要面向相机开发,后者面向相机使用。

但是最近遇到了一个问题,不得不使用ZEMAX进行一些相机标定算法方面的验证。这期间遇到了一些问题,这里记录下来希望可以与大家分享,如有不对之处进请指正。

事情的经过是这样的:现在手头有一台特殊光路的相机,由于相机是课题组自己设计搭建,因此也有相应的ZEMAX工程文件。在理想情况下该相机与普通相机的成像模型完全一致,因此理论上可以使用张正义相机标定法进行标定。

然而,相机光路中包含一些特殊结构的光学元件,这些元件的安装与制造误差势必会为成像系统引入畸变,因此有必要为这些畸变和误差建立对应的数学模型,就类似于普通相机中的径向畸变与切向畸变模型,从而对其进行矫正。所以问题来了,怎么验证模型的可靠性呢?

仿真!

我的想法是这样的。在ZEMAX中对一些光学元件的角度进行一些微调,以此来模拟实际情况中的安装误差;接着在ZEMAX中模仿张正义标定法,在物方视场中设置类似棋盘格的视场:

7604ff217f7f6cfa9676770496b88d1b.png

令成像系统在不同的位置与角度对物面成像,记录对应的像点。如此则得到了多组物点-像点的对应关系,接着使用张正义标定法再加上自己建立的误差模型对其进行标定,以此来验证自己的误差模型是否准确可靠。

OK,但是实际操作中,比较麻烦的地方就是“令成像系统在不同的位置与角度对物面成像”。下面就进入正题,说说我是怎么达到这个目的的。

一.旋转光学系统

当光路与视场都设定好之后,此时的3D视图是这样的:

dae7bb958f3f4ea38882585638214f2c.png

(吐槽一下,ZEMAX2017以后虽然最多可以设置超过2000个视场,但是只显示12个,如果视场中有48个视场点,需要重复设置4次才能完成所有成像)

进行相机标定的时候,我们需要在不同角度进行拍摄,因此首先想到的办法是旋转光学系统。

所以首先在物面之后添加坐标间断,设置旋转参数

58cb1138c1aead84b37d8a759f717254.png

然后就成了这个样子:

6cdc7243203ee641801e6e4c74de4f3b.png

光线进入了成像系统,但是却没有穿过后续的元件。

这里有一个办法或许能解决这个问题:

b4ec9f00fab400f2fbdda5d266361fe6.png

打开系统选项中的光线瞄准,这时:

b5f69361eae269fcdc886ec34d6ae681.png

可以看到光线已经按照光轴进行了偏折,接着调整坐标间断中的偏心参数,令所有光线进入即可。

c3f57f9aec4c0045f638f4604836f0a8.png

如果能顺利进行到这里的话,就已经大功告成了。但是我实际中遇到的问题是,当光路结构比较复杂的时候,在开启光线瞄准的情况下,输入倾斜角度经常会提示:

fdbf078365473a02f69c7319ef1d133b.png

而且由于光线瞄准是软件进行迭代求解,如果一次输入大角度,同样也会提示上述错误。比如直接输入30°就会报错,但是连续输入10°、20°、30°可能就没有问题。

在我的光学结构中,即使输入很小的倾斜角度就会报错,因此上述方法无法使用

二.旋转物面

山不走来,那就走向山;既然旋转光学系统不行,那旋转物面呢?

ZEMAX中,物面可以设置为倾斜面,可以输入正切值改变物面的角度。

2ee4615359fcd90d195935abfce2dd8c.png

比如输入Y正切为2:

b62bc9dfa878ea250c7bebd369c6e409.png

看起来好像不错的样子,但问题是,物面中各个视场之间的关系已经与之前不再相同了,之前我们设置视场的时候,是为每一个视场设定了一个平面坐标,但是旋转之后,虽然各个视场点仍在一个平面上,但是彼此之间的距离已经与之前不同了。

此时每个物面中的点,都成为一个三维点,x、y坐标是我们提前设置的,Z坐标为:

7a1a3966d4dad520fcf7321ab666fd1d.png

如果用这种方法进行相机标定,就类似于实际进行相机标定时,不同角度下拍摄不同的标定板。

但是仔细想想,张正义标定法中其实并没有限定标定板必须统一啊,拍一张换一个标定板也可以啊,只要确定标定板的尺寸和对应的像点就可以喽

于是接下来的问题转换为:三维空间平面中的三维坐标,怎么转化成该平面二维坐标?

我的做法是这样的:

根据上述方程,显然这个平面的法向量是(tanθx,tanθy,-1)。

显然(1,0,tanθx)也在该平面上,对上述两个向量进行模为1的操作后,再进行叉乘得到了第三个向量。

这三个向量组成了旋转后平面的一组正交基。对这三个向量组成的矩阵取逆,就得到了原始物面与旋转之后物面的转换关系。

将该逆矩阵与三维空间平面中的三维坐标相乘,就得到了对应的平面二维坐标(其实也是三维坐标,只是最后一个维度数值为0)。

再结合该平面每个视场对应的像点,就可以进行标定了。

值得注意的是,MATLAB中相机标定函数中的世界坐标是固定的,但是我们这里相当于每张照片都不同,因此相应的标定代码需要进行一些修改,才可以完成相机标定。

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

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

相关文章

[转载]大型网站架构演变和知识体系

之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不少同学都很难明白为什么…

activiti 生命周期_一文让你读懂什么是Activiti工作流

Activiti工作流学习经验总结(一)什么是工作流?工作流指通过计算机对业务流程进行自动化管理,实现多个参与者按照预定义的流程去自动执行业务流程。什么是Activiti?Activiti 是一个开源架构的工作流引擎,基于bpmn2.0 标准进行流程定…

关于hkcmd.exe造成的和Eclipse之间热键冲突

可能是自己新买的笔记本比较强大,显卡也比较牛叉.当使用一些常用的Eclipse快捷键的时候Eclipse本身没有反应,反而显示器有了反应. 经常用的Eclispse中的快捷键CtrlAlt↑ 和CtrlAlt↓ 造成显示器内容的上翻转和下翻转 解决方式: 下载Windows Hot Key Explore 软件 在安装启动后…

中对曲线进行斜率提取_Au中的EQ处理方法——图形均衡器和参数均衡器

之前的文章详细讲过使用Cubase进行EQ处理,其实如果只是要对录音进行混音修音的话,使用Au也可以,Adobe Audition作为音乐录制及后期软件,具有很强大的后期功能,而且也可以添加插件,是修音混音非常好的工具。…

YUV格式转换RGB(基于opencv)

在编写代码将需要处理YUV格从每个视频帧中提取,然后将其保存为图片。有两种常见的方法在线,第一种是通过opencv自带cvCvtColor,可是这样的方法有bug。得到的图片会泛白。另外一种方法是公式法。 法一:opencv自带cvCvtColor 说明&a…

2 数据源配置_Spring, MyBatis 多数据源的配置和管理

作者:digdeep出处:https://www.cnblogs.com/digdeep/p/4512368.html热门推荐vuewebsocketSpringboot实现的即时通信开源项目springboot炸翔版CMS开源系统同一个项目有时会涉及到多个数据库,也就是多数据源。多数据源又可以分为两种情况&#…

(九十)使用多个storyboard+代码实现控制器的分开管理

使用单个storyboard会使得项目难与管理,使用纯代码又会过于麻烦,因此如果能将二者结合起来,并且使用多个storyboard,会使得项目简单简单、方便许多。 下面以一个简单的视图关系为例,介绍多个storyboard的用法。 ①有pa…

吗 支持windows_M1能否原生支持Windows 苹果把问题抛给了微软

关于苹果M1处理器近期已经有了非常多的报道,人们对其出色的性能表现以及较低的功耗还是充满了期待。那么最后一个也是最重要的一个问题,基于苹果M1处理器的电脑能原生支持微软Windows吗?毕竟很多人买回苹果MacBook第一件事就是安装Windows 10…

数据库设计五要点 让数据库设计更加规范

通常情况下,可以从两个方面来判断数据库是否设计的比较规范。一是看看是否拥有大量的窄表,二是宽表的数量是否足够的少。若符合这两个条件,则可以说明这个数据库的规范化水平还是比较高的。当然这是两个泛泛而谈的指标。为了达到数据库设计规…

4怎么放大字体_win8.1系统如何放大所有字体?

电脑安装上[color#070c0 !important]win8.1正式版系统,发现桌面的字体和网页的字体比较小,看起来比较吃力,从而影响操作。一般win8.1系统字体都默认设置好的,不过用户可以进行放大,那么win8.1系统怎么放大所有字体&…

进程 zabbix_Zabbix监控在windows的进程(非进程数)

场景介绍:小Z同学最近遇到个项目需求,需求是用zabbix监控运行在windows的进程。然鹅,当小Z同学在网上搜了一大堆,发现基本上都是使用官方的proc.num(***.exe)键值拿到进程数量,很显然,这并不符合客户实际的…

spring配置数据库

一.加载数据库驱动 1.利用hibernate.properties文件加载 <bean class"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   <property name"locations">     <list>       <value>classpath…

golang 切片 接口_如何理解Golang中的接口?

个人认为&#xff0c;要理解 Go 的接口&#xff0c;一定先了解下鸭子模型。鸭子模型那什么鸭子模型&#xff1f;鸭子模型的解释&#xff0c;通常会用了一个非常有趣的例子&#xff0c;一个东西究竟是不是鸭子&#xff0c;取决于它的能力。游泳起来像鸭子、叫起来也像鸭子&#…

batchnomal_pytorch的batch normalize使用详解

torch.nn.BatchNorm1d()1、BatchNorm1d(num_features, eps 1e-05, momentum0.1, affineTrue)对于2d或3d输入进行BN。在训练时&#xff0c;该层计算每次输入的均值和方差&#xff0c;并进行平行移动。移动平均默认的动量为0.1。在验证时&#xff0c;训练求得的均值/方差将用于标…

phpcms文件所需权限

转载于:https://www.cnblogs.com/zhongheng/p/4684087.html

mysql 设置大小写_mysql修改大小写参数注意事项

原由&#xff1a;数据库中原本参数lower_case_table_names的值为0&#xff0c;应开发要求需要修改为不区分大小写&#xff0c;即修改为1。但是修改完之后&#xff0c;发现本来建立的大写字母的表查不到。修改过程1&#xff0c;在参数文件中修改lower_case_table_names12&#x…

论文中如何写mysql的介绍_mysql优化写论文,从哪几方面入手啊解决方法

引用第7章&#xff1a;优化目录7.1. 优化概述7.1.1. MySQL设计局限与折衷7.1.2. 为可移植性设计应用程序7.1.3. 我们已将MySQL用在何处&#xff1f;7.1.4. MySQL基准套件7.1.5. 使用自己的基准7.2. 优化SELECT语句和其它查询7.2.1. EXPLAIN语法(获取SELECT相关信息)7.2.2. 估计…

如何理解java回电话

同android中间Button的setOnClickListener这个回调案例&#xff1b; Button button (Button)this.findViewById(R.id.button); button.setOnClickListener(new Button.OnClickListener() {//回调函数overridepublicvoid onClick(View v) {buttonTextView.setText("按钮被…

python mysql 时间比较大小_python时间函数与mysql时间函数转换

时间相关操作&#xff0c;时间有三种表示方式&#xff1a;时间戳 1970年1月1日之后的秒&#xff0c;即&#xff1a;time.time()格式化的字符串 2014-11-11 11:11&#xff0c; 即&#xff1a;time.strftime(%Y-%m-%d)结构化时间 元组包含了&#x…

springMVC 前后台日期格式传值解决方式之二(共二) @InitBinder的使用

关于springmvc日期问题的解决方式 除了本博客的【springMVC 前后台日期格式传值解决方式之 DateTimeFormat的使用和配置】一文&#xff0c; 还有如下这种方式: 在Controller里加上这段代码&#xff1a; 1 InitBinder2 public void initBinder(ServletRequestDataBinder…