需要指出的是是本项目共使用了四个相机,中心一个相机,边缘三个相机,旨在更好得提取螺纹特征并进行分类。因此该节中定位定位销并得到其他螺纹孔位置后,提取的图像是对应边缘相机投射到中心相机平面的图像。
一、棋盘格坐标点提取及对应变换
需要注意此处标定板平面与法兰盘螺纹孔平面在同一平面上,方便后续拼接
//棋盘格坐标点
vector<Point2d> points0;
vector<Point2d> points1;
vector<Point2d> points2;
vector<Point2d> points3;
//读取棋盘格坐标点
ReadPoints("C:\\Users\\sunrise_oneday\\Desktop\\20221107\\Calib\\CalibrationResults\\0_res.txt", points0);
ReadPoints("C:\\Users\\sunrise_oneday\\Desktop\\20221107\\Calib\\CalibrationResults\\1_res.txt", points1);
ReadPoints("C:\\Users\\sunrise_oneday\\Desktop\\20221107\\Calib\\CalibrationResults\\2_res.txt", points2);
ReadPoints("C:\\Users\\sunrise_oneday\\Desktop\\20221107\\Calib\\CalibrationResults\\3_res.txt", points3);
//计算单应性矩阵(1与0,2与0,3与0)
cv::Mat Homography10 = cv::findHomography(
points1,
points0, // 对应的点
cv::RANSAC, // RANSAC 方法
1.); // 到重复投影点的最大距离
cv::Mat Homography20 = cv::findHomography(
points2,
points0, // 对应的点
cv::RANSAC, // RANSAC 方法
1.); // 到重复投影点的最大距离
cv::Mat Homography30 = cv::findHomography(
points3,
points0, // 对应的点
cv::RANSAC, // RANSAC 方法
1.); // 到重复投影点的最大距离
//读取法兰盘图像
Mat image0 = cv::imread("D:\\Graduate\\Data\\0.bmp", 0);
Mat image1 = cv::imread("D:\\Graduate\\Data\\1.bmp", 0);
Mat image2 = cv::imread("D:\\Graduate\\Data\\2.bmp", 0);
Mat image3 = cv::imread("D:\\Graduate\\Data\\3.bmp", 0);
Mat tempImg = imread("D:\\Graduate\\Data\\temp.bmp", 0);
//法兰盘投影到中心相机图像
Mat imageResult1, imageResult2, imageResult3;
cv::warpPerspective(image1, // 输入图像
imageResult1, // 输出图像
Homography10, // 单应矩阵
cv::Size(image1.cols, image1.rows));// 输出图像的尺寸
cv::warpPerspective(image2, // 输入图像
imageResult2, // 输出图像
Homography20, // 单应矩阵
cv::Size(image1.cols, image1.rows));// 输出图像的尺寸
cv::warpPerspective(image3, // 输入图像
imageResult3, // 输出图像
Homography30, // 单应矩阵
cv::Size(image1.cols, image1