机器视觉-标定篇

2023-09-21 18:52:17

3D结构光标定

结构光视觉的优点:
 

非接触、信息量大、测精度高、抗干扰能力强。

结构光视觉传感器参数的标定包括:摄像机参数标定、结构光平面参数标定

结构光视觉测量原理图

5f424e0be580fb036a9edfe7478b4397.png

我们不考虑镜头的畸变,将相机的成像模型简化为小孔成像模型,则特征点的图像坐标Pf 与其在摄像机坐标系下的三维坐标P 之间的关系可表示为:

80b415087a49251d756255c7f55831db.png

其中:(u,v)是特征点的图像坐标,(u0,v0) 光轴中心的图像坐标,(kx ky )是X 轴,Y 轴方向的放大系数,(xc yc zc) 是特征点在摄像机坐标系下坐标,  Mc 是摄像机内参数矩阵。

结构光视觉投影成像模型:

2cd46c8cb80d7a946f4e850a159c74b4.png

设结构光在摄像头坐标系的平面方程为:

1a04ce755c7faa61f4ce0ed04599ea43.png

依据激光条纹特征点图像坐标就可以得到其在摄像机坐标系下的三维坐标

6f5e13039cb83bfbabf219495cd97250.png

相机参数标定:

采用张正友提出的基于2D平面棋盘格的摄像机标定方法,利用Matlab摄像头标定工具完成相机参数的标定。

摄像机标定工具箱主窗口:

abde47950d362c7979e05a8fd6150be6.png

用于摄像机标定的棋盘格图像:

c50f465918d3b4eab1dd33c353448c94.png

得到摄像机内参数矩阵:

c798eeb07e3e1f1091adbd2a05c658b9.png

结构光平面参数标定:

首先,激光器投射结构光平面到平面棋盘格上形成激光条纹,并通过CCD 摄像机采集激光条纹图像。然后,对图像进行处理,提取激光条纹上的两个特征点。控制机器人按照一定的约束进行运动,从一个标定位置移动到另一个位置,从而产生两条不共线的激光条纹,利用上述相同的图像处理方法再次提取激光条纹上的两个特征点。最后,利用结构光平面上的四个点来确定结构光平面方程参数。该方法可以在摄像机参数标定过程中,同时完成结构光平面方程参数的标定。同时,该方法不需要加工高精度的三维标定靶标,也不需要手工测量,标定过程简单实用。

试验装备:

一个六自由度机器人,一个CCD 工业摄像机,一个激光器和一个平面棋盘格靶标。

结构光平面参数标定系统示意图:

f315347546d4da37de8303118bf74a3b.png

摄像机坐标系位于摄像机中心,而世界坐标系位于平面棋盘格靶标上。一个特征点在摄像机坐标系下坐标与其在世界坐标系下坐标之间的对应关系可以用下式来表达:

204d43555e79720ee525d1475c7a6c30.png

标定过程如下:

(1)图像获取:

图像的获取是在摄机参数标定过程中同时完成。 首先将棋盘格放在工作台上, 在这个初始位置,利用摄像机采集一幅图,如图 (a) 所示 。保持摄像机和棋盘格的位置姿态不变,打开激光器让条纹投射到棋盘格上, 再采集一幅图像如图 (b) 所示:

4ff432d050c26b327583eda62f89ddb8.png

然后改变棋盘格和摄像机的相对位姿,使前后形成的两条激光条纹在空间上不共线,即可确定一个唯一的结构光平面。

bb6fe15ee253686057b41dd900665433.png

(2)图像处理:

图像处理的目的是提取激光条纹上特征点的图像坐标。

分为图像感兴趣区域(ROI)确定、自适应阈值分割、骨架细化和特征点计算。

1)图像ROI确定

通过观察图像看出,激光条纹大致平行于图像的u 轴,而且激光条纹处像素的灰度值高于图像中其它像素的灰度值,所以图像的ROI 可以通过对每行像素灰度值进行求和得到:

92a9c58b91533f4e3f1ed36760f0dbd7.png

2)阈值分割

阈值分割分为全局阈值分割、局部阈值分割和自适应阈值分割。最常用的自适应阈值分割是Otsu方法,该方法使用统计学的方法确定最优的阈值,适用于一般的图像,但是不太适合于棋盘格上激光条纹的分割。

根据图像中激光条纹的灰度值高于图像中其它像素的灰度值以及激光条纹所在区域比较集中的特点,利用图像ROI 内行像素灰度值之和计算激光条纹的自适应阈值:

4b1f20d3a7b757c8cb0aaf7f0a2c66cc.png

3) 骨架细化:

自适应阈值分割以后的激光条纹具有一定的宽度,直接处理计算量巨大而且精度较低,需要对图像进行骨架细化得到单像素的线。

采用下面文献中所提出的快速骨架细化方法:

ed0210ef8f4c0f6847f08c31732bb2c6.png

该方法通过迭代提取图像骨架,每个迭代过程分为两步,第一步去除东南边缘和西北角的点,第二步去除西北边缘和东南角的点。

8b3103fbd4ffba7f675b81733327fc9a.png

Pi分布情况如下:

7fd3ae7877ae3e88412b0f00eb843979.png

第二个迭代过程将上述条件的c、d条件更改为:

9ff0557a35640001995a1e21abc4b31d.png

4)特征提取:

选取激光条纹中心线上的两个点作为激光条纹的特征点,为了提高激光条纹中心线的提取精度,利用最小二乘法拟合方法对细化后的激光条纹直线进行处理。

2a27f392bdff002ac39d3a1612620f68.png

激光条纹特征点提取过程如下:

d1cd0d9c078c0c967ce4957ad614d576.png

标定棋盘格平面内任意一点与法向量关系

