3D激光扫描三维重建——5.(matlab)系统框架

  • 初始化视频输入

    • 创建视频输入(videoinput())
    • 设置视频录制的帧数
      • (1)需要一度一帧的频率,180度需要180帧
      • (2)系统刚开始初始化时,扫描平台由静止开始运动会有抖动,并且视频录制开始时间与舵机旋转时间会存在一定偏差,因此丢弃视频的前几帧,所以在有效的180帧之前多录5帧,大概167ms(1s/30度30帧)
    • 设置手动曝光调整视频输入的帧率
      • 首先曝光度是相机感光元件被照射的程度,对于自动曝光模式,相机的感光组件要收集到一定阈值程度的光线才可拍出一帧图像。由于本系统的实验环境光线较弱,导致帧率降低和不稳定,所以要通过手动调整曝光补偿量(设置为-6),以达到系统每秒30帧的要求
    • 初始化并打开与arduino通信的串口
    • 录制视频
      • (1)matlab向串口发送一个“1”,arduino收到该数据后,开始控制舵机旋转
      • (2)设置视频录制时间 = 总帧数 * 帧率
      • (3)录制结束后,根据首尾帧的时间戳,计算实际录制帧率,即拍摄一帧需要的时间,然后计算帧率误差百分比(帧率误差值/相机帧率)
  • 初始化三角测距参数

    • 基线长度:22.54cm
    • 激光器与旋转中心的距离:10.5cm
    • 激光器与基线的夹角弧度制:1.461度
    • 激光器与基线的夹角:82度
    • 单位像素大小:2.2um(该值根据相机coms器件决定的,固定值)
    • 计算实际焦距:标定得到的相机焦距 * 单位像素大小
      • 补充:(1)标定得到的焦距是以pixel size为单位
      • (2)焦距:成像平面到镜片中心的实际距离
    • 计算像素平面任意一个y位置所对应的焦距(任意y位置与基线所成的面的夹角 = arctan(任意y位置与y的中心位置的距离 / y的中心位置的焦距),像素平面任意一个y位置所对应的焦距 = y的中心位置的焦距 / cos(任意y位置与基线所成的面的夹角))
  • 三角测距:处理视频的每一帧,对应每转一度,获得每一帧的图像

    • 提取光条像素中心:图像转换为灰度图——使用最大类间方差法找到图片的一个合适的阈值(graythresh())——利用这个阈值把一张灰度图像转换为二值图像(im2bw())——在二值图像中获取每一行中像素值为1的点,并求每一行的光条中心位置(mean()平均值),对于整个平面,我们只需要保存(320,640)之间的光条中心位置,因为相机与激光器存在夹角,决定了激光光条在相机成像平面的位置只可能是在(320,640)之间。
    • 提取光条次像素中心:取代以上两个过程:图像转换为灰度图——在灰度图中的每一行中,每一个像素位置的坐标 * 该位置的灰度值 / 该行每一个像素位置的灰度值总和。
    • 距离计算
      • x = 光条中心位置到成像平面中心的位置 + 实际焦距 / tan(激光与基线的夹角);
      • 物体距离基线的垂直距离q = 该位置对应的焦距 * 基线长度 / x
    • 距离坐标转换
      • 以旋转中心为原点,y轴是物体点与基线的垂线方向,z轴是垂直方向,x轴是基线方向。计算物体的三维坐标。
        • y = q * cos(成像平面与基准面的夹角)
        • z = q * sin(成像平面与基准面的夹角)
        • x = 激光器到 x 坐标点的距离 - 激光器到旋转中心的距离 = y / tan(激光器与基线的夹角) - 激光器到旋转中心的距离
      • 当旋转后,坐标中心原点不变,但x、y轴发生了相对旋转,因此要将所有的坐标系下的3D坐标转换到同一个坐标系下:以旋转中心为原点,以旋转到90度时的坐标系为固定坐标系。以下是坐标变换过程及公式:
        • 3D激光扫描三维重建——5.(matlab)系统框架_第1张图片

你可能感兴趣的:(3d激光重建)