参考文章:剖析Halcon 9点标定旋转中心标定与使用_william9987的博客-CSDN博客_halcon旋转标定

一、XY轴九点标定:

使用仿射变换:

夹具夹取产品或者标定块,选取一个特征,开始进行标定

X轴、Y轴移动一个位置,记录轴的物理坐标:(Qx1,Qy1)

提取图像中对应特征点,图像像素坐标:(Px1,Py1)

运动第N位置,记录下点位轴轴坐标(QxN,QyN),t提取像素坐标:(PxN,PyN)

使用vector_to_hom_mat2d (Px, Py, Qx , Qy, HomMat2D)得到图像坐标和世界坐标的转换关系矩阵。这种简单的标定方法不能消除镜头和相机畸变。

*创建空数组用来存放模板在图像坐标系的位置
ImageXPix:=[]
ImageYPix:=[]
*****************************
*确定好相机移动的九个物理坐标数组
WorldX:=[8,8,8,0,0,0,-8,-8,-8]
WorldY:=[-8,0,8,8,0,-8,-8,0,8]*开始标定
i:=0
* 打开相机
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 'ccd1', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
*采集图像  获取9个像素坐标
for i:=1 to 9 by 1   grab_image (Image, AcqHandle) *用第一张图片创建模板if(i=1)disp_message(3600, '创建模板区域,右键确定', 'window', 12, 12, 'red', 'false')draw_region(Region, 3600)reduce_domain(Image, Region, ImageReduced)create_shape_model(ImageReduced, 'auto', rad(-180), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)        endiffind_shape_model(Image, ModelID,  rad(-180), rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)if(|Row|>0)dev_display_shape_matching_results(ModelID, 'red', Row, Column, Angle, 1, 1, 0)*将位置添加到数组ImageXPix:=[ImageXPix,Column]ImageYPix:=[ImageYPix,Row]elsedisp_message(3600, '模板创建失败', 'window', 30, 12, 'red', 'false')      endifstop()
endfor
close_framegrabber (AcqHandle)
*计算对应点的仿射变换矩阵
vector_to_hom_mat2d(ImageYPix, ImageXPix, WorldY, WorldX, HomMat2D)
******************
*保存和读取标定好的仿射矩阵
write_tuple (HomMat2D, 'C:/Users/LZj/Desktop/hm.tup')
read_tuple ('C:/Users/LZj/Desktop/hm.tup', HomMat2D)***********应用*************
*打开串口,与运动程序通讯
open_serial ('COM2', SerialHandle)
*close_serial(SerialHandle)
set_serial_param (SerialHandle, 9600, 8, 'none', 'none', 1, 1000, 'unchanged')
i:=0
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 'ccd1', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while(true)grab_image (Image, AcqHandle)get_image_size(Image, Width, Height)if(i=0)i:=1draw_region(Region1, 3600)reduce_domain(Image, Region1, ImageReduced1)create_shape_model(ImageReduced1, 'auto', rad(-180), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)       endiffind_shape_model(Image, ModelID, rad(-180), rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)if(Score>0)       dev_display_shape_matching_results (ModelID, 'red', Row, Column, Angle, 1, 1, 0)         *将图像中心的像素坐标仿射得到物理坐标Qy1, Qx1affine_trans_point_2d (HomMat2D, Height/2-1, Width/2-1, Qy1, Qx1)*将找到的模板中心的像素坐标仿射得到物理坐标Qy2, Qx2affine_trans_point_2d (HomMat2D,  Row, Column, Qy2, Qx2)       *求出相机中心和模板中心之间的物理距离差string_send:='go2:'+(Qx1-Qx2)+','+(Qy1-Qy2)+',0'*将这个物理距离差通过串口发送给运动控制程序,让相机中心移动到模板的中心位置write_serial (SerialHandle, ords(string_send))trywhile(1)  *获得鼠标的能力  1表示鼠标左键  4表示鼠标右键               get_mbutton (3600, Row3, Column3, Button)if(Button=1)grab_image (Image, AcqHandle)find_shape_model (Image, ModelID, -0.39, 0.78, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)if(Score>0)                           dev_display (Image)dev_set_color ('green')gen_cross_contour_xld (Cross1, Height/2-1, Width/2-1, 6, 0)dev_set_color ('red')gen_cross_contour_xld (Cross,  Row, Column, 15,rad(45))*验证相机中心和模板中心是否基本重合affine_trans_point_2d (HomMat2D,  Row, Column, Qy2, Qx2)string_send:='go2:'+(Qx1-Qx2)+','+(Qy1-Qy2)+',0'disp_message (3600, string_send, 'window', 12, 12, 'black', 'true')endifendif               if(Button=4)breakendifendwhilecatch (Exception)                     endtryendif
endwhile

二、旋转轴标定:

参考一、http://www.elecfans.com/d/1601708.html

参考二、http://t.csdn.cn/fZgi9

1、相机固定,物体在轴上旋转

红点为目标物体的旋转中心,物体的标准基准取料位置为图左位置,实际取料位置为右图。相比基准位置偏移XYR(1,1,45°)

先把XY方向补偿了,只观察旋转轴的旋转过程就可以了。上图是旋转前。

旋转后:

​​​​​​​        

可以看到按旋转中心转正物体角度后会产生一个∆x和∆y的偏移。

只要算出来∆x和∆y,加上之前的xy的偏移就可以实现定位纠偏了。

在相机定位做补偿的流程中,我们的已知条件是:

1、当前物体的特征中心点(图2)。2、标定时拍照的特征中心点,作为基准点(图1)

通过抓边知道:3、当前物体的倾斜角度(图2)。4、标定的基准角度(图1)。