37bd5acf1f8fedfa3e88ccb4c6d9d396.png

由上图可知:

0bbb04a9bd79aa051d5de896384ca848.png

由特征点的图像坐标Pf 与其在摄像机坐标系下的三维坐标P 之间的关系知:

2a9933cec2035da344938d6d20a5f6fd.png

得到棋盘格上任意一点在摄像机坐标系下的zc 坐标

d6e6cccce3296b29abe873f893819483.png

得到激光条纹特征点在摄像机坐标系下的坐标值

b61ed3816731973a61456f55da1c1968.png

至此,得到四个激光条纹特征点的图像坐标,由上式得四个激光条纹特征点在摄像机坐标系下的坐标,由于三点确定一个平面方程,使用最小二乘法计算结构光平面方程如下:

0262262240aac5b2cf028abaa67aa572.png

参考文献:基于结构光视觉的焊缝识别与跟踪技术研究[D]. 中国科学院自动化研究所. 中国科学院大学. 2019.

3D视觉精品课程推荐:

1.面向自动驾驶领域的多传感器数据融合技术

2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

9.从零搭建一套结构光3D重建系统[理论+源码+实践]

10.单目深度估计方法:算法梳理与代码实现

更多推荐

Layui快速入门之第十五节 表格

目录一:基本用法1.引入layui的css和js2.定义一个table标签3.定义user.json数据接口二:数据渲染API方法配置渲染模板配置渲染静态表格渲染静态表格转换已知数据渲染三:表格参数基础属性异步属性返回数据中的特定字段表头属性自定义分页四:监听工具栏事件获取选中行设置行选中状态2.8+获取当前页接口数据

docker run:--privileged=true选项解析(特权模式:赋予容器几乎与主机相同的权限)

文章目录Docker的--privileged=true选项1.Docker容器的安全性1.1LinuxNamespace和Capabilities1.2限制和权限2.Docker的--privileged=true选项2.1--privileged=true的作用2.2--privileged=true的风险3.结论

大数据之Hive

Hive入门Hive是FaceBook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据映射为一张表,并提供类SQL查询功能。结构化数据是指没有表名和列名的数据文件,映射为一张表就是给这个数据添加表名和列名,让开发人员后续实现需求时只需使用类似SQL的代码来查询数据。Hive本质是一个Hadoop客户端,将H

第30章_瑞萨MCU零基础入门系列教程之IRDA红外遥控实验

本教程基于韦东山百问网出的DShanMCU-RA6M5开发板进行编写,需要的同学可以在这里获取:https://item.taobao.com/item.htm?id=728461040949配套资料获取:https://renesas-docs.100ask.net瑞萨MCU零基础入门系列教程汇总:https://b

【Hierarchical Coverage Path Planning in Complex 3D Environments】

HierarchicalCoveragePathPlanninginComplex3DEnvironments复杂三维环境下的分层覆盖路径规划视点采样全局TSP算法分两层,一层高级一层低级:高层算法将环境分离多个子空间,如果给定体积中有大量的结构,则空间会进一步细分。全局TSP问题;低层算法采用简单的采样路径规划,解决

Go语言简介:历史背景、发展现状及语言特性

一、简述Go语言背景和发展1.软件开发的新挑战多核硬件架构超大规模分布式计算集群Web模式导致的前所未有的开发规模和更新速度2.Go的三位创始人RobPikeUnix的早期开发者UTF-8创始人KenThompsonUnix的创始人C语言创始人1983年获图灵奖RobertGriesemerGoogleV8JSEngi

【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )

文章目录一、基础数据类型数组内存分析1、malloc分配内存delete释放内存2、new分配内存free释放内存二、类对象内存分析1、malloc分配内存delete释放内存2、new分配内存free释放内存博客总结:C语言中使用malloc分配的内存,使用free进行释放;C++语言中推荐使用new分配的内存,使用

【测试开发】基础篇 · 专业术语 · 软件测试生命周期 · bug的描述 · bug的级别 · bug的生命周期 · 处理争执

【测试开发】基础篇文章目录【测试开发】基础篇1.软件测试生命周期1.1软件生命周期1.2软件测试生命周期2.描述bug3.如何定义bug的级别3.1为什么要对bug进行级别划分3.2bug的一些常见级别4.bug的生命周期5.产生争执这么怎么办(处理人际关系)6.如何开始第一次测试7.测试的执行和bug管理8.如何发现

使用JAXB将xml转成Java对象

文章目录使用JAXB将xml转成Java对象1.xml内容2.Java对象类3.封装的工具类4.测试使用JAXB将xml转成Java对象工作中遇到个问题,需要将xml转对象,之前复杂的xml都是自己用dom4j来解析组装成Java对象,但是对于简单的,看到了JAXB处理的这种方式,就整理下,写成个工具类。1.xml内容

Linux系统编程——线程的学习

学习参考博文:Linux多线程编程初探Linux系统编程学习相关博文Linux系统编程——文件编程的学习Linux系统编程——进程的学习Linux系统编程——进程间通信的学习Linux系统编程——网络编程的学习Linux系统编程——线程的学习一、概述1.进程与线程的区别2.使用线程的理由3.互斥量4.条件变量二、线程A

武汉凯迪正大—继保校验仪的产品特点

一、武汉凯迪正大继保仪的产品特点有哪些?1、经典的WindowsXP操作界面,人机界面友好,操作简便快捷,为了方便用户使用,定义了大量键盘快捷键,使得操作“一键到位”2、高性能的嵌入式工业控制计算机和8.4〞大屏幕高分辨力彩色TFT液晶显示屏,可以提供丰富直观的信息,包括设备当前的工作状态、下一步工作提示及各种帮助信息

热文推荐