Halcon九点标定及python运行代码

上一篇文章中,使用了yolov5输出了检测图片的坐标信息,接下来就需要对相机与机械手的标定,我所使用的标定方法是在前人基础上学习并使用的,如侵权删

一、手眼标定和九点标定区别

我刚开始以为标定标定,不就是手眼标定吗,所以就搜了手眼标定相关教程,发现并不是这么一回事,手眼标定与九点标定难度上不是一个级别的,九点标定可以说是弟弟级别的,具体差别在哪,我这水平不够,就不多赘述了,根据你自己的需要去学习相关内容吧,反正就是想说的是九点标定简单,手眼标定难。

这里我献丑简单的解释下九点标定的原理,当然这些原理都是因为站在巨人的肩膀上,嘿嘿嘿

当然我知识有限,有大佬认为我有说错的地方请在评论区指出,好让大家一起学习

九点标定那,不像手眼标定那么复杂,即便你没有机械臂也可以完成标定,唯一需要你使用到机械臂的地方就是需要你使用机械臂到达九个点下,记录你的机械臂X,Y的值,为什么要记录机械臂下的九个点的XY值呢?你观看下边两个b站视频就能知道有啥用途了

这里我也简单的用图画表示一下原理

 最上边的三角形就好比标定,在不同的坐标系下,它的位置肯定不一样,怎么让两个坐标系都能准确的知道三角形的坐标那,这就需要通过旋转变换,哎,让他俩重合,这样就能控制机械手到达相机坐标下的三角形各点了,可能说的有点混乱,大体意思就是这样

通过公式可以看出,机械坐标(X’,Y’)与相机坐标(X,Y)的转换就是那个abc变换矩阵,我在图像中得到了目标的中心点,该怎么给机械臂代码让他走到目标中心点呢?这里的机械臂代码就是(X’,Y’),不知道这样你能否理解

二、Halcon九点标定

因为我的机械手是使用的delta并联机械臂,据说仅使用2D的九点标定就可以实现定位抓取的功能,所以我就先了解了九点标定。

如果你也想了解九点标定,推荐你观看以下b站视频

(1)从39看到最后就行 这里所使用的是海康visionMaster(软件简单易操作,但只能试用一个月,一个月后还想标定咋办,太鸡肋了,所以我还是使用了Halcon)

(2)Halcon教程有选择的观看入门教程就可以,贼简单不用担心学不会

Halcon下载

我不推荐使用最新版本,刚开始我本着最新更好的想法去下载最新版本,结果遇到很多问题(你不听劝的话可以去下载最新版本),我最后使用了Halcon20.11版本,完全够用

这是Halcon软件的安装包及许可证(许可证一会会解释是干啥用的)

# 安装包下载
百度网盘:链接: https://pan.baidu.com/s/1IxvFxK5b9N9NwfxNRwrnTA 密码: htz1
# 许可证下载
百度网盘:链接: https://pan.baidu.com/s/1fbxVEE0UqaUJYMf-9pMVsQ 密码: g3em

这是安装教程博客,这个教程里到了安装license的时候就不要跟着操作了,接下来需要用到第二个百度网盘下载的东西,下载后的内容如图

把我框选的这两个文件放入安装好的,复制粘贴即可

 三、Halcon标定代码

如果你观看了上边两个教程视频,我相信你已经学会了怎么去进行九点标定,接下来这段代码如果你不理解的话(代码真没啥好说的,看过视频就会,不需要任何基础),还是建议你去观看下上边的两个教程视频

read_image (Qq20230518193050, 'C:/Users/86188/Desktop/QQ图片20230518193050.jpg')
* 获得图片像素的大小
get_image_size (Qq20230518193050, Width, Height)
* 图片转换为灰色图,这样才能使用灰色直方图
rgb1_to_gray (Qq20230518193050, GrayImage)
* 灰色直方图的使用,阈值分割(具体图像具体分析)
threshold (GrayImage, Regions, 2, 47)
connection (Regions, ConnectedRegions)
* 特征直方图筛选九个点(具体图像具体分析)
select_shape (ConnectedRegions, SelectedRegions, 'column1', 'and', 0, 2158.49)
select_shape (SelectedRegions, SelectedRegions1, 'row1', 'and', 726.13, 1515.25)
select_shape (SelectedRegions1, SelectedRegions2, 'area', 'and', 8740.05, 11392.6)
* 九个点排序
sort_region (SelectedRegions2, SortedRegions, 'character', 'true', 'row')
* 计算像素坐标 (Rows, Columns)--行,列
area_center (SortedRegions, Area, Rows, Columns)
* 写入机械臂下的坐标
* X:=[]
* Y:=[]
* 计算仿射变换矩阵
* 重点!!!!(这是适合我自己的,你也可以不进行修改,视情况而定)
* 在yolo识别中的中心坐标是(列,行),所以下边的要改成vector_to_hom_mat2d ( Columns,Rows, X, Y, HomMat2D)
*vector_to_hom_mat2d ( Columns,Rows, X, Y, HomMat2D)
* 验证标定结果
* affine_trans_point_2d (HomMat2D, 像素坐标X, 像素坐标Y, Qx, Qy)

 四、python运行代码

当使用Halcon运行完,会得到下图的矩阵

 得到矩阵又有什么用?怎么去用啊?很简单,接下来就用到上边公式推导了,根据推导的公式写出相应代码,不就是 像素坐标*转换矩阵 = 机械手坐标 嘛,要明白这回事就好办了

代码加在这下边,如果不知道加在哪里,可以看看我上一篇文章,反正代码就这几断,也很好理解,可以根据你的需要自己去修改代码

            # ---------------------------------------- 目标坐标—>机械手坐标 -----------------------------------------#
            x0 = ((p2[0] - p1[0]) / 2 +p1[0])
            y0 = ((p2[1] - p1[1]) / 2 + p1[1])
            # 改成你求出的转换矩阵
            m = np.array([
                [-0.0691501, -0.604858, 379.435, ],
                [0.579499, -0.0841201, -679.111]
            ])
            #
            robot_x = (m[0][0] * x0) + (m[0][1] * y0) + m[0][2]  # m[0][0]:取第1行第1列的值
            robot_y = (m[1][0] * x0) + (m[1][1] * y0) + m[1][2]
            #
            print('机械臂坐标为:', robot_x, robot_y)
            # ---------------------------------------------------------------------------------------------------#

 运行结果如图所示

 将转换得到的机械臂坐标输入后,机械手到达了相应位置,效果很不错

猜你喜欢

转载自blog.csdn.net/Zeng999212/article/details/130778114