stereo_calib是OpenCV官方代码中提供的最正统的双目demo,无论数据集还是代码都有很好实现。

一、代码效果:
相关的内容包括28张图片,1个xml和stereo_calib.cpp的代码
直接引入的代码不能给正常运行,我们需要进行一些修改。
报了4个错误,主要是定义和引入问题,都可以解决。
包括定义:
#define  INTER_LINEAR_EXACT 1
以及
主要目的,就是确保输入的参数正确,图片能够被读到。
由于原始代码很贴心地将参数都设置正确了(可以参考下图,长为9、宽为6),所以可以放心实用。
但是,目前代码还是无法完全运行,其原因是因为在以上代码中,调用了.xml,我们看看它是什么样子的:
这是一个序列化的文件,保存的是我们需要处理的图片的位置。这里都是相对地址,而我们的图片要么和当前运行的程序放到一个目录下面;要么修改代码;或者,修改这个配置xml文件,将其全部改成绝对地址。
大概是这个样子,当然你放的位置不一样,这里的xml肯定不一样;或者你认为这种方法比较麻烦,采用其他的方法也没有问题。
确保标定的图片能够正确地读入进去。
成功的话,经过较长时间晕死,就会绘制这样的结果图片。按下键盘任意按键,就会切换下一帧。
如果我们自己有采集的图片,进行替换后可以用在这里。
二、代码解析
在能正确运行的基础上,我们来分析这段代码是如何产生作用的。
1)main函数
main函数是整个程序的入口,一般从这个函数开始分析。
这个例程的main函数非常简单,蓝色框图部分,都是对输入参数进行准备;而在绿色部分,是程序本体。
2)StereoCalib
StereoCalib(const vector<string>& imagelist,
 Size boardSize, 
 float squareSize,
 bool displayCorners = false,
 bool useCalibrated=true,
 bool showRectified=true)
第一个参数是输入的图片序列,我们只要将图片地址输入即可;在前面的设定下,这个参数为:
第二个参数是标定板的尺寸;
至于为什么是9*6,之前已经说明了;
后面4个参数都是和显示相关的,保持不变即可。如果你感兴趣,可以变换看效果,最好先看这些参数的英文名称。
这个函数很长,我们拣重要的来讲:
从这个嵌套循环开始,程序进入主体。由于我们做的是一个左右对比的程序,所以一个二维的循环肯定是必须的。
值得注意的是,这里的二维循环并非先循环左边的图片,对应右边的图片,而是采取了另一种方式。
绿色框图部分,比较输入的图片是否为同样大小。这里不考虑非同样大小的情况。
在这个循环中,最核心也是最消耗时间的就是findchessboardcorners函数,它的目的是分析当前图像,找到棋盘图片的角点。
最后,对于识别效果比较好的情况,全部推入goodImageList中去。对于官方提供的例子,13对图像全部为gooImageList,我们也可以根据这里入选的情况,判断当前采集图像的质量。
这里,OpenCV代码提供了一个很好的技巧,用于处理当前图像由于缩放可能带来的问题:

默认情况下是在原始大小下进行寻找,如果没有找到,则放大一次寻找,一旦找到,直接跳出循环。
根据得到角点结果,计算相机参数矩阵。正如我们知道的一样,是3*3矩阵。
调用stereoCalibrate函数,这个函数参数好多呀。
这段是采用拟合的方法,计算误差。
这里是将标定的结果,序列化地保存下来。
三、如何应用
这个函数很长,却代表了标定的完整过程。在使用的过程中,肯定还是要将其分解成各个函数,而后再单独地进行处理。
标定应该只是一个过程,标定成功后的结果可以反复使用,所以这个操作消耗一些时间应该也是没有问题的。

