一:分步说明:
摄像头的标定(Small Camera Calibration)
1: 准备标定图片
标定图片需要使用标定板在不同位置,不同角度,不同姿态下拍摄,最少需要3张,以10—20张最好。标定板需要是黑白相间的矩形构成的棋盘格图,制作精度要求要高。标定采用的是22*22大小1mm/格误差在1um内的棋盘格。
2 :对每一张图片提取角点信息
需要使用findChessboardConers函数提取角点,这里的角点专指的是标定板上的内角点,这些角点与标定板上的边缘不接触。我们用的棋盘格的角点个数为21*21.其实这里最好用长和宽上角点数量不一致的棋盘格标定,因为这样可以容易分辨出棋盘格不同的角度。
3 :对每一张标定的图片进一步提取亚像素角点信息
为了提高标定精度,需要在初步提取的角点信息上进一步提取亚像素信息,降低相机的标定偏差,常用的方法是cornerSubPix,另一个方法是使用find4QuadCornerSubpix函数,这个方法是专门获取棋盘图像上内角点的精确位置的,或许在相机标定的这个特殊场合下它的检测精度会比cornerSubPix更高。
4 : 在棋盘上绘制找到的内角点
drawChessboardCorners函数用于绘制被成功标定的角点。
5 :相机的标定
获取到棋盘标定图的内角点图像的坐标后,可以使用calibrateCamera函数进行标定,计算相机的内参和外参系数。
二,参数的计算(CountAngel)
整个二维激光位移传感器需要计算的参数有两个。第一个为基准面与激光透镜的距离A.第二个为激光束光轴与接收透镜之间的夹角θ。
1: 输入三张样本图片
图片需要选择三张激光线中心位置同时大于320或者同时小于320的图片,在这里大于320和小于320计算的不同之处在于算法不同。看实际取得的样本情况而定。在这里注意的是,在选取不同样本的时候,有两个参数DetaH(第二条线与第一条线的实际距离)和DetaM(第三条线与第一条线的实际距离)随着样本的选取改变而改变。
2:矫正输入图片
voidCorrectedImage(Mat& inputImage, Mat& outputImage);
在这里需要注意的是矫正输入图片需要把第一步标定摄像头中求出的内外参数矩阵的xml文件导入到参数计算的文件夹下。
3:计算每幅图像激光中心线坐标
void drawCaughtWeight(Mat& inputImage);
4:开始计算角度(弧度制)
//-------------开始计算角度(弧度制)--------------
for (int i = 0; i < 480;i++)
{
CalcuResult.push_back(CountAngle(TPoint[0][i].y,TPoint[1][i].y, TPoint[2][i].y));
Xone.push_back(TPoint[0][i].y);
Xthree.push_back(TPoint[2][i].y);
}
ResultA = Point3f(OutPutResult(CalcuResult));
ResultXONE = Point3f(OutPutResult(Xone));
ResultXTHREE = Point3f(OutPutResult(Xthree));
double X1 = abs(ResultXONE.z-MidPoint)*Pixel;
double X3 = abs(ResultXTHREE.z - MidPoint)*Pixel;
//----------------------靠近透镜---------------------------
double ADistance = (F*DetaM*sin(ResultA.z) +X1*DetaM*cos(ResultA.z))*(F*sin(ResultA.z)
+ X3*cos(ResultA.z)) / ((X3- X1)*F*sin(ResultA.z));
//----------------------远离透镜---------------------------
/*double ADistance = (F*DetaM*sin(ResultA.z) -X1*DetaM*cos(ResultA.z))*(F*sin(ResultA.z)
- X3*cos(ResultA.z)) / ((X3- X1)*F*sin(ResultA.z));*/
三,整体样计算误差(AddError+Close和AddError+faraway)
1:样本选取
以30mm的二维线扫激光为例,样本的选取是以每隔0.1mm采样。那么在程序中标定的话,第一步就是把标定的样本存在该文件夹里,并且把每张图片的名字依次每列保存在ImageData.txt文件里。
导入基准图片,然后矫正和计算激光线的的中心位置,函数和计算参数中用到的一致。将计算出来的参数加到程序中。
2:计算位移
开始计算每张图片的位移,每次有480个结果。计算结果之后,通过函数Point3fOutPutResult(vector
3:输出位移结果
CountRes.txt文件是输出(最大,最小,平均值);
DataA.txt输出的是中心线坐标大于320的样本的(像素,误差);
DataB.txt输出的是中心线坐标小于320的样本的(像素,误差);
DataC.txt输出的是加上补偿算法之后样本的(像素,误差);
四:补偿函数的拟合(Polynomial fitting)
补偿函数拟合只需要将中心线坐标大于320样本的DataA.txt和中心线坐标小于320样本的DataB.txt存入到工程文件目录下,就会计算出补偿函数,该函数的一元三次方程,该方程的系数保存在CoefficientMatrix.txt里。
五:整体位移的计算(AddErrorComplete)
在进行计算的开始时,需要将中心线大于320的样本拟合出来的补偿函数的CoefficientMatrix.txt文件保存到工程里,并改名为CoefficientMatrixClose.txt,同理中心线小于320的样本拟合出来的补偿函数的CoefficientMatrix.txt文件保存在工程里,改名为CoefficientMatrixFarAway.txt。之后选取计算的样本,结果保存在CountRes.txt里。