5、物体的旋转中心(通过旋转标定获取)。

以上已知条件中1、3是当前物体拍照获得的。2、4、5是标定流程中获得。旋转标定的目的主要就是得到条件5、旋转中心。

有了旋转中心和偏移角度(条件3-条件2),以及物体实际的位置(条件1)就可以算出将物体按旋转中心转正角度后xy方向上的偏移∆x和∆y。再加上xy的偏移就实现了定位补偿。

通过轴旋转多个角度在图像坐标系上获得多个点,使用halcon算子拟合圆得到旋转中心坐标的旋转半径R。

∆x和∆y的计算公式:

如图:通过标定旋转中心O坐标和旋转半径R已知。旋转角度需要补偿θ已知,求∆x=AC,∆y=BC。

因为三角形ABC和三角形AOD是相似三角形,所以有:

                                

这样就计算出了旋转后的∆x和∆y偏移,也就实现了补偿。

Halcon九点及旋转标定流程相关推荐

  1. Halcon 摄像机标定流程-代码实现

    1. 标定参数的构成 • 标定参数分为相机的内参和外参: • 内参:内参标定的是摄像系统的内部结构和关系,镜头的畸变在出厂的时候就已经固定下来的,唯一可能改变的是镜头和相机之间的组装关系.所以如果相机 ...

  2. Halcon标定板标定流程

    一.相机内参标定 目的:标定内参的目的是消除镜头的畸变. 面阵相机的内参由一个8位的数组组成包括: startCamPar:=[Focus,Kappa,Sx,Sy,Cx,Cy,ImageWidth,I ...

  3. Halcon 摄像机标定流程

    Halcon标定流程 摄像机分两种,一种是面扫描摄像机(Area Scan Camera),一种是线扫描摄像机(Line Scan Camera).准确来说,叫摄像机系统比较正确.两者的区别我也提一提 ...

  4. Halcon之单相机标定

    Halcon之单相机标定Halcon之单相机标定Halcon之单相机标定 相机的标定就是通过获取相机的内外参数,来纠正畸变和获取物理尺寸 纠正了畸变,测量才会准确(测量项目一般都需要考虑纠正畸变) 标 ...

  5. 张正友相机标定Opencv实现以及标定流程标定结果评价图像矫正流程解析(附标定程序和棋盘图)

    from:https://blog.csdn.net/dcrmg/article/details/52939318 使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么 ...

  6. 张正友标定Opencv实现、标定流程以及图像坐标转为世界坐标

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xiaomifanhxx/article/details/79560693 使用相机以前,首先要进行相 ...

  7. HALCON 20.11:标定助手使用注意事项

    HALCON 20.11:标定助手使用注意事项 标定过程中需要保持相机(光圈.焦距.位姿)固定. 标定板有两种:六角形排列标定板(.cpd文件)和矩形排列标定板(.descr文件). 透明标定板可用于 ...

  8. 结构光之单目+投影仪标定流程详解

    作为一个小白,近期在使用MATLAB标定工具包对投影仪的标定中,在各大网上,苦于没有一个详细的教程,遇到好多隐藏的坑,走了许多弯路.所以,写此博客,来对标定流程进行详细阐述以及相关可能遇到的问题. 因 ...

  9. 海康威视雅马哈RCX340标定流程笔记

    海康威视&雅马哈RCX340调试流程笔记 首先:相机的安装,通过相机标准安装孔位固定,一般安装于料盘的长侧边,相机中心安装位于盘面中心的正上方,安装的高度满足盘面尽可能充满整个视觉界面,保证相 ...

最新文章

  1. Spring Remoting: Hessian--转
  2. java测试工程师需要掌握什么_测试工程师需不需要了解开发知识?
  3. php mysql 分组 分页_简单的PHP+Mysql实现分页
  4. 2021ICPC(沈阳) - String Problem(后缀树+贪心)
  5. linux 远程调试文件夹,GDB远程调试开发板程序
  6. ★深入探讨高维宇宙【二】
  7. HP大中华区总裁退休感言(孙振耀 )
  8. 阿里云 x 天合光能 | 不让一寸阳光偷偷溜走
  9. 顺序表的基本操作(C语言实现,简单易懂!)
  10. 数学建模:层次分析法(AHP)详细步骤
  11. 「程序猿 DD」星球活动第一期,将在 7 月 9 日晚 20:00 整开放!
  12. [英文邮件] 请求 + 感谢 + 邮件结尾 的表达整理
  13. 博士申请 | 加拿大麦克马斯特大学郑榕教授招收全奖博士生/博士后
  14. 游戏编程入门(2):创建游戏引擎和使用该引擎制作小游戏
  15. 两个路由器互连设置方法
  16. 浩辰3D软件中装配零件的操作技巧
  17. 两个女孩全程不带现金,只付加密货币几乎游遍大半个国家是一种什么体验?...
  18. chmod的用法|SHELL积累
  19. crontab shell 每5秒执行_shell之定时周期性执行脚本-crontab
  20. 【洛谷习题】通往奥格瑞玛的道路

热门文章

  1. 驾考: 车内如何看左轮和右轮的位置 LTS
  2. Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering论文解读( and code)
  3. JWT手动签发| 自动签发
  4. 10本Linux PDF 书籍免费分享
  5. pyplot中文手册_matplotlib手册(1)-pyplot使用
  6. 单页双曲面 matlab,matlab绘制单叶双曲面
  7. 华为服务器设备型号查询,查询服务器型号和操作系统
  8. mac 邮箱客户端之腾讯企业邮箱设置 无法验证账号或密码
  9. LibreOJ10155 数字变换 ------ 树形dp
  10. uni-app开发h5 发布后背景图片找不到路径