通过两个Basler相机标定的相机内外参和畸变系数进行立体校正,获得去畸变后的双目参数。为了验证标定参数的精度,利用去畸变后的双目参数识别棋盘格标定板的角点间距,并计算与基准距离的绝对误差。最后双目相机拍摄光斑,能够得到左右相机下光斑的质心坐标,再利用双目立体视觉测量原理计算出光斑的三维坐标。
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]])
P0,P1,Pl,Pr,rectifyImageL,rectifyImageR = bl.getStereoRectifyImageFromCameraParameters(P,grayImageL,grayImageR)
print('左相机投影矩阵',P0)
print('右相机投影矩阵',P1)
print('校正后的左相机投影矩阵',Pl)
print('校正后的右相机投影矩阵',Pr)
print('校正后的左图像',rectifyImageL)
print('校正后的右图像',rectifyImageR)
功能:由双目相机的内外参和畸变参数对图像进行立体校正,对比原始和校正参数的坐标测量精度。
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)
输出效果
显示左右相机图像去畸变后识别的光斑质心坐标如下图所示。
功能:通过两个BASLER相机拍摄光斑,实时获取光斑的质心坐标和三维坐标。
DEMO:
import numpy as np
import cv2
import BinocularMeas as bl
from pypylon import pylon
import time
# 双目相机的内外参和畸变参数
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]])
# 实时测量光斑的三维坐标
centerlistL,centerlistR,coordinate=bl.getSpotcentroidFromCamera(P)
# 输出光斑的左右质心和三维坐标
print(centerlistL,centerlistR,coordinate)
measure.py
功能:读取txt文件中的双目相机内外参数,首先验证校正后的坐标测量精度,再利用两个Basler相机拍摄图像识别光斑质心,最后求出光斑的三维坐标。
输出:双目标定参数的坐标测量精度和光斑的三维坐标。
双目视觉测量系统标定场景如下图所示:
硬件名称 | 技术参数 |
---|---|
工业相机 | 左相机型号: Basler acA1300-60gm |
右相机型号: Basler acA1300-60gmNIR | |
分辨率:1280px * 1024px | |
像元大小:5.3μm * 5.3μm | |
背光棋盘格标定板 | 方格边长:30mm |
图案阵列:15*11 |
在实验过程中使用棋盘格标定板进行双目相机参数的标定。第一步,调整相机的曝光和焦距,让相机能够清楚的拍摄棋盘格角点;第二步,相机的两个相拍摄标定板,标定板一定要在两个相机的视野内;第三步,改变标定板的姿态,拍摄15到20张图片;第四步,使用MATLAB中的立体标定对双目进行标定。
左相机拍摄的标定板图片如下所示:
右相机拍摄的标定板图片如下所示:
实验环境如下图所示:
双目相机距离灯珠3.5米,通过拍摄单个灯珠,验证光斑左右相机质心坐标和三维坐标的重复性。ul在0.03个像素内波动,vl在0.04个像素内波动,ur在0.035个像素内波动,vr在0.055个像素内波动。光斑三维坐标X在0.022mm以内,Y在0.03mm以内,Z在0.15mm以内波动。重复性实验数据如下表所示:
左相机质心坐标UL(pixel) | 左相机质心坐标VL(pixel) | 右相机质心坐标UR(pixel) | 右相机质心坐标VR(pixel) | 光斑X轴坐标(mm) | 光斑Y轴坐标(mm) | 光斑Z轴坐标(mm) | |
---|---|---|---|---|---|---|---|
最大值 | 212.593 | 475.629 | 1056.501 | 518.816 | 346.74 | 31.901 | -3377.45 |
最小值 | 212.563 | 475.587 | 1056.45 | 518.729 | 346.709 | 31.851 | -3377.74 |
平均值 | 212.5656 | 475.6245 | 1056.469 | 518.7831 | 346.7309 | 31.87104 | -3377.59 |
标准差 | 0.00711 | 0.012657 | 0.015512 | 0.023158 | 0.008203 | 0.014259 | 0.064868 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。