需要指出的是是本项目共使用了四个相机,中心一个相机,边缘三个相机,旨在更好得提取螺纹特征并进行分类。因此该节中定位定位销并得到其他螺纹孔位置后,提取的图像是对应边缘相机投射到中心相机平面的图像。

一、棋盘格坐标点提取及对应变换
需要注意此处标定板平面与法兰盘螺纹孔平面在同一平面上,方便后续拼接

//棋盘格坐标点
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

本文介绍了一个使用四个相机,通过棋盘格坐标点提取、模板匹配和图像拼接来确定法兰盘螺纹孔位置的项目。首先,进行标定板平面与法兰盘平面的同平面标定,然后利用模板匹配技术,最后通过拼接图片来完成螺纹孔的位置确定。
最低0.47元/天 解锁文章
1831

被折叠的 条评论
为什么被折叠?



