标定工具库测试

一、计算相机内参:对两个相机进行内参标定,并将标定结果保存到指定的文件中

6e8dc4c6de2ff63b5f918c16dc56a9a8.png

采集图像:相机1-16张  相机2-17张

定义保存相机1/2内参的文件(.yml)路径。
定义相机1/2采集的图片文件夹路径。


定义相机1/2存储文件名的向量


获取文件夹中所有的文件名(存入向量)。


定义需要筛选的文件后缀。
筛选文件名1/2向量中以指定后缀结尾的文件名。


定义相机内参对象1/2。


定义图像尺寸,定义标定板尺寸,定义标定板格子的实际尺寸。


定义标定参数:是否圆点标定板、是否鱼眼相机、是否复杂相机模型。
设置第一个相机的标定参数,计算第一个相机的内参,保存第一个相机的内参。
设置第2个相机的标定参数,计算第2个相机的内参,保存第2个相机的内参。

相机1内参文件

e8b2cf36caf7f081701db7c70b2103ea.png

2. 对立体相机(左右相机)进行标定,并将标定结果保存到指定的文件中

定义立体标定对象
定义左右相机的内参对象
定义保存左右相机内参和立体相机模型的文件路径


定义标定图片文件夹路径


定义存储文件名的向量(左右相机图片文件名向量、所有文件名向量)
获取文件夹中的所有文件名
定义做相机和有相机图片文件名前缀
定义标定参数(是否圆点标定板、是否鱼眼相机、是否复杂相机模型)
从所有文件名向量中筛选出左右相机的图片文件名向量


定义图像尺寸


定义标定板的尺寸
定义标定格子的实际尺寸


为了获取角点信息必须重新标定左/右相机:做相机内参对象-设置重投影误差、设置参数、执行计算、保存参数。


设置立体相机的左右相机
打印左右相机所有参数


计算立体标定
保存立体相机模型

3db1bdb9354b8d71a1f15b1306337241.png

3. 对立体相机拍摄的左右相机图像进行立体矫正,并将矫正后的图像保存到指定的文件夹中

定义保存左右相机内参和立体相机模型的文件路径
定义所有测试图片文件夹和校正后图片保存文件夹路径
创建矫正后图片保存文件夹
定义存储文件名的向量(测试图片文件名向量,所有相机图片向量)
定义左右相机图片文件名前缀


获取所有测试图片文件名向量
获取左右相机图片文件名向量
根据保存的内参路径和立体模型路径初始化立体标定对象
遍历左右相机图片文件名,进行矫正
{ 
  定义校正后的左右相机图像Mat
  定义临时左右相机图像Mat
  读取左右相机图像
  对左右相机图像进行矫正,第五个参数会否剪裁图像
  定义路径解析变量
  解析左相机文件路径,生成矫正后的文件名
  解析有相机文件路径,生成矫正后的文件名
  保存矫正后的左右相机图像
}

6601d23259c3f5ca9fd720d9b8f2e75b.png

4. 进行RGB和ToF相机的标定,并利用标定结果生成彩色点云

所有图像文件名向量(存储红外图像文件名的向量、存储RGB图像文件名的向量、
                  存储点云数据文件名向量、存储深度图像文件名向量)
循环遍历27个文件夹(每个文件夹下包括四个图像)
{
  使用字符串流构建文件夹路径
  构建第i个文件夹路径
  存储第i个文件夹中文件名的向量
  获取第i个文件夹下所有文件名
  
  (是否找到)红外图像标志位、RGB图像标志位、点云数据标志位、深度图像标志位
  
  当前红外图像文件名、当前RGB图像文件名、当前点云数据文件名、当前深度图像文件名
  
  遍历当前文件夹下所有文件
  {
    如果所有类型的图像都已找到,则退出循环
    根据文件名中的特定字符串识别不同类型的图像,并更新标志位和文件名
  }
  如果在当前文件夹中找到了所有类型的图像,则将文件名添加到对应向量中
}
输出各类型图像文件的数量


开始标定
创建一个RGBTOF校准类图像
定义标定参数文件的路径
尝试加载标定参数,如果失败则执行以下操作
{
  定义棋盘格的尺寸
  定义棋盘格每个格子的物理尺寸
  设置棋盘格参数
  定义RGB图像的尺寸
  设置RGB相机的参数
  定义ToF图像的尺寸
  设置ToF相机的参数
  执行相机标定
  计算标定结果
  保存标定参数到文件
}


测试集处理
定义测试集文件夹路径
定义存储文件夹中文件名的向量
获取测试集文件夹中的所有文件名
初始化图像标志位
定义当前处理的文件名变量
遍历测试集文件夹中的所有文件
{
  如果所有类型的图像都已找到,则退出循环
  如果还未找到红外图像
  {
    在当前文件名中查找"_ir.png",如果找到则认为是红外图像
    {
      记录红外图像文件名
      更新红外图像标志位
      跳过当前循环,进入下一次循环
    }
  }
  如果还未找到RGB图像
  {
    在当前文件名中查找"_rgb.jpg",如果找到则认为是RGB图像
    {记录RGB图像文件名,更新RGB图像标志位,跳过当前循环,进入下一次循环} 
  }
  如果还未找到点云数据
  {  
    在当前文件名中查找"_points.pcd",如果找到则认为是点云数据
    {记录点云数据文件名,更新点云数据标志位,跳过当前循环,进入下一次循环}
  }
  如果还未找到深度图像
  {
    在当前文件名中查找"_depth.png",如果找到则认为是深度图像
    {记录深度图像文件名,更新深度图像标志位,跳过当前循环,进入下一次循环}
  }
}
如果在测试集文件夹中找到了所有类型的图像,则将文件名添加到对应的向量中
读取RGB图像和深度图像
定义保存点云的文件名
定义输出的点云对象
使用标定对象和读取的图像生成彩色点云,并保存到文件

这个函数的主要功能是进行RGB和ToF相机的标定,并利用标定结果生成彩色点云。首先,函数遍历指定文件夹中的图像,根据文件名中的标识符筛选出IR图像、RGB图像、点云数据和深度图像的文件名,并将这些文件名分别存储。接着,如果无法加载已有的标定参数文件,则重新进行标定操作,包括设置标定板参数、相机参数,并执行标定计算,最后将标定结果保存到文件中。

在完成标定后,函数使用标定结果对测试集中的RGB图像和深度图像进行处理,生成彩色点云,并将点云数据保存为PCD文件。这一过程涉及到图像处理、文件操作、标定计算和点云生成等多个步骤,是RGB和ToF相机标定及其应用的一个完整示例。

5. 将点云标定到地面

定义点云文件名
实例化线点工具类
设置点云文件
定义变换矩阵
获取点云调整到地面的变换矩阵
输出变换矩阵

6. 测试通过点云计算激光线夹角

定义点云文件名
定义点云对象
读取点云文件
定义点云指针和滤波后点云指针
复制点云数据到指针
定义直通滤波器
设置输入点云
设置过滤字段为y轴
设置过滤范围
过滤点云得到滤波后点云


定义角度变量
计算夹角
输出夹角


修改过滤范围,进行第二次滤波和夹角计算,输出夹角

7. 测试平面点云平面度

定义点云文件名
定义点云对象
读取点云文件
定义异常点百分比
定义最大距离和最小距离变量
计算平面度

作者陈晓永:智能装备专业高级职称,软件工程师,机械设计中级职称,机器人与自动化产线仿真动画制作 

The End

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部