看CSDN的大牛的博客一路学习过来,真的是收获很多,现在自己也想尝试着写一写技术博客跟大家分享一下。现在在读研究生,每天就是Matlab仿真,然后OpenCV再实现一下就是一个所谓的项目了。我的研究方向是视觉测量,但是现在做很多机械臂手眼标定的一些事情。
之所以会想起来写Labview相关的博客是因为本科的时候接触Labview感觉这个软件真的是很强大。当时参加一个科技类比赛还拿了个国家级一等奖,当时就是用Labview写的上位机,整个比赛大概是半年的时间,但是我当时印象很深刻我们把理论方案确定下来之后,用代码实现的时候只用了两天就全做好了。当然我们那个东西还是比较low的毕竟本科生的比赛,一个十八线城市的二本毕业生也没有做什么很高端的事情。
简单说一下labview的优势吧,也是为什么研究生导师明明不让我用我还一直坚持学习的原因。有人说他会OpenCV,有人说他matlab玩的6。但是我想说,你们写好的代码,我的labview可以在稍加改动的情况下直接运行,以后的博客我也会说一说怎么用OpenCV的程序。还有一点可能是别人看不上Labview的一个原因,就是Labview的集成度很高,我们只是功能的使用者而不是创造者,没有c语言那样灵活。这一点我确实承认,但是我想说的是,一个比赛也好一个项目也罢,我们的最终目的是实现功能,一个软件产品的成本我觉得最大的就是时间成本,本科期间所有的labview作品基本都是在一个月之内完成的,期间我还要去上一些无聊的课程,还得陪陪女朋友呢,是吧。程序员也是需要生活的,不能把时间都给了编代码,很不幸女朋友还是跑了。。。这个我也没办法,也不是重点,我想说的就是labview的开发周期可以很短,而且上手很快,一些简单的东西都不用学,试两次就可以做了。所以我一直没有放弃labview 。还有最重要的一点就是现在很多做视觉测量的公司在招聘的时候是会把labview考虑进去的,我毕业也是要找工作的嘛,也不能学一些对自己没什么用的,我也没那么多情怀,具体哪些公司,你们可以自己去查一查,我就不说了。好的,废话先说到这。
我今天写的这个标定的程序,其实很简单,但是现在关于labview图像处理的资料都是英文的,可能这也是为什么一直很少人学的原因之一吧,我也是一点一点翻译英文看的。我英文很不好,但是这种东西就是你沉下心一点一点翻译是完全可以理解的。
标定对于一个做视觉测量的研发者来说应该是最先接触的步骤,因为没有世界坐标,你是没办法做任何测量的。具体什么叫标定自行百度吧。之前做了OpenCV的标定,这种程序网上一大片,我就不说了,当然有需要的也可以联系我,界面是用Qt写的,不会Qt的就算了。写Opencv的时候我就萌生了用labview标定的想法,后来一看,嗯!还是很简单的。一不小心说了这没多废话。
我的思路呢是先学习用labview工具标定,labview提供很强大的视觉工具箱,先把工具箱搞明白了,以后再写程序的时候可以快速理解每个代码的意思。
今天要说的就是这个
打开之后是这样的
右边是五种情况,这篇博客暂时先只讲前两个,因为我一会要食堂去吃饭。
左边的部分就是他的帮助文档,所有问题其实用可以在里边找到答案。右边第一个选项就是“点距标定”,意思就是用两个像素点来标定世界坐标,加粗字体下边也有解释,用已知真实距离的两个像素来标定世界坐标。点击"Next"
第二步,选择标定源文件是吧,这个就是已知真是长度的图片了,点那个“load image from file”这块很好懂。上图。
我这个图是在网上下载的,这里要注意一个问题,标定用的图一定要是你使用的相机拍出来的,如果真的想用的话,不要像我这样在网上找图片,一定要用自己的相机拍照,这个很好理解,我就不说为什么了。选好图片“下一步”
点距嘛,到这步就开始找点了,箭头标出部分就是,如果你的相机像元不是正方形的时候,X,Y轴的度量是不样的,这个时候就要XY,单独标定了,这里我就不选择了,因为选择那个只是多了一个Y轴,操作方法是一样的。下面选择两个点。看图。
选择两个已知长度的点,在世界坐标那里填上真实的长度,其实到这里整个原理就很清晰了,就是算出每个像素点的真实长度,用这个长度去算别的图片,就是这样的。下一步
如果选勾上边个鬼东西就开始校正镜头畸变了,镜头畸变对测量的影响还是很大的,但是我在网上实在没找到同一个相机拍的图片,这个矫正畸变的步骤暂时不说,以后会说的,也是很简单的一步。下一步
这里就选择坐标原点和X轴了,我个人感觉这步随意就好,因为世界坐标的原点并不影响我们去测量一个长度,长度是一个相对量,所以。。。。就把原点放在左上角好了,毕竟习惯上是这样。下一步
到这里就标定完成,我们把标定文件保存一下,每次测量前加载这个文件就可以得到真实的长度了。用下边这个鬼来验证一下。
先把图片变成灰度的。
这个工具就是检测边缘的,现在是19.65,这可能是我之前标定的,我也不清楚,反正现在这个值是不是对的我不清楚,因为我们还没有加载刚刚标定好的文件,先看看不用的情况,下面加载标定图片。
点OK,检测一个厘米的距离,
10.08mm感觉还可以,但是这里边要注意两个问题,第一,这个检测边缘的程序,他检测的是黑线的外边缘,我当时在选择两点的时候也是选择的外边缘的亮点,所以如果你们自己用的时候,一定要选择好检测位置。第二,不要看现在的结果很好,其实我们没有进行镜头的畸变矫正,我也只能说这幅图片很好,畸变是普遍存在的,所以你们在使用前一定要进行镜头的畸变矫正。好说下一个。
不行,我有点饿,我先去吃个饭,回来再写。。都很简单,别骂我,我比较笨,我觉得挺难的,所以就写一写,老鸟飞过吧。。。。吃饭先。
接着来啊,这回有畸变矫正的事了,刚才拍两张照片。
这个标定就是Opencv里边的透视变换,有时候在测量一个平面上的信息的时候不能保证测量平面和相机光轴垂直,这时候我们就需要把这个平面变成一个和相机光轴垂直的一个平面上去测量,讲这个的时候我会把畸变矫正说一说。好,下一步,从这个选项上我们就知道需要四个点的是吧。
选择那个斜平面的图片进行标定。下一步。
寻找四个点,这四个点确保是你测量平面上的四个点,因为他就是依托这四个点来计算透视变换矩阵的,箭头的地方是给这四个点一个世界坐标,我这个标定靶是间距10mm的。所以世界坐标都是10cm,别忘了下边的单位。
这一步就是显示各种误差,也可以看他变换之后的图像在display的地方修改。
这是变换之后的图片,从肉眼上感觉标定靶部分基本是一个平面了。下一步,选择另一幅图片进行畸变矫正,
这步就是畸变矫正了。选择特征点,最上边的框框是选择感兴趣区域,Colcr Mode是选择二值化方式,当然下边就是二值化阈值选取了,可以看到靶面上的特征点都已经被我们选择上了,右下角这三个勾选项我记得有人说过是什么意思,但是我不记得了,如果有人知道可以告诉我一下,谢谢。好,下一步。
这个选的是每个标志点的间隔。就是单位距离嘛。下一步。
右上这个滑块选择的是矫正方式,他具体的算法我不清楚,但是他有明确的写了越往左速度越快,但是精度不高,往右速度慢,但是精度高,根据需求自己改,左侧的图片就是矫正之后的图像,
最后就是保存文件了,保存好,然后我们验证一下去,还是用那个视觉助手。
我们找四个点测一测,从现在看这四个点理论上应该是一个长方形,对边的像素点应该是一样的但是我们在标定之前我们看一下他们的测量结果。
3,4两点的距离比2,3两点的距离小了6个像素点,这是不能接受的,这是在没有加标定文件的实验结果,我们加入已经标定好的文件再进行测量。看一下测量结果。
误差不到一个毫米,这个误差其实跟我做这个实验的时候太随意也有点关系,我们可以看到基本是一个长方形了,感觉这个例子不是很明显哈。我再换两个点试一下。嗯
已经差了30个像素点了,我们看一下标定结果。
这个结果还是可以接受的。今天就先说这两个标定方法,过几天把剩下的三个说一说,然后标定就先告一段落,都是一个字一个字打的,可能我写的东西对你来说没什么用,我也没指望能帮到别人多少,我就是对自己的一个学习总结,指求别喷。