同步操作将从 赵世艺/Binocular Measurement 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
本双目坐标测量仿真基于SoildWorks 2014进行模型绘制,基于Python语言验证仿真模型结果。
在仿真模型中,双目相机之间的基距设为800mm,每个相机的镜头焦距设置为100mm,待测点距离在20m左右。
图1:双目仿真模型局部图 图2:双目仿真模型整体图 已知相机成像面的像元大小为$0.0053mm \times 0.0053mm$,在仿真模型中,两相机的内参数矩阵均代入相机参数的理想数值:
mtx_l = np.array([[100 / 0.0053, 0, 640, 0],
[0, 100 / 0.0053, 512, 0],
[0, 0, 1, 0]])
mtx_r = np.array([[100 / 0.0053, 0, 640, 0],
[0, 100 / 0.0053, 512, 0],
[0, 0, 1, 0]])
待测点的像素坐标可以使用像素坐标系下测量的坐标和成像面长宽的比值来获得。
lp = np.array([1.38201300/0.0053, 2.71360000/0.0053])
rp = np.array([5.40198700/0.0053, 2.71360000/0.0053])
使用双目测量系统中的相机参数和待测点的像素坐标,结合OpenCV库中的三角测量函数进行计算空间待测点的三维坐标。
P = np.array(cv2.triangulatePoints(Pl, Pr, lp, rp))
代码中的一些参数可根据具体情况进行改变,例如相机焦距和像元大小影响了相机内参的$f_x$和$f_y$,$u_0$和$v_0$可根据图像分辨率进行修改,即: $$ f_x=\frac{f}{像元宽度}\\ f_y=\frac{f}{像元长度}\\ u_0=\frac{图像长度}{2}\\ v_0=\frac{图像宽度}{2} $$ 相应地,当相机传感器像元大小发生变化时,在仿真模型中的空间待测点被两个相机采集到的质心坐标$l_p$和$r_p$也需要进行修改。
本项目使用的相机均为巴斯勒工业相机,左右相机型号分别为acA1300-60gmNIR和acA1300-60gm。双目相机的实时测量基于Basler pylon软件开发库实现的,需要在python环境中安装pypylon库并引入pylon模块。
pip install pypylon
from pypylon import pylon
进行双目系统实时测量之前,需要导入两个相机的参数信息,在本部分中给出了一个参数文件:Parameters.txt。本文件中共有30行,下面说一下本文件的组成部分和编写规则。
1-8行表示左右相机的内参数据,1-4行为左相机内参,5-8行为右相机的内参数据,参数均为排列顺序为$f_x$、$u_0$、$f_y$和$v_0$。
9-17行表示左右相机的旋转矩阵$R$,排列顺序为$r_{11},r_{12},r_{13} \dots r_{32}, r_{33}$。
18-20行为左右相机的平移矩阵$T$,排列顺序为$t_{11},t_{21},t_{31}$。
21-30行表示左右相机的畸变系数,先填写左相机再填写右相机,排列顺序为$k_1,k_2,p_1,p_2,k_3$。
实现双目实时测量主要涉及到两个py文件:suanfa.py和realtime.py。
suanfa.py中列出了实现双目测量三维坐标的用到的各种函数,包括双目视觉系统立体矫正、巴斯勒相机图像采集和待测点质心计算等。在realtime.py中需要调用suanfa.py中的函数,即:
import suanfa as sl
realtime.py用于输入相机标定文件并调用suanfa.py中的函数,输出每帧图像中光斑的三维坐标,每帧的光斑识别情况以视频的形式输出显示。文件夹中的example.avi为实时运算结束后保存的视频文件样例。
图4:实时测量 此外,我们在该文件夹下也给出了单次三维坐标测量的函数文件BinocularMeas.py和执行文件SinglePoint.py。使用该程序时需要连接巴斯勒工业相机并可实现空间三维坐标的单次测量。
图5:单点测量 文件夹中的measure.py可以直接导入待测点的图像,我们对同一光斑进行连续两次拍摄,拍摄结果分别为L1.bmp和R1.bmp、L2.bmp和R2.bmp。利用OpenCV读取图像,并结合BinocularMeas.py中的函数可计算出每个光斑的三维坐标,同时程序中对光斑之间的距离也进行了计算。SinglePoint.py与measure.py均调用了BinocularMeas.py的函数,即:
import BinocularMeas as bl
在运行程序之前,您需要按照前面提到的配置文件将相机标定文件编辑好并导入每个测量程序中(realtime.py、SinglePoint.py和measure.py)。
本项目给出了基于巴斯勒工业相机的双目立体实时测量程序,连接上两个巴斯勒相机后通过pylon Viewer调整相机曝光,曝光合适后可直接运行realtime.py实时获取待测点的三维坐标。
本项目给出了基于巴斯勒工业相机的空间点单次测量程序,连接上两个巴斯勒相机后,运行SinglePoint.py即可实现光斑采集,质心计算和空间点测量等功能。
如果您使用的相机不是巴斯勒相机,您可以先采集光斑图像后导入measure.py来直接计算光斑的三维坐标。
通过对测量模型进行分析,双目测量系统的误差源主要包括以下几个:左右相机内参标定误差($f_x$、$f_y$、$u_0$、$v_0$)、两相机之间的外参误差(旋转矩阵$R_l^r$和平移矩阵$T_l^r$)以及左右相机分别采集到的光斑质心坐标误差。
程序中对上述各误差源进行范围定义,根据实验和分析,各误差源范围定义如下:
(1) 左右相机标定误差$f_x$、$f_y$的范围为$(-1px,1px)$,$u_0$、$v_0$的误差范围为$(-0.5px,0.5px)$;
(2) 两相机之间的旋转矩阵误差,可转化为姿态角,其中三个姿态角的范围均为$(-0.01°,0.01°)$;
(3) 左右相机提取光斑质心的误差范围$u_0(-0.1px,0.1px)$、$v_0(-0.1px,0.1px)$。
将上述产生的误差源数值加入模型中并计算1000次,绘制导入各误差后的测量结果折线图。
图6:不同误差源作用下解算结果 在误差分析中需要注意的是,程序中的双目立体测量模型应与仿真模型使用的数据一致,即焦距、图像分辨率等信息应与仿真中的信息一致。您可以在程序中重新定义误差源的范围,也可以设置解算次数来生成新的误差计算折线图。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。