目录
一、相高模型建立
相高模型建立公式主要依据为:AX=B
1.设定一个拍摄基准面(使用平面度较高的板子),记作0,按照一个规定步长移动基准面,移动n次,例如:移动十次,每次移动1mm,那么移动的高度就为:1mm、2、3、4、5、6、7、8、9、10,这就是上面公式的高度矩阵(B)
Eigen::Matrix<float, 1, 10>heighMatrixs;
heighMatrixs<< 1、2、3、4、5、6、7、8、9、10;
2.对拍摄的十一张标定板(移动了十次+基准面)解相位,然后对十次解得的相位减去基准面的相位,得到了十张相位差图片,这就是上面的相位差矩阵(A)(注:是对公式进行展开后的矩阵)
Eigen::MatrixXf diffMatrix(m, n_oder);
for (int i = 0; i < rows*cols; i++) {
float fai = LPHASEDIFF[].ptr<float>(i % prows)[i / prows];
diffMatrix.row() << 1.0, fai, pow( fai, 2), pow(fai, 3);
}
3.利用opencv的eigen库(速度较快)求解标定的系数矩阵(X),我这里使用的三阶展开,所以每一个像素点会有四个标定系数(a0、a1、a2、a3),可以将每个系数都单独保存一张tif格式的图片以便于三维重建使用,如果有更好的办法教教孩子。
for (int a = 0; a < rows * cols; a++) {
Eigen::MatrixXf coeffmatrix =
diffMATRIXS[a].colPivHouseholderQr().solve(heighMatrixs.transpose());
}
二、三维重建
1.得到相高模型的标定参数后,对拍摄的样片也进行解相位,得到相位图片,将相位减去基准面相位得到相位差图片,这就是我们的相位差矩阵(A)
2.逐像素点带入标定系数(X)
3.逐像素点计算高度(B),这样就得到了一张深度图,将深度图转为点云,完成了三维重建(注:生成的点云会存在各种各样的杂点、孔洞等问题,还需要进一步的滤波等处理)
(图为我简单的进行了一个上下滤波后的结果)