【双目备课】OpenCV例程_stereo_calib.cpp解析的更多相关文章

  1. OpenCV读写视频文件解析(二)

    OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++:bool VideoCapture::set(int propId, double value) ...

  2. OpenCV读写视频文件解析

    OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在 OpenCV 中,VideoCapture ...

  3. 【双目备课】《学习OpenCV第18章》相机模型与标定整编

    一.相机模型 针孔模型.在这个简单模型中,想象光线是从场景或一个很远的物体发射过来的,但只有一条光线从该场景中的任意特定点进入针孔. 我们将这个图像进行抽象,就能够得到这样的结果: 其中,f为像到针孔 ...

  4. 基于OpenCV进行图像拼接原理解析和编码实现(提纲 代码和具体内容在课件中)

    一.背景 1.1概念定义 我们这里想要实现的图像拼接,既不是如题图1和2这样的"图片艺术拼接",也不是如图3这样的"显示拼接",而是实现类似"BaiD ...

  5. OpenCV例程实现人脸检测

    前段时间看的OpenCV,其实有很多的例子程序,参考代码值得我们学习,对图像特征提取三大法宝:HOG特征,LBP特征,Haar特征有一定了解后. 对本文中的例子程序刚开始没有调通,今晚上调通了,试了试 ...

  6. jso cpp解析读写数据

    json write : { "array" : [ { "aaaaaa" : "bbbbbb", "number" : ...

  7. video.py OpenCv例程阅读

    #!/usr/bin/env python ''' Video capture sample. Sample shows how VideoCapture class can be used to a ...

  8. common.py OpenCv例程阅读

    #!/usr/bin/env python ''' This module contais some common routines used by other samples. ''' import ...

  9. camshift.py OpenCv例程阅读

    源码在这 #!/usr/bin/env python ''' Camshift tracker ================ This is a demo that shows mean-shif ...

随机推荐

  1. HTTP 错误 500.19 - Internal Server Error 无法读取配置节 system.serviceModel 因为它缺少节声明

    服务器环境:Windows Server2008 R2 Enterprise 配置 IIS 的时候报错. 错误信息: HTTP 错误 500.19 - Internal Server Error无法访 ...

  2. 升级 phpstud y中的 mysql 版本

    1.找到你 phpstudy 安装目录,找到 MySQL 文件夹 (我自己的实际目录  D:\pc\phpstudy\MySQL),关掉退出 phpstudy服务,删除 MySQL 文件夹里的文件,如 ...

  3. hibernate05--list和iterator

    package cn.bdqn.test; import java.util.Iterator; import java.util.List; import org.hibernate.Query; ...

  4. 6.1 Pandora 实操 - 数据收集

    添加机器 添加机器命令,在 linux 机器上执行此命令 添加成功 添加收集器 采集机器数据 解析数据 转换数据 发送数据 接着,下一步即,成功创建收集任务. 分发机器 确认收集人物,绑定到机器上. ...

  5. Redis 教程 Java工程师学习知识点

    1. Redis简介及安装 1.1 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下 ...

  6. 3 Oracle 32位客户端安装及arcgis连接

    关于Oracle服务器端安装及配置的过程详见第2篇文章,链接如下:http://www.cnblogs.com/gistrd/p/8494292.html,本篇介绍客户端安装配置及连接arcgis过程 ...

  7. Lucene入门学习二

    接上篇:增删改查 增加:这里不做过多阐述. 删除:删除全部,根据条件删除 修该:先删除,后添加 查询(*):查询所有,精确查询,根据数值范围查询,组合查询,解析查询. package com.ithe ...

  8. python全栈开发 * 进程池,线程理论 ,threading模块 * 180727

    一.进程池 (同步 异步 返回值) 缺点: 开启进程慢 几个CPU就能同时运行几个程序 进程的个数不是无线开启的 应用: 100个任务 进程池 如果必须用多个进程 且是高计算型 没有IO型的程序 希望 ...

  9. python全栈开发 * 12 知识点汇总 * 180530

    12 知识点总结 装饰器进阶 ⼀. 通⽤装饰器的回顾1.开闭原则: 对增加功能开放. 对修改代码封闭2.装饰器的作⽤: 在不改变原有代码的基础上给⼀个函数增加功能3.通⽤装饰器的写法:def wrap ...

  10. Luogu 1071 - 潜伏者 - [字符串]

    题目链接:https://www.luogu.org/problemnew/show/P1071 题解: 模拟就完事儿了. 注意failed的情况有:出现一个 $f[x]$ 对应多个值:存在两个不同的 ...