赞
踩
Python-opencv 手眼标定(九点定位)
本文主要解决相机像素坐标转换机械臂坐标的问题,用到的opencv版本为4.5.5.64
一、手眼定位原理?
以下可以参考
主要思路就是将九点标定图放在机械臂获取范围内,得到九个圆心坐标(像素坐标和机械臂移动到圆心的坐标)
像素坐标的获取可以参考以下文章:
机械坐标请自行解决
全部代码如下:
- import numpy as np
- import cv2
-
- # 通过九点标定获取的圆心相机坐标
- STC_points_camera = np.array([
- [207, 160],
- [311, 159],
- [415, 159],
- [206, 256],
- [311, 257],
- [416, 258],
- [205, 353],
- [311, 356],
- [416, 357],
- ])
- # 通过九点标定获取的圆心机械臂坐标
- STC_points_robot = np.array([
- [54, -74],
- [-4, -76],
- [-54, -77],
- [52, -32],
- [-4, -34],
- [-55, -35],
- [50, 11],
- [-4, 10],
- [-54, 8],
- ])
-
-
- # 手眼标定方法
- class HandInEyeCalibration:
-
- def get_m(self, points_camera, points_robot):
- """
- 取得相机坐标转换到机器坐标的仿射矩阵
- :param points_camera:
- :param points_robot:
- :return:
- """
- # 确保两个点集的数量级不要差距过大,否则会输出None
- m, _ = cv2.estimateAffine2D(points_camera, points_robot)
- return m
-
- def get_points_robot(self, x_camera, y_camera):
- """
- 相机坐标通过仿射矩阵变换取得机器坐标
- :param x_camera:
- :param y_camera:
- :return:
- """
- m = self.get_m(STC_points_camera, STC_points_robot)
- robot_x = (m[0][0] * x_camera) + (m[0][1] * y_camera) + m[0][2]
- robot_y = (m[1][0] * x_camera) + (m[1][1] * y_camera) + m[1][2]
- return robot_x, robot_y
主要用到了opencv的estimateAffine2D函数,获得仿射变换矩阵
之后就可以用指定的像素坐标进行转换了,计算公式如下:
robot_x = (A * x_camera) + (B * y_camera) + C robot_y = (D * x_camera) + (E * y_camera) + F
以上就是今天要讲的内容,共同学习
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。