线结构光三维重建可以得到法兰盘的三维点云图,进一步的,我们可以对螺纹处的点云数据进行分析,本节主要记录线结构光三维重建的主要步骤及一些问题。
一、光平面方程
1.标定板位置不变,拍摄有激光和无激光两张照片。移动标定板位置,重复拍摄多组。
2.依据标定板无激光图片标定相机内参
3.建立文件夹laser,remaplasr,lasermidline,lasertest
(警示)此处使用了(10,8)标定板,需要更改实验室程序参数
cControl.FindChessPointsDIRAuto(10, 8, 10, imgPath, IS_SMALL_SCREEN, IS_CALIB_SMALL); //Small calib board
此处为(10,8),此前因为(10,8)程序不通,便认为应是(8,10),导致标定结果有错,致使后续重建失败。
不通的原因是实验室同一程序不同个人作过修改
//reSortImageCorners函数中
//对变换后的标定点进行排序
std::vector<Point2d> idx_list;
imgPoints.resize(rowNum*colNum);
std::vector<cv::Point2f>::const_iterator cit = imageCorners.begin();
for (std::vector<cv::Point2f>::const_iterator it = warp_list.begin(); it != warp_list.end(); ++it)
{
cv::Point2f pos = *it;
cv::Point2d idx;
idx.y = int(roundf((pos.y - 2*delta) / delta));
idx.x = int(roundf((pos.x - 0) / delta));
imgPoints[idx.x + idx.y*rowNum] = *cit;
//上应为rowNum,而手中拿到代码此处为colNum*****
++cit;
}
3.依据相机内参、外参和上述拍摄图片得到线结构光光平面方程
String calibFilePath = "D:\\Graduate\\Data\\1119\\cam\\CalibrationResults";//相机标定文件夹
String laserImgPath = "D:\\Graduate\\Data\\1119\\laser\\";//线结构光路径文件夹
String remapLaserImgPath = "D:\\Graduate\\Data\\1119\\remaplaser\\";//校正线结构光路径文件夹
二、相机平移单位向量
1.使用步进电机移动平移台固定距离(非必须1mm)
2.相机拍摄标定板图片
3.重复1、2
排查不能重建的原因时,曾发现calRT_Mat函数中的问题,将矩阵的定义放在了for循环中,导致后续结果不变化。需要注意的是该问题只会影响结果的准确性,不是重建失败的根本原因。
int pic_num =9