当前位置:   article > 正文

Python-opencv 手眼标定(九点定位)_opencv设置视觉抓取点怎么确定

opencv设置视觉抓取点怎么确定

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

前言

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


一、手眼定位原理?

以下可以参考

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

二、怎么实现

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

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

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

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

机械坐标请自行解决  

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

全部代码如下:

  1. import numpy as np
  2. import cv2
  3. # 通过九点标定获取的圆心相机坐标
  4. STC_points_camera = np.array([
  5. [207, 160],
  6. [311, 159],
  7. [415, 159],
  8. [206, 256],
  9. [311, 257],
  10. [416, 258],
  11. [205, 353],
  12. [311, 356],
  13. [416, 357],
  14. ])
  15. # 通过九点标定获取的圆心机械臂坐标
  16. STC_points_robot = np.array([
  17. [54, -74],
  18. [-4, -76],
  19. [-54, -77],
  20. [52, -32],
  21. [-4, -34],
  22. [-55, -35],
  23. [50, 11],
  24. [-4, 10],
  25. [-54, 8],
  26. ])
  27. # 手眼标定方法
  28. class HandInEyeCalibration:
  29. def get_m(self, points_camera, points_robot):
  30. """
  31. 取得相机坐标转换到机器坐标的仿射矩阵
  32. :param points_camera:
  33. :param points_robot:
  34. :return:
  35. """
  36. # 确保两个点集的数量级不要差距过大,否则会输出None
  37. m, _ = cv2.estimateAffine2D(points_camera, points_robot)
  38. return m
  39. def get_points_robot(self, x_camera, y_camera):
  40. """
  41. 相机坐标通过仿射矩阵变换取得机器坐标
  42. :param x_camera:
  43. :param y_camera:
  44. :return:
  45. """
  46. m = self.get_m(STC_points_camera, STC_points_robot)
  47. robot_x = (m[0][0] * x_camera) + (m[0][1] * y_camera) + m[0][2]
  48. robot_y = (m[1][0] * x_camera) + (m[1][1] * y_camera) + m[1][2]
  49. 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

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/420904
推荐阅读
相关标签
  

闽ICP备14008679号