halcon显示坐标_机器视觉之halcon入门(7)-一文弄懂halcon相机标定

第二节 相机标定

3.2.1 简单的啰嗦几十句

有时候我啰嗦归啰嗦,但是不代表说的话是废话。所以该看的你还是得看一下的,老铁。比如接下来的话:第一、不管多好的相机,硬件传感器拍摄出来的照片都是有畸变的,这个畸变大体分两种(桶形畸变和枕形畸变),为什么会这样呢?不是我要讲解的重点。你只要知道,畸变肯定有,质量越好的相机畸变越小,但是畸变可以通过算法减少甚至消除。第二、相机拍摄出来的照片的单位都是像素,你用相机拍了一个物体,然后你可以轻松通过图像处理求出这个物体的长多少个像素,宽多少个像素。但是你不知道长多少厘米,宽多少厘米。对的,这里面有一个坐标系之间的转换,你会吗?数学水平够吗?不够?没事,编写halcon那群程序员早就知道你弄不来。所以他们在助手里面又助了你一手:这一手就是标定。

怎么玩呢?首先:你得固定好你的相机的位置,然后调整好物距,焦距,让被测物能清晰显示。固定好就不要再动了。然后你要准备一块标定板。把标定板放到相机视野下拍摄照片。这块标定板上面的图案的物理尺寸你是知道的,然后相机拍下来后对应多少的像素尺寸,你也知道了。这两者之间一转换,就是对应关系了。当然怎么转换你不用管。转换完之后怎么表达这个转换关系,你也不用管,halcon助手帮你搞定。

3.2.2 言归正传

halcon显示坐标_机器视觉之halcon入门(7)-一文弄懂halcon相机标定_第1张图片

图 3-2-2-1

如上图(3-2-2-1),打开助手里面的第二个:"新的Calibration"。就会弹出下图(3-2-2-2),第一个红框框中第一排是标定板的描述文件,就是前面说的标定板的各种参数,你得告诉halcon嘛,(这个文件怎么获取呢?详见本节TIPS 1),其次是你那块板的厚度,你用卡尺卡一下就知道啦。第二个框里面是你像元的宽高,相机的参数文档里面会有的,你得自己找一下。焦距是镜头参数,一般镜头上都有的,如果没写,找下镜头的参数文档,里面也会有的。填好这5个参数,进入第二项,点击"安装"后面的"标定"。

halcon显示坐标_机器视觉之halcon入门(7)-一文弄懂halcon相机标定_第2张图片

图3-2-2-2

halcon显示坐标_机器视觉之halcon入门(7)-一文弄懂halcon相机标定_第3张图片

图 3-2-2-3

如上图(3-2-2-3),是椭圆位置的标定,不是最上面的标定。进入标定页面后,你可以有两种方式把拍有标定板的照片给halcon,第一种是图像文件,就是你先拍好一堆图片,然后直接在这儿读取。另一种是利用图像采集助手实时拍摄照片,实时标定。什么是图像采集助手?就是上一节教你的那个助手咯~~。第一种方法你拍好图片直接点第二个框中的"加载"就可以了。这一节我们主要讲下第二种方法,用采集助手实时采集图片并标定!

在第一个矩形框中选中第二行的图像采集助手。然后halcon就会自己打开图像采集助手,自动获取图像接口。你只要直接连接相机就可以了。当然没这么简单啦。。。你最起码稍微设置下参数嘛!然后再连接相机。然后退回标定窗口,选中第二个框框下面的"实时图像",这样图像窗口就会实时显示你正在拍摄的图片了,而上图左边的大空白框处会显示你当前照片的状态。一般情况下,你尽量保证你的实时图像的状态是"确定"状态,如下图(3-2-2-4)(实时图像中标定板的摆放,详见本节TIPS 2):

halcon显示坐标_机器视觉之halcon入门(7)-一文弄懂halcon相机标定_第4张图片

图 3-2-2-4

一旦状态栏显示确定了,你就可以点击"采集"按钮,采集这张图片。然后移动标定板的位置,旋转标定板的角度,再采集。一般收集15-20张图片就可以了。尽量保证所有采集的图片里面的标定板加一起覆盖了整个画面,尽量保证标定板旋转过所有的角度。然后选择一张图片作为参考位姿(有什么用呢?详见本节TIPS 3),即"标定"按钮上面那个按钮。这张图片决定了相机坐标系的原点位置与各个轴的方向,一般都选择摆放比较正的那一张。再点击"标定",就可以在"结果"栏里面看到标定的结果了。如下图(3-2-2-5):

halcon显示坐标_机器视觉之halcon入门(7)-一文弄懂halcon相机标定_第5张图片

图 3-2-2-5

结果中有相机标定的平均误差,相机的参数(即内参),相机的位姿(即外参,相对于你在标定栏选择参考位姿的那块标定板)。对于内参,外参你都可以点击"保存"按钮,保存下来,这样下次使用就不用再标定了。最后是代码的生成,相信整了半天,你肯定不想再写代码了,好在有"插入代码"按钮,看下图(3-2-2-6),矩形框中可以选择是直接生成标定的结果还是标定的代码。

