Python-opencv 手眼标定(九点定位)
本文主要解决相机像素坐标转换机械臂坐标的问题,用到的opencv版本为4.5.5.64
一、手眼定位原理?
以下可以参考
基于OpenCv的机器人手眼标定(九点标定法)
主要思路就是将九点标定图放在机械臂获取范围内,得到九个圆心坐标(像素坐标和机械臂移动到圆心的坐标)
像素坐标的获取可以参考以下文章:
python opencv鼠标点击图像显示坐标值
机械坐标请自行解决
全部代码如下:
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
以上就是今天要讲的内容,共同学习