利用双相机对统一被测目标进行拍摄,基于左右相机内外参数,计算被测目标的空间三维坐标,如下图所示:
双目相机在使用前需要对内/外参数进行精确标定,可参考标定文档。
在通过标定获取到内外参数后,可利用双目相继对单一目标进行空间三维坐标的精确测量。以实现单个红外LED发光点的空间三维坐标为例,运行命令:
python3 calXYZ.py
得到如下结果
BinocularMeas.py
功能:通过双目相机的内外参数和畸变系数进行立体校正,获得去畸变后的双目参数。
DEMO:
import numpy as np
import cv2
import BinocularMeas as bl
'''
左相机内参flx,ul0,fly,ul0;
右相机内参frx,ur0,fry,ur0;
右相机到左相机的旋转矩阵:[r1,r2,r3,r4,r5,r6,r7,r8,r9];
右相机到左相机的平移矩阵:[T1,T2,T3];
左相机的畸变系数kl1,kl2,pl1,pl2,kl3;
右相机的畸变系数kr1,kr2,pr1,pr2,kr3.
P=([[flx,ul0,fly,ul0,
frx,ur0,fry,ur0,
r1,r2,r3,
r4,r5,r6,
r7,r8,r9,
T1,T2,T3,
kl1,kl2,pl1,pl2,kl3,
kr1,kr2,pr1,pr2,kr3]])
'''
# 双目相机的内外参和畸变参数
P= ( [[1.58194505e+03,6.11360774e+02,1.58103367e+03,4.81957409e+02,
1.58550432e+03, 6.60125535e+02,1.58560729e+03 ,5.30058387e+02,
0.99935972,0.00832822,-0.03479633,
-0.00818233,0.99995714,0.00433311,
0.03483093,-0.00404562,0.99938503,
-1.45455737e+02,-1.00152336e-01,3.81513984e+00,
-0.10048731,0.15942811,0.00067713,-0.00077331,0.02106416,
-0.10669631,0.27109715,0.00093811,-0.00115607,-0.21457691]])
# 图片分辨率
imageSize=(1280,1024)
P0,P1,Pl,Pr,mapLx,mapLy,mapRx,mapRy = bl.getStereoRectifyImageFromCameraParameters(P, imageSize)
print('左相机投影矩阵',P0)
print('右相机投影矩阵',P1)
print('校正后的左相机投影矩阵',Pl)
print('校正后的右相机投影矩阵',Pr)
print('左相机(x,y)映射',mapLx,mapLy)
print('右相机(x,y)映射',mapRx,mapRy)
功能:由双目相机的内外参和畸变参数对图像进行立体校正,对比原始和校正参数的坐标测量精度。
DEMO:
import numpy as np
import cv2
from PIL import Image
import matplotlib.pyplot as plt
import BinocularMeas as bl
# 双目相机的内外参和畸变参数
P= ( [[1.58194505e+03,6.11360774e+02,1.58103367e+03,4.81957409e+02,
1.58550432e+03, 6.60125535e+02,1.58560729e+03 ,5.30058387e+02,
0.99935972,0.00832822,-0.03479633,
-0.00818233,0.99995714,0.00433311,
0.03483093,-0.00404562,0.99938503,
-1.45455737e+02,-1.00152336e-01,3.81513984e+00,
-0.10048731,0.15942811,0.00067713,-0.00077331,0.02106416,
-0.10669631,0.27109715,0.00093811,-0.00115607,-0.21457691]])
# 读取图片
grayImageL = cv2.imread("L2.bmp", 0)
grayImageR = cv2.imread("R2.bmp", 0)
error=bl.calCalibrationAccuracyFromCameraParameters(P,grayImageL,grayImageR)
print('测量棋盘格相邻角点间距和基准距离的绝对误差',error)
输出效果
校正前的标定板图片:
校正后的标定板图像:
通过双目标定的内外参计算出棋盘格角点的三维坐标,将校正前后识别的棋盘格相邻角点间距和基准距离的绝对误差作为相机标定精度的评定标准。校正前和校正后的坐标测量精度分别在1.1mm和0.15mm以内。
功能:通过双目拍摄得到校正后光斑图像,再由左右相机的质心坐标计算出光斑三维坐标。
DEMO:
import numpy as np
import cv2
import BinocularMeas as bl
# 双目相机的内外参和畸变参数
P= ( [[1.58194505e+03,6.11360774e+02,1.58103367e+03,4.81957409e+02,
1.58550432e+03, 6.60125535e+02,1.58560729e+03 ,5.30058387e+02,
0.99935972,0.00832822,-0.03479633,
-0.00818233,0.99995714,0.00433311,
0.03483093,-0.00404562,0.99938503,
-1.45455737e+02,-1.00152336e-01,3.81513984e+00,
-0.10048731,0.15942811,0.00067713,-0.00077331,0.02106416,
-0.10669631,0.27109715,0.00093811,-0.00115607,-0.21457691]])
# 读取图片
imgL = cv2.imread("L1.bmp", 0)
imgR = cv2.imread("R1.bmp", 0)
w=np.array(bl.calCoordinateFromSpotcentroid(P,imgL,imgR))
print('光斑的三维坐标',w)
输出效果
显示左右相机图像去畸变后识别的光斑质心坐标如下图所示。
measure.py
功能:读取txt文件中的双目相机内外参数,首先验证校正后的坐标测量精度,再利用两个Basler相机拍摄图像识别光斑质心,最后求出光斑的三维坐标。
输出:双目标定参数的坐标测量精度和光斑的三维坐标。
双目视觉测量系统标定场景如下图所示:
硬件名称 | 技术参数 |
---|---|
工业相机 | 左相机型号: Basler acA1300-60gm |
右相机型号: Basler acA1300-60gmNIR | |
分辨率:1280px * 1024px | |
像元大小:5.3μm * 5.3μm | |
背光棋盘格标定板 | 方格边长:30mm |
图案阵列:15*11 |
在实验过程中使用棋盘格标定板进行双目相机参数的标定。第一步,调整相机的曝光和焦距,让相机能够清楚的拍摄棋盘格角点;第二步,相机的两个相拍摄标定板,标定板一定要在两个相机的视野内;第三步,改变标定板的姿态,拍摄15到20张图片;第四步,使用MATLAB中的立体标定对双目进行标定。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。