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

首先下载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. 【LeetCode】2、Add Two Numbers

    题目等级:Medium 题目描述:   You are given two non-empty linked lists representing two non-negative integers. ...

  2. kernel-内核抢占

    kernel-内核抢占 这里有两个概念,内核抢占与用户态抢占.什么是内核抢占?就是指程序执行系统调用的时候(也就是执行于内核态的时候)被其他内核线程抢占走了. 有2种情况是不会也不应该被抢占的: 内核 ...

  3. 浅谈 extern "C"

    今天上课实在无聊,就看了看 extern "C" 的作用,看了以后对它有了一点点理解,在这里给大家分享一下(本菜鸡水平有限,如若有说得不对的地方,还望大家指出). extern 关 ...

  4. 回溯法、DFS

    回溯法 为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回上一步重新选择条件,继续向前探索,如此反复进行,直至得到解或证明无解. DFS DFS模板 vo ...

  5. C++ Primer(第4版)-学习笔记-第1部分:基本语言

    第1章  快速入门 每个C++程序都包含一个或多个函数,而且必须有一个命名为main. main函数是唯一被操作系统显式调用的函数,main函数的返回值必须是int或者void(无返回值) 函数体是函 ...

  6. 踪电子表格中的单元格(Spreadsheet Tracking, ACM/ICPC World Finals 1997, UVa512)

    有一个r行c列(1≤r,c≤50)的电子表格,行从上到下编号为1-r,列从左到右编号为1 -c.如图4-2(a)所示,如果先删除第1.5行,然后删除第3, 6, 7, 9列,结果如图4-2(b) 所示 ...

  7. (C/C++学习)6.数组指针和指针数组

    说明:int (*p)[4] 和 int *p[4](数组指针和指针数组),如果你是一个初学者,也许当你看到这两个名词的时候,已经懵了.其实,只要你理解了其中的含义.这两个名词对你来说会相当简单并且很 ...

  8. 1. Python中的基本数据类型、运算、变量

    本文利用的是Python 3.x版本,建议学习3.x版本 Python中的基本数据类型.运算.变量 1. 基本数据类型 1.1 整数 py可以处理任意大小的整数,例如123,1234567891324 ...

  9. nlogn求LIS(树状数组)

    之前一直是用二分 但是因为比较难理解,写的时候也容易忘记怎么写. 今天比赛讲评的时候讲了一种用树状数组求LIS的方法 (1)好理解,自然也好写(但代码量比二分的大) (2)扩展性强.这个解法顺带求出以 ...

  10. F2BPM 开发Api与RESTfull应用服务Api 层次关系及示例

    目前越来越多的企业架构解决方案更加趋向于基于http协议“微服务”访问跨系统调用,而不使用统传的WebService调用,即通过RESTfull方式进行交互,更加轻量整合调用更加方便.本文档中所有F2 ...