Python-opencv 手眼标定(九点定位)

 Python-opencv 手眼标定(九点定位)

前言

本文主要解决相机像素坐标转换机械臂坐标的问题,用到的opencv版本为4.5.5.64


一、手眼定位原理?

以下可以参考

基于OpenCv的机器人手眼标定(九点标定法)

二、怎么实现

1.获得像素坐标和机械坐标集

主要思路就是将九点标定图放在机械臂获取范围内,得到九个圆心坐标(像素坐标和机械臂移动到圆心的坐标)

像素坐标的获取可以参考以下文章:

python opencv鼠标点击图像显示坐标值

机械坐标请自行解决  

2.取得坐标系转换的仿射矩阵

全部代码如下:

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

总结

以上就是今天要讲的内容,共同学习

物联沃分享整理
物联沃-IOTWORD物联网 » Python-opencv 手眼标定(九点定位)

发表评论