图像物体中⼼点_机器视觉之halcon⼊门(8)-⼀⽂弄懂如何
⽤相机测量物体长度...
第三节测量
3.3.1 简单的啰嗦⼏⼗句
所谓的测量,主要是测量出物理尺⼨,就是我们现实中所说的尺⼨。毕竟算出像素尺⼨实在是不是太难。Halcon⾥⾯的物理尺⼨测量分
1d,2d,3d测量,作为⼊门书籍我们这⼉只讲1d的,就是长度测量。⽐如咱们的标定板长度的测量。有没有很想学?哈哈……
3.3.2 ⾔归正传
图 3-3-2-1
如上图(3-3-2-1),单击助⼿⾥⾯的第四个选项"Measure"。会弹出下图(3-3-3-2),在输⼊栏有两个参数需要我们来填,第⼀个是第⼀红框⾥⾯的,待测量图⽚的来源,可以选择你已经拍好的照⽚,就是图像⽂件,单击那⼀⾏后⾯⼩框框可以选择图⽚路径,下⼀⾏是通过图像采集助⼿,就是相机采集图⽚来测量,如果你还没有打开图像采集助⼿,⼀选中就会⾃动弹出图像采集助⼿来帮你选择相机,本章第⼀节刚好你学了连接相机,怎么利⽤图像采集助⼿实在是难不倒你。如果你选中后⾯的"实时采集",就可以实时采集每⼀张图⽚来进⾏测量了。⼀切配置好后,下⾯⼀个框内是要相机的内参外参了,上⼀节刚好学的标定。希望你有保存。".cal"和".dat"刚好就对应了两个参数保存⽂件的格式。还是点击最后⾯的⼩框添加。
图 3-2-2-2
⼀切配置好后,就可以进⼊第⼆页选项卡如下图:此时你halcon的图像窗⼝应该是在实时显⽰的图⽚。把标定板放进视野中,如下图(3-3-2-3)。
图 3-3-2-3
图 3-3-2-4
然后选择上图(3-3-2-4)中最上你们的⼩⽅框,这是画直线的功能,到halcon图像窗⼝中画⼀条测量的线,保证这条线穿过要测量的物体的
两个边缘,如下图(3-3-2-5):
图 3-3-2-5
通常情况下,还是要调整下上图(3-3-2-4)中红框框内的三种参数:最⼩边缘幅度,意思是说halcon⾃⼰沿着线路边缘,当某个地⽅灰度值差⼤于这个幅度的时候就认为它为边缘。平滑,是指对图⽚进⾏平滑,如果你的图⽚噪声多,⼲扰多,则需要平滑。ROI宽,其实halcon 测量是在⼀个矩形ROI⾥⾯测量,你画的直线相当于这个矩形的长边中⼼轴线,这根线的长度就是这个矩形的长了,那这个矩形的宽就取决于你在这⼉设置的ROI的宽了,⽽且halcon会在直线的边缘上显⽰你的ROI的宽,让你看到它出来的边缘,所以我通常喜欢把ROI宽设置⼤⼀点,如下图(3-3-2-6):
图 3-3-2-6
看图中的垂直的绿线,它显⽰的就是矩形ROI的宽了,你也可以通过这个看看边缘是否到,到的是否准确。第四⾏的是插值⽅法,(具体的插值⽅法简介,详见本节TIPS 1)我建议选第⼆种吧。
接下来是边缘选择⾥⾯的变换和位置,如下图(3-3-2-7):
图 3-3-2-7
变换⾥⾯有positive和negative,positive是指灰度值由暗到亮的边缘,negative是指灰度值由亮到暗的边缘,你⾃⼰去挨个选择下,然后看看效果就知道了。All就是都选的意思咯。下⾯的位置⾥⾯还有first和last,这个实在不⽤我去啰嗦什么是first的位置什么是last的位置了吧。善意提醒下,你画的那条线是有⽅向的,由起始位置指向结束位置。咱们这就两个都选all吧。再往下的那些就是些辅助功能了,有兴趣的⾃⼰看下也能⼀⽬了然,不⽤讲解的。选项卡第三栏是模糊,对图像进⾏各种模糊的,咱们初级的⽤不上。直接跳过到结果栏:
图 3-3-2-7
是的,结果已经出来啦!如上图(3-3-2-7),单位在右上⾓是mm。因为有两个边缘,所以有两⾏数据,每⼀⾏分别是每个边缘点的坐标和幅度,这个幅度是指,沿着你画的测量直线的⽅向,每个边缘点左右两边的灰度差。本例中第1个点是由⿊⾊背景到⽩⾊标定板,所以灰度值上升了39.7639,第2个点是由⽩⾊标定板重新进⼊⿊⾊背景,所以幅度变化就是负值了。那为什么两个幅值的绝对值不⼀样呢?因为我打光不均匀呗~笨!下⾯⼀个就是你最关注的的距离了,表⽰距离下⼀个边缘点的距离,因为只有两个点,所以第⼆个点的距离参数就没有了。那么这个70.526mm就是两个点之间的物理距离了,也就是这块标定板中间⽩⾊部分的宽度。测的准不准呢?你⾃⼰看吧!如下图(3-3-2-8)。(友情提⽰:如果你的数据⼀直在跳动,就说明你⼀开始点击了实时采集,所以它就在⼀直对新采集的图⽚进⾏测量,我的就是这样。)
图 3-3-2-8
到这⼉,这个测量咱们算是结束啦。感兴趣的话可以继续拿⼀些其它东西来测测,看看准不准。但是如果要写代码怎么写呢?让我们在选项卡代码⽣成⾥⾯点击"插⼊代码"吧。代码如下图(3-3-2-9)。
图 3-3-2-9
别被这⼀页纸的陌⽣代码吓到了,其实关键代码没⼏步,很多都是赋值和重复,让我来⼀点点的分析给你听。⾸先是打开相机,接下来是相
机的内参外参赋值,这些你都有的,也都会的。然后设置了边缘最⼩幅度,就是之前在助⼿⾥⾯第⼆页选项卡边缘下设置的第⼀个参数。然
后是ROI的宽的⼀半,看我上⾯截图⾥⾯是60,这⼉它设置成30了,当然⾃有妙⽤,五分钟后你就知道了。接下来是算⼦:
set_system ('int_zooming', 'true'):这个算⼦是设置系统的意思,怎么个设置法?第⼀个参数就是你要设置的系统参数名,第⼆个就是系
统参数值,相当于⼀个是name,⼀个是value。本例中这个参数的意思就是说,你如果选择了true,那么对图像缩放的时候所有的数值都⽤多一点就不准
整数来算,减少运算量嘛。
接下来四⾏代码就是画那根线的起始终⽌点的坐标了。不要被它的命名吓唬到了,其实就是两个点的纵横坐标,再接下来的七⾏⼜是什么
呢,就是测量⽤的那个矩形了。还记得我说的其实halcon⾥⾯的测量是在⼀个矩形内吗?那你还记得如果⽣成⼀个带⾓度的矩形需要哪些参
数吗?就是gen_rectangele2()后⾯的参数啦。需要矩形的中⼼点坐标(两个参数),矩形的⾓度(⼀个参数),矩形的长宽的⼀半(两个参数)。
⼀共五个参数。分别对应接下来七⾏⾥⾯的17,18,21,22,23⾏。19,20⾏是⽤来求⾓度phi的。因为这个矩形的⾓度你⼜没设置,只好⾃
⼰算了,拿你画的那条线的起始点的纵坐标做差,横坐标再做差,然后atan()就可以了,就是21⾏的算⼦啦。这样分析是不是好懂很多。。
有了这些参数就要画测量的矩形了!
gen_measure_rectangle2(TmpCtrl_Row,TmpCtrl_Column,TmpCtrl_Phi,TmpCtrl_Len1, TmpCtrl_Len
2, 2588, 1940, 'bilinear', MsrHandle_Measure_01_0):这才是本例第⼀个灵魂算⼦,就是⽣成⼀个测量⽤的2型矩形。第⼀第⼆个参数就是矩形中⼼点的坐标啦,
第三个参数就是矩形的⾓度,第四第五个参数就是这个矩形长短边的⼆分之⼀长度啦。第六第七个参数就是整张图⽚的宽⾼,第⼋个参数是
插值⽅法,本例我选的是双线性插值法;第九个参数就是⽣成这个矩形所存的句柄。
⽣成这个测量的矩形后,就是要开始测量了嘛!可是我们好像还没有图⽚。。。所以接下来肯定是抓取图⽚啦,如下图(3-3-2-10):
图 3-3-2-10
因为我在助⼿第⼀页选择了实时获取,所以这⼉给加了⼀个死循环while(true)。不要在意这些细节。接着看⾥⾯的循环体:
grab_image (Image, AcqHandle):抓取图⽚,属于同步获取。第⼀个参数是抓到的图⽚,第⼆个参数是抓图⽚的相机的句柄。这个算⼦
很简单了,没什么好讲的。下⾯⼀个是重点:
measure_pos(Image,MsrHandle_Measure_01_0,1,AmplitudeThreshold,'all','all',Row_Measure_01_0,Column_Measure_01_0,Amp 提取垂直于矩形的边缘并测量。这个算⼦参数本来就多,halcon还给每个参数起这么长的名字。实在是醉了,也不怕吓到我的读者……,话
说回来,以后我们会遇到参数更多的算⼦的。下⾯我来说说每个参数的意思吧,第⼀个参数就是要测量的图像啦;第⼆个参数是测量矩形的
句柄;就是上⼀个算⼦画出来的那个矩形啦;第三个参数是⾼斯平滑系数,这个在助⼿⾥⾯也有设置;第四个参数是最⼩边缘幅度,开头赋
值的那个,在这⼉⽤到了;第五个参数是转换,对应的是第⼆个选项卡下⾯边缘⾥⾯的那个转换,我们选all的还记得吗?所以第六个参数就
是剩下的那个位置参数啦!也是all;第七第⼋第九第⼗个参数就是分别对应结果选项卡⾥⾯输出的内容,分别为边缘点的纵、横坐标,幅度
变化值,以及距离。但是!这些都是相机的像素坐标,以及像素距离,因为我们的相机的内参和外参还没有告诉算⼦呢。所以我们还需要接
下来⼀步: