public Mat vector_to_homMat2d()
{
if (imgx.Count != 9)
{
return null;
}
for (int i = 0; i < calibRobotPixelCoordinates.Length; i++)
{
calibImgPixelCoordinates[i].X = imgx[i];
calibImgPixelCoordinates[i].Y = imgy[i];
calibRobotPixelCoordinates[i].X = rebotx[i];
calibRobotPixelCoordinates[i].Y = reboty[i];
}
if (calibImgPixelCoordinates.Length != 9 && calibRobotPixelCoordinates.Length != 9)
{
return null;
}
Mat mat = new Mat(9, 2, 6);
mat.Set(0, 0, calibImgPixelCoordinates[0].X);
mat.Set(0, 1, calibImgPixelCoordinates[0].Y);
mat.Set(1, 0, calibImgPixelCoordinates[1].X);
mat.Set(1, 1, calibImgPixelCoordinates[1].Y);
mat.Set(2, 0, calibImgPixelCoordinates[2].X);
mat.Set(2, 1, calibImgPixelCoordinates[2].Y);
mat.Set(3, 0, calibImgPixelCoordinates[3].X);
mat.Set(3, 1, calibImgPixelCoordinates[3].Y);
mat.Set(4, 0, calibImgPixelCoordinates[4].X);
mat.Set(4, 1, calibImgPixelCoordinates[4].Y);
mat.Set(5, 0, calibImgPixelCoordinates[5].X);
mat.Set(5, 1, calibImgPixelCoordinates[5].Y);
mat.Set(6, 0, calibImgPixelCoordinates[6].X);
mat.Set(6, 1, calibImgPixelCoordinates[6].Y);
mat.Set(7, 0, calibImgPixelCoordinates[7].X);
mat.Set(7, 1, calibImgPixelCoordinates[7].Y);
mat.Set(8, 0, calibImgPixelCoordinates[8].X);
mat.Set(8, 1, calibImgPixelCoordinates[8].Y);
Mat mat2 = new Mat(9, 2, 6);
mat2.Set(0, 0, calibRobotPixelCoordinates[0].X);
mat2.Set(0, 1, calibRobotPixelCoordinates[0].Y);
mat2.Set(1, 0, calibRobotPixelCoordinates[1].X);
mat2.Set(1, 1, calibRobotPixelCoordinates[1].Y);
mat2.Set(2, 0, calibRobotPixelCoordinates[2].X);
mat2.Set(2, 1, calibRobotPixelCoordinates[2].Y);
mat2.Set(3, 0, calibRobotPixelCoordinates[3].X);
mat2.Set(3, 1, calibRobotPixelCoordinates[3].Y);
mat2.Set(4, 0, calibRobotPixelCoordinates[4].X);
mat2.Set(4, 1, calibRobotPixelCoordinates[4].Y);
mat2.Set(5, 0, calibRobotPixelCoordinates[5].X);
mat2.Set(5, 1, calibRobotPixelCoordinates[5].Y);
mat2.Set(6, 0, calibRobotPixelCoordinates[6].X);
mat2.Set(6, 1, calibRobotPixelCoordinates[6].Y);
mat2.Set(7, 0, calibRobotPixelCoordinates[7].X);
mat2.Set(7, 1, calibRobotPixelCoordinates[7].Y);
mat2.Set(8, 0, calibRobotPixelCoordinates[8].X);
mat2.Set(8, 1, calibRobotPixelCoordinates[8].Y);
return Cv2.EstimateAffine2D(mat, mat2, null, RobustEstimationAlgorithms.RANSAC, 3.0, 2000uL, 0.99, 10uL);
}
第一个是相机的坐标,后面是机器人的坐标,得到转换矩阵
public Point2d affine_trans_point2d(Point2d image_coordinates)
{
Mat mat;
if ((mat = vector_to_homMat2d()) == null)
{
return new Point2d(-1.0, -1.0);
}
double num = mat.Get<double>(0, 0);
double num2 = mat.Get<double>(0, 1);
double num3 = mat.Get<double>(0, 2);
double num4 = mat.Get<double>(1, 0);
double num5 = mat.Get<double>(1, 1);
double num6 = mat.Get<double>(1, 2);
Point2d result = default(Point2d);
result.X = num * image_coordinates.X + num2 * image_coordinates.Y + num3;
result.Y = num4 * image_coordinates.X + num5 * image_coordinates.Y + num6;
return result;
}
将需要的点旋转
具体原理如下
九点标定原理