九点标定程序

 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;
        }

将需要的点旋转
具体原理如下
九点标定原理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值