线激光扫描重建中的坐标转换问题
1.张氏标定
相机标定的目的:获取摄像机的内参、外参矩阵以及畸变系数。其中内参是指相机的内在参数,从相机坐标系到像素坐标系之间的关系;外参是指相机模型相对于标定板,即相机坐标系相对于世界坐标系的旋转矩阵和平移矩阵;对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。
注意:这里的Zc为缩放因子,也写作s,是为了使得像素坐标能够齐次进行矩阵运算,缩放因子s的值与相机坐标系中的Zc的值相同。
缩放因子的推导:
2.线激光平面的标定
在线激光平面的标定中,选择相机坐标系作为参考坐标系(重建也选用此坐标系),故我们需要将采集到的不同位姿情况下的线激光条纹上像素点都转换到相机坐标系下进行平面拟合。
2.1从像素坐标系到世界坐标系
注意:此时从像素坐标系转换到世界坐标系时,不同的像素点对应的缩放因子都不同(即每个像素点对应Zc都不同),故需要先求出每个像素点的缩放因子,再得到每个点的世界坐标。C++代码如下:
cv::Point3f getWorldPoints_copy(cv::Point2f inPoints, cv::Mat rvec, cv::Mat tvec, cv::Mat cameraMatrix)//获取实际世界坐标(像素坐标,旋转向量,平移向量,内参)
{
//initialize parameter
cv::Mat rotationMatrix;//定义3*3的旋转矩阵
Rodrigues(rvec, rotationMatrix);//将旋转向量转化为旋转为矩阵
double zConst = 0;//世界坐标系z的固定值0
double s;
//获取图像坐标
cv::Mat imagePoint = (cv::Mat_<double>(3, 1) << double(inPoints.x), double(inPoints.y), 1);//将像素二维坐标inpoints进行一个三行一列的赋值imagepoint
//计算比例参数S
cv::Mat tempMat, tempMat2;
tempMat = rotationMatrix.inv() * cameraMatrix.inv() * imagePoint;//等式左边
tempMat2 = rotationMatrix.inv() * tvec;//等式右边
s = zConst + tempMat2.at<double>(2, 0);
s /= tempMat.at<double>(2, 0);//s为缩放因子,都由等式左边和右边的矩阵的第三行相等求得
//计算世界坐标
cv::Mat wcPoint = rotationMatrix.inv() * (s * cameraMatrix.inv() * imagePoint - tvec);//利用像素坐标计算世界坐标
cv::Point3f worldPoint(wcPoint.at<double>(0, 0), wcPoint.at<double>(1, 0), wcPoint.at<double>(2, 0));
//cout << "【输出世界坐标点】" << endl << worldPoint << endl;
return worldPoint;
//计算世界坐标
cv::Mat wcPoint = rotationMatrix.inv() * (s * cameraMatrix.inv() * imagePoint - tvec);//利用像素坐标计算世界坐标
cv::Point3f worldPoint(wcPoint.at<double>(0, 0), wcPoint.at<double>(1, 0), wcPoint.at<double>(2, 0));
//cout << "【输出世界坐标点】" << endl << worldPoint << endl;
return worldPoint;
}
2.2从世界坐标系到相机坐标系
获取得到世界坐标系下的坐标后,因为每个线激光条纹都打在标定板上,可以利用相机外参进行坐标转换得到相机坐标系下的坐标。
或者也可以求出缩放因子s后,直接利用相机内参矩阵的逆进行求取得到相机坐标系下的坐标。
3.重建过程中三维点的求取
重建扫描时,我们需要将重建采集的每一帧的激光条纹上的中心线像素点转换到相机坐标系下,此时需要利用前面获取的线激光平面的参数。
3.1条纹像素点在相机坐标系下的坐标
此时选取一张标定板标定得到的相机内外参,可以通过2中的转换求取得到像素坐标在相机坐标下的坐标,由于张氏标定的定义可以知道,此时得到的相机坐标系下的坐标永远都存在于标定板表面(因为张氏标定定义世界坐标系下坐标点z=0)。此时得到并不是真实的坐标点,只是一种投影点(相当于这个真实三维点此时永远投影存在标定板上)。
为了获取真实的坐标点,需要将光心发出过此点的射线与平面进行联立求解。
3.2相机坐标系下真实三维点的坐标
线激光平面的方程:AX+BY+C*Z+D=0;
射线:(0,0,0)与(Xc,Yc,Zc)两个点构成;
联立射线与平面方程即可求出真实的三维点,即射线穿过激光平面的那个点。
注意:此时求解时,可以不必求出缩放因子,因为无论缩放因子为多少,这个坐标点都在过光心的射线上,只是位置不同而已。
即:
此处就将缩放因子是设置为了单位1,图中包含的内参和平面方程仅为举例。