halcon显示坐标_机器视觉之halcon入门(7)-一文弄懂halcon相机标定_第6张图片

图 3-2-2-6

这样的话相机的标定就算是完成了。那么这些数据有什么用呢?怎么用呢?这是很容易想到的问题。还记得开头我们说的标定的两个作用吗?所以我们要用的就是实现这两个功能。

先说第一个:消除畸变:

说消除肯定是理想化了,现实中哪有消除一说,但是大大缩小畸变,以至于畸变误差小到忽略不计还是可以做到的。主要的算子就是:

1)change_radial_distortion_cam_par( : : , CamParamIn, DistortionCoeffs : CamParamOut):根据指定的径向畸变确定新的相机参数。就是根据刚刚标定的有畸变的相机参数,换算成没有畸变的相机参数。第一个参数就是消除畸变换算的方法了,有四种方法,大同小异。第二个参数是输入的相机参数,也就是刚标定的参数,第三个参数是渴望把畸变消除到什么程度,一般都是0吧?第四个参数就是换算过后的相机参数了,有了这两个参数,再进行下一步:

2)change_radial_distortion_image(, : : , : ):这个算子就是修复图像径向畸变的。第一个参数是输入的图片;第二个参数是需要矫正的区域,如果你是全部都要矫正就继续输入第一个参数的图像就可以了;第三个是输出参数了,就是矫正后的图片,第四个参数是拍照时候相机的内参,就是标定出来的相机参数,第五个参数是你消除畸变后的相机参数,就是上一个算子中的。

经过这一步,咱们的图像就被矫正啦!

第二步功能:转换到世界坐标系

1)image_points_to_world_plane( : : CameraParam, WorldPose, , , : , ):把图像坐标转换到世界坐标,不过这个世界坐标的z坐标默认为0的,只有x,y坐标。毕竟单目嘛,该算子第一个参数就是相机的内参了,第二个参数是相机的位姿,就是外参,第三、第四个参数就是相机上的像素坐标,第五个参数相当于世界坐标的单位吧,你可以选择m或者cm或者mm等。第六、第七个参数就是输出的世界坐标系下面的坐标了!

如果你想知道图像中两个点之间的距离,直接把像素坐标通过这个算子转换成世界坐标,然后欧几里得公式,就可以了。当然还有更有效且成熟的方法,请听下回分解。

本节TIPS:

1)标定板的种类其实也有很多种,halcon常用的是一个带有拐角的矩形框里面7*7 个黑圆点的这种,如下图。

halcon显示坐标_机器视觉之halcon入门(7)-一文弄懂halcon相机标定_第7张图片

就算是同一种标定板也是有大有小,有精度高精度不那么高之分。大小根据你相机的视野来定,一般标定板大小在视野的1/3-1/4之间。当然稍微偏差一点也没关系。视野大小很好判定,你拿把尺子往视野里一丢就知道了。精度取决于你项目上的精度要求跟你的经费预算了。小视野的标定板要网上买,大视野的比如1平米那么大的视野,我觉得自己打印一张就可以了。标定板虽然结构简单,但是让你画还是比较难为你的。所以halcon有个算子帮你:gen_caltab( : : , , , , , : ):生成标定板的意思。前两个参数就是标定板上小圆点的每行每列的个数,一般都是7*7的,所以前两个参数一般都是7,第三个参数就是字面意思了,标记点的直径(单位是米),第四个参数容易搞错,它不是相邻标记点圆心的距离,是标记点直径与相邻标记点圆心距离的比值。这个我第一次弄的时候就弄错了,耽误了大半天时间。第五个参数和第六个参数就是生成的标定文件保存的位置了。一个是.descr文件,halcon自己用的,一个是PS文件,给你打印用的,简直贴心。

所以当你项目中买回来一块标定板,需要把标定板参数告诉halcon的时候,你可以通过这个算子直接生成。

1) 通常,标定板放入视野内,可能状态栏会显示"找不到标记点","检测出品质问题"等等等等,把滚动条往下拉,会看到halcon对品质问题的描述,可以根据它的描述修改标定板的摆放和一些外部条件的设置。一般情况下,我们得保证(1)要对好焦;(2)要光照充足且均匀;(3)标定板尽量覆盖全部视野;(4)每次采集标定板自身旋转一定角度。上述第一点,调焦是要在所有标定图片采集之前调好,如果采集了好几张图片后,再动镜头调焦,前面几张图片就报废了,得重来;第二点光照充足的意思是尽量保证标定板白色部分灰度值在200+,黑色标记点灰度值在50-。

2) 我们标定的时候,会发现每一块标定板都会显示出坐标轴,标定板的小拐角刚好在x轴和y轴正方向确定的第一象限内,z轴指向相机,属于左手坐标系。确定参考位姿就是以你选中的那一张标定图片中的坐标位置(坐标原点与坐标轴方向)建立整个坐标系。获得的相机的外参也是根据这个坐标系来计算的。一般标定完得出数据后,也可以根据外参和这个参考位姿照片目测比对下,看看标定有没有出现大的偏差。

你可能感兴趣的:(halcon显示坐标)