array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 #3D视觉#相机标定简介 - 爱码网

目录

1.  相机和投影仪标定原理

2.  相机标定流程

3.  投影仪标定流程

 

 

1.  相机和投影仪标定原理

标定主要是解决从世界坐标系到相机坐标系,再到成像坐标之间的投影矩阵的关系,进而确定相机或投影仪的内参和外参。

涉及四个坐标,如图:

#3D视觉#相机标定简介

世界坐标系也称真实或现实世界坐标系,它是客观世界的绝对坐标。一般的3D场景都用这个坐标系来表示。

摄像机坐标系是以摄像机为中心制定的坐标系统,取摄像机的光轴做为z轴。

成像平面坐标系是指在摄像机内所形成的象平面坐标系统,即图像中的uv坐标系。成像平面与摄像机坐标系统的xy平面平行,这样成像平面原点就在摄像机的光轴(z轴)上。

图像坐标系是指在计算机内部数字图像所用的坐标系,文中即cr坐标系。图像坐标系与成像平面坐标系在同一平面上,图像坐标系包括图像物理坐标系(以毫米等为单位)和图像像素坐标系(以像素为单位)。

 

摄像机标定过程中各坐标系转换流程如下:

#3D视觉#相机标定简介


首先,世界坐标系中的一点,为了将其投影到成像平面上,需要首先将其转换到摄像机坐标系中。从世界坐标系到摄像机坐标系的变换由平移和旋转组成。

#3D视觉#相机标定简介

其中,#3D视觉#相机标定简介是世界坐标系中的点,#3D视觉#相机标定简介是摄像机坐标系中的点,#3D视觉#相机标定简介是一个平移向量,即将世界坐标系的原点平移到摄像机坐标系的原点,#3D视觉#相机标定简介是一个旋转矩阵。R和T的6个参数即为摄像机的外参。

接下来是将三维空间点从摄像机坐标系中投影到成像平面坐标系中,这个投影就是透视投影,公式为:

#3D视觉#相机标定简介

其中f是焦距。

投影到成像平面之后,镜头的畸变会导致(u,v)发生变化,需要进行校正,不过此时不需要三维信息了,畸变参数向量#3D视觉#相机标定简介,前三个是径向,后两个是切向。

最后,将校正后的(u,v)从成像平面转换到图像坐标系中,坐标为(r,c),公式为:

#3D视觉#相机标定简介

其中#3D视觉#相机标定简介是图像主点,sx和sy是指图像传感器水平和垂直方向上相邻像素之间的距离。

所以总结来说,标定内参6个参数#3D视觉#相机标定简介,确定摄像机如何实现三维空间点到二维图像点的映射。标定外参6个参数#3D视觉#相机标定简介,决定了摄像机坐标系与世界坐标系之间的相对位置关系。

 

投影仪标定即将投影仪视为逆向相机,进行标定。重要的是获得单应性矩阵H,但是投影仪本身不具备捕捉图像的能力,需要借助相机建立模型。然后利用已知的点的物理坐标和像素坐标获得单应性矩阵,然后通过单应性矩阵寻找图像上投影点对应的物理坐标,最后利用该物理坐标和标准的棋盘投影图像的像素坐标标定得到摄像机内外参数。

 

2.  相机标定流程

第一步:采集不同位姿下的同一个棋盘格图像,如下所示

#3D视觉#相机标定简介

第二步:利用MATLAB相机标定工具箱进行初标定

安装工具箱之后,在命令框中输入calib,选择standard模式,出现如下界面:

#3D视觉#相机标定简介

然后将MATLAB运行路径设置在图像所在文件夹,依次点击Read images,按照指示读入图像,Extract grid corners,按照指示,对每张图像进行角点提取,注意MATLAB命令框中的提示,一般情况下选择默认的参数设置,即直接enter,往前运行,需要注意的是dX,dY的取值,按照实际棋盘个大小设置,例如本次用的棋盘是12mmx12mm。角点提取之后,点击Calibration,进行标定,得到初始的标定结果,如图。

#3D视觉#相机标定简介

可以看到,error较大,需要进一步优化。

第三步:优化标定结果。此步是MATLAB对比c++标定的优势,能根据误差分布,不断优化结果。

点击Analyse error,可以看到误差分布图,如下:

#3D视觉#相机标定简介

可以看到误差较大,而且分布并不集中。点击图中不集中的点,可以显示是由于哪一张图像引起的误差,例如:

#3D视觉#相机标定简介

接下来,点击Recomp.corners,重新选定窗大小和图像标号,然后点击calibration,可以看到误差不断变小。

#3D视觉#相机标定简介

#3D视觉#相机标定简介

最后变到某一比较满意的误差,分别也比较集中,即可认为标定结束。点击Save,保存标定结果。

本次使用的相机最终标定结果是:

 #3D视觉#相机标定简介

3.  投影仪标定流程

投影仪标定使用的是c++程序。

第一步:采集图像如下:

#3D视觉#相机标定简介

周围的四个点用来求单应性矩阵,中心棋盘为投影所得。

第二步:检测图像中的四个圆圆心的位置,利用已知的物理坐标(以左上角点为圆心,建立坐标系)和检测得到的图像坐标,计算单应性矩阵。

 #3D视觉#相机标定简介

第三步:检测图像中棋盘的角点,根据单应性矩阵,求得物理坐标。

#3D视觉#相机标定简介#3D视觉#相机标定简介

第四步:根据标准的投影棋盘图像像素坐标,和投影变换所得的物理坐标,对投影仪进行标定。

#3D视觉#相机标定简介

生成棋盘所用数据如下图:

#3D视觉#相机标定简介

最终标定结果如下:

(该标定结果没有考虑投影图像的白边,实际上还需要确定白边像素尺寸,在程序中生成标准角点时加上这个像素)

#3D视觉#相机标定简介

 

 

 

 


相关文章: