提示:若没有查找的算子,可以评论区留言,会尽快更新
Halcon应用:九点标定-手眼标定
- 前言
- 一、Halcon应用?
- 二、应用实战
- 1、图形理解[eye-to-hand]:
- 1.1、开始应用
- 2、 图形理解[eye-in-hand]
- 2.1、 开始应用
前言
本篇博文主要用于记录学习Halcon中算子的应用场景,及其使用代码和图像展示。只讲通俗易懂使用方法,不讲原理,不讲原理,不讲原理,重要的事情说三遍。
九点标定-手眼标定:想象一下,人眼睛看到一个东西的时候要让手去抓取,就会控制手到物体旁边,可是眼睛看到的位置和手的位置所处的不一样,这就需要知道眼镜和手的坐标关系。如果把大脑比作中间人,把眼睛比作A,把手比作C,如果A和中间人的关系知道,中间人和C的关系知道,那么C和A的关系就知道了,也就是手和眼的坐标关系也就清晰了。
提示:以下是本篇文章正文内容,下面案例可供参考,注意参数坐标的使用,能帮助你理解算子
一、Halcon应用?
Halcon 是一个强大的图像处理工具,该工具是为了解决机器视觉项目任务而创建的。
二、应用实战
1、图形理解[eye-to-hand]:
眼在手外:站在相机角度看到的三角形物体,与站在机械臂角度看到的物体可能会有所差异,比如:
视角差异图
大家看到这个脑海中是否会出现之前的一个应用:仿射变换,没错,就是用到仿射变换,将相机视角的图变化到机械臂视角,经过平移和放缩,旋转。
1.1、开始应用
我们可以采用九点标定板进行标定,在相机视角下,通过halcon将每一个点的图像坐标获取到,采用一一对应的方式,获得对应机械臂坐标下的各个点的机械坐标,这样就分别获得两组坐标,分别是相机视角下的坐标[Qx, Qy],一个是机械视角下的坐标[Rx, Ry]。
*假定已经获得图像坐标下的九点位置
column_img := [50,150,200,50,150,200,50,150,200]
row_img := [20,20,20,70,70,70,120,120,120]
*分别获得机械坐标下的九个点位置
column_robot :=[275,225,170,280,230,180,295,240,190]
row_robot := [55,50,45,5,0,-5,-50,-50,-50]*利用该算子构建变换矩阵
vector_to_hom_mat2d (row_img, column_img, row_robot, column_robot, HomMat2D)
* 获得需要知道的图像坐标下的某点(Qx, Qy)的机械坐标(Rx, Ry)
affine_trans_point_2d (HomMat2D, Qx, Qy, Rx, Ry)
* 标定完成
2、 图形理解[eye-in-hand]
眼在手中:相机固定在机械手上面,这种情况的标定过程实际上和相机和机械手分离的标定方法是一样的,随着机械臂带着相机移动,相机视野中的三角形区域会发生变化,某些情况下相机只能看到三角形的一个角区域。但是机械视角和相机视角看到的会是一样的。
2.1、 开始应用
同样,我们还是采用标定板的方式进行标定,但是此相比前面会有点差异,如下:
思考一下:那么视野中只有一个标定点,如何进行标定呢🤔?
步骤1:将标志位(三角形)放置在相机视野中;
步骤2:记录当前标志位的图像坐标和机械臂的机械坐标
步骤3:移动机械臂带动相机移动,比如位置2,大家可以参考背景上的雷电标志,雷电和三角形之间是相对固定的,也就是说,三角形标志在相机视野中在移动;
步骤4:那么我们可以使用9个位置,要保证三角形始终在相机视野中,分别记录下对应位置的图像坐标(三角形)和相应的机械坐标
至此,我们是不是得到了类似上面的九点标定数据形式
如果你当前是在做相机装在机械臂末端的九点简化标定,那你就是在用 Eye-in-Hand 模式,但做的是平面仿射标定,不涉及全6自由度位姿变换,属于 简化版手眼标定
* eye in hand
column_img := [869.0,979.07,1090.03,1461.64,1833.96,1724.21,1613.21,1240.49,1351.27]
row_img := [1372.36,1758.86,2145.75,2040.02,1935.01,1546.79,1158.53,1265.07,1652.6]
* column=x row=y
row_robot :=[98.84,109.81,120.62,121.88,123.11,112.23,101.62,100.343,111.08]
column_robot := [320.81,322.27,323.695,313.15,302.45,301.106,299.56,310.75,311.65]
* 现在我们根据图像坐标求到机械坐标的变换矩阵
vector_to_hom_mat2d (row_img, column_img, row_robot, column_robot, HomMat2D1)
* 那从机械转图像一样
vector_to_hom_mat2d (row_robot, column_robot, row_img, column_img, HomMat2D2)
* 问题来了
* 如果让标志位移动到相机中心,机械手坐标是多少?
* 已知条件是:机械手拍照位置(Rx,Ry),和标志位坐标(row, column), 相机size=2448*2048
* 假定拍照位置是Ry=1300,Rx=1000, 在拍照位时图像中标志位是row = 240,col = 542
* 求解坐标, 机械 -> 图像 注意矩阵用的哪个
affine_trans_point_2d (HomMat2D2, Rx, Ry, col, row)
* 那么相机中心是
row_center := 1024
col_center := 1224
* 距离中心的偏移量
datarow := row_center - row
detacol := col_center - col
* 计算标志位在图像中心时机械应该的坐标
affine_trans_point_2d (HomMat2D1, col_center, row_center, Qx1, Qy1)
注意:机械位置仅仅是相机看到的位置,实际并非在机械夹爪下方,需要计算相机和机械夹爪的相对位置,再次移动补偿值,才是最终夹爪可以夹取的位置