记录一下整个相机的标定矫正过程,希望能够帮助到刚学习标定的童鞋们~

首先下载matlab calibration toolbox,百度搜索第一条就是了(http://www.vision.caltech.edu/bouguetj/calib_doc/)。下载到本地后,需要在MATLAB中更改主路径:

Set Path->Add with Subfolders->选定你刚下载的toolbox所在目录。

在command Window中敲calib加载图像,此时会弹出一个框框。注意你的Current Folder是标定图像所在的目录。

选择Standard(all the images are stored in memory)->Read images.

command 窗口中会显示当前目录下的所有文件,并要求你输入要矫正的相机图像的basename.我一般对需要矫正的图像会这样命名,方便后期的操作:左图(left_%d.jpg)右图(right_%d.jpg)。而这里要求的basename则是前缀中除开数字的部分,以矫正左图为例,那么就是输入left_

接下来会问你图像格式,注意这里能够接受的图像格式有(ras,bmp,tif,pgm,jpg,ppm),你根据你图像的实际格式输入,我这边是jpg格式。

回到那个toolbox中,选择Extract grid corners,提取角点。

它会问你是否处理所有图像,这个根据你自己的需求设定,默认是全部。包括后面会问到选择的框框的大小,默认值是长宽个15个像素。一般我是用默认值,但是注意一点就是如果你在扣角点的过程中框框已经太大将其他角点也包含进来,那么你就可以适当的调整这个框框的尺寸。所有的图像按照一定的方向(我习惯是顺时针)扣四个角点。如图中绿色圈圈的位置。第一张图会问你关于棋格的尺寸,你根据你的实际情况来填就好,我这里是100mm。

所有的图像都抠完角点后,选择Calibration,进行标定,如果标定参数正常,则保存下来。因为我会标定左右摄像头得到的图像,因此后面还需要进行双目标定。因此这里得到标定的参数文件后我会先改它的命名,为了后面双目标定做准备。

提醒一点。在标定完左相机需要标定右相机的时候,先clear all 一下,再重新开始。

双目标定:

clear all 后,输入 stereo_gui->Load left and right calibration files->Run stereo calibration->Save stereo calib results

双目标定便结束了。

标定后我们就得到了左右摄像机的内外参数。Focal Length是焦距,我们一般在立体视觉中基于左图来计算,故需要的fx fy就是左摄像机的Focal Length参数。Principal point是主点,常用cu,cv表示。Skew这里指的是图像中U轴和V轴的夹角与90°的差值,一般来说数值是接近于0的。Distortion则是畸变参数。在立体匹配中我们常常看见的一个baseline参数,就在这里Translation vector中的x值。获取了相机内外参数后,我们需要对这对相机获取的图像进行矫正。具体的矫正程序放在github上了有兴趣的可以下载来看看。将刚刚标定得到的参数放上去运行就能得到矫正后的图像了。

https://github.com/RebeccaTsang/Rectify

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

分割线

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在实践过程中遇到了一些问题,也借这个机会在这里做一下笔记。

用MATLAB读取图像的时候,对图像的命名要求比较高,建议像我这样命名即(basename+id.jpg)比较方便。可问题是我们得到数据时命名往往不是按照我们想的那样命名,这时候就需要批量命名。在Windows下和Ubuntu下的方法各异,我是在Ubuntu下做的实践,那我介绍一下Ubuntu下的批量命名方式吧。

这里我就不讲具体的原理和语法,百度Ubuntu 批量重命名/批量改后缀名 都介绍了很多方法和语法在里面。我这里只讲我是怎么做的。

最开始我得到的图像命名是这样的,首先我要改图像的后缀名,注意的是png格式是可以改成jpg格式的,而jpg格式不能直接改为png格式。

在该目录下打开终端:

mogrify -format jpg *.png

rm *.png

上面两步的意思是将所有png格式的图像生成一个jpg格式的,再把所有png图像删掉。

rename -n 's/^/left_/' *l.jpg
rename -f 's/^/left_/' *l.jpg
rename -n 's/_l//' *l.jpg
rename -f 's/_l//' *l.jpg

这里-n是显示你即将要重命名的文件以及重命名后的结果,但是仅仅是显示,而非真正的改动。-f则是真正的执行重命名的命令。

头两句的意思是指在文件名最前面,“^"指的是最前面,添加left_。这样我们得到的命名是left_xxxx_l.jpg。

后面的_l是我们不需要的,则需要后面的两句话执行,将命名中的”_l"替换为空。

值得注意的是这里的1,3句我们是仅用作显示,看看这个结果是不是我们想要的,不打也可以。最后结果为:

注意到尽管现在的命名格式已经符合规范,但是数字编号不是按顺序的,就需要对这个数字进行重新编号。

新建一个文档,命名为ren.sh。内容为一下这段代码,可以将所有right_xxxx.jpg的文件重新从0开始编号。同理,这是针对右图的,左图的话更改right为left就可以了。

#!/bin/bash
j=;
for i in `seq -f "right_%04g.jpg" `;
do
#echo $i
if [ -f $i ];
then
echo $i "exist";
mv $i right_$j.jpg
let j+=;
fi done

在相应目录下打开终端,执行

./ren.sh

便得到以下结果:

使用MALTAB标定实践记录的更多相关文章

  1. Spring Boot 2 实践记录之 封装依赖及尽可能不创建静态方法以避免在 Service 和 Controller 的单元测试中使用 Powermock

    在前面的文章中(Spring Boot 2 实践记录之 Powermock 和 SpringBootTest)提到了使用 Powermock 结合 SpringBootTest.WebMvcTest ...

  2. Spring Boot 2 实践记录之 使用 ConfigurationProperties 注解将配置属性匹配至配置类的属性

    在 Spring Boot 2 实践记录之 条件装配 一文中,曾经使用 Condition 类的 ConditionContext 参数获取了配置文件中的配置属性.但那是因为 Spring 提供了将上 ...

  3. Spring Boot 2 实践记录之 MyBatis 集成的启动时警告信息问题

    按笔者 Spring Boot 2 实践记录之 MySQL + MyBatis 配置 中的方式,如果想正确运行,需要在 Mapper 类上添加 @Mapper 注解. 但是加入此注解之后,启动时会出现 ...

  4. Ionic3项目实践记录

    Ionic3首次项目实践记录 标签(空格分隔): Angular Ionic Ionic3踩坑 1. 路由懒加载(lazy load) 如果设置了懒加载,就必须全部懒加载(包括TabsPage),否则 ...

  5. k8s1.4.3安装实践记录(2)-k8s安装

    前面一篇已经安装好了ETCD.docker与flannel(k8s1.4.3安装实践记录(1)),现在可以开始安装k8s了 1.K8S 目前centos yum上的kubernetes还是1.2.0, ...

  6. ElasticSearch5.0+版本分词热更新实践记录

    前言 刚开始接触ElasticSearch的时候,版本才是2.3.4,短短的时间,现在都更新到5.0+版本了.分词和head插件好像用法也不一样了,本博客记录如何配置Elasticsearch的Hea ...

  7. 9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等

    1.已知json串构成的情况下判断 先构造一下场景,假设已经把各个数据都移除掉不对比的字段 图1 预期.实际结果,复杂接口返回多层嵌套json时,同下 图2 预期.实际结果值为:{child_json ...

  8. 9-1、大型项目的接口自动化实践记录----数据库结果、JSON对比

    上一篇写了如何从DB获取预期.实际结果,这一篇分别对不同情况说下怎么进行对比. PS:这部分在JSON对比中也适用. 1.结果只有一张表,只有一条数据 数据格式:因为返回的是dicts_list的格式 ...

  9. 8、大型项目的接口自动化实践记录----DB分别获取预期结果、实际结果

    上一篇实现数据分离升级版--从DB获取数据,以及对应的请求实现,作为一个case,还缺少了预期结果与实际结果的获取及对比.因为前面的文章已经说过接口返回值的获取及对比,所以这篇不说这块了,这篇说一下D ...

随机推荐

  1. ThinkPHP框架表单验证AJAX

    验证有两种方式:静态验证与动态验证. 一.静态验证 在模型类里面预先定义好该模型的自动验证规则,我们称为静态定义. 验证时要在test表的Model里面加验证条件:新建testModel.class. ...

  2. 关于panda中dataframe的与&运算*(stackoverflow高票答案)

    85 down vote favorite 31 What explains the difference in behavior of boolean and bitwise operations ...

  3. Python编程时.py与.pyc文件的介绍

    Python的程序中,是把原始程序代码放在.py文件里,而Python会在执行.py文件的时候.将.py形式的程序编译成中间式文件(byte-compiled)的.pyc文件,这么做的目的就是为了加快 ...

  4. 【6】Django视图函数

    治大国若烹小鲜.以道莅天下 --老子<道德经> 本节内容 Django web项目的运行流程分析 视图处理函数的定义 多视图处理函数及接收参数 1. web项目运行流程分析 通常情况下,完 ...

  5. 对vuex的浅解

    vuex是什么? 官网的解释是 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也 ...

  6. padding填充与box-sizing: border-box配合使用

    不管伸缩盒还是浮动盒子,只要使用到padding,就必须使用 box-sizing: border-box;     有图片的时候,需摇与其他文字对齐的时候,在图片的外层加个:vertical-ali ...

  7. 关于PyQt5,在pycharm上的安装步骤及使用技巧

    前序 之前学习了一款GUI图形界面设计的Tkinter库,但是经大佬的介绍,PyQT5全宇宙最强,一脸的苦笑 毫不犹豫的选择转战PyQT5,在学习之前需要先安装一些必须程序,在一番查阅后,发现PyQt ...

  8. Java基础学习总结(74)——Java常见笔试题及答案汇总

    1. 下面哪些是合法的标识符?(ABE )--标识符 A. $persons B. TwoUsers C. *point D. this E. _endline 2. 下面程序运行的结果是( D )- ...

  9. Wizard's Tour

    F. Wizard's Tour time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  10. 重庆OI2017 小 Q 的棋盘

    小 Q 的棋盘 时间限制: 1 Sec  内存限制: 512 MB 题目描述 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移 ...