结合OPENNI2,Aruco与OPENCV进行视觉定位

阅读更多

前些时间写了篇文章把我在做这个项目中遇到的问题以及思路说了一下,传送门:

http://jcs130.iteye.com/blog/2185533

在上篇文章的思路下作了实现,已经达到了教授的要求。

 

首先第一步检测四个角的坐标,经试验,在这个高度上把标记直接打印成一张A4纸的大小就可以直接识别:



 我还发现,这个硬件本身的深度数据有点问题,如下图所示,靠近墙的一侧颜色较量说明距离值较近,离墙远的地方有一个小区域几乎是黑色,说明很远,所以如果想要对深度数据进行二值化处理必须要用一个可变的阈值。


 我在这里用的方法是先记录四个顶点的距离,找出最远距离和最近距离并假设距离的变化是线性的,再根据实际情况在某特定区域上加加减减来确定最终的阈值。

 确定阈值后执行二值化,二值化后会有很多细小的噪点,使用均值滤波器过滤并且使用膨胀的方法联通路相邻的像素点,再进行轮廓检测确定感兴趣的区域大小,如下图所示:


结合OPENNI2,Aruco与OPENCV进行视觉定位_第1张图片
 

因为深度图像和彩色图像之间存在偏差,手动的去修正这个坐标上的偏差,并且对彩色图像依次进行放大->二值化->膨胀->腐蚀操作,再把经过处理后的图片使用ArUco进行识别,得到标记的ID以及四个顶点的坐标。如下图所示:(中间为原是大小,左边的为放大后的图片,右边为经过处理后的图片,已经可以成功识别)

结合OPENNI2,Aruco与OPENCV进行视觉定位_第2张图片
 下图就是程序运行时的图片输出,可以看到程序运行时的流程,为了加快处理速度,使用了CUDA显卡加速功能,速度绝对是大于教授提出的5FPS的要求了~
结合OPENNI2,Aruco与OPENCV进行视觉定位_第3张图片
 最后教授说比较直观的做法是在图片上画出标记的轮廓以及编号,并且输出的坐标应该是相对于实际坐标系的而不是直接输出像素坐标,另外最好可以给出让用户修改配置的功能(因为教授想把我的程序加到他另外一个程序中,所以不需要图形界面),所以我又加上了配置文件,这样用户可以通过修改配置文件来修改参数,最终效果如下图所示:(我故意把基准坐标系(红色箭头)弄歪来测试坐标变换的结果)



 

项目总结:

这个项目教授本来想找一个有很强的图像处理基础的同学来做,但是做完这个项目后个人觉也不需要,因为我本身接触图像处理仅限于知道些概念,具体实现表示完全不清楚,但是我觉得这个并不阻碍我最后做出这个项目,在做这个项目之前我几乎没有用过C++,也只是知道OpenCV可以用来作图像处理,也并没有实际使用的经验。这就是所谓项目驱动吧,只要是觉得自己感兴趣,就去做,不要因为自己不会做而直接拒绝,技术日新月异,我们不可能全都掌握,但是我们可以锻炼自己的学习能力,这样就可以保持自己的竞争力,与大家共勉。

最后附上最终演示视频的链接:

http://www.tudou.com/programs/view/n13nkgCPA8s/

  • 结合OPENNI2,Aruco与OPENCV进行视觉定位_第4张图片
  • 大小: 1.2 MB
  • 结合OPENNI2,Aruco与OPENCV进行视觉定位_第5张图片
  • 大小: 1.1 MB
  • 结合OPENNI2,Aruco与OPENCV进行视觉定位_第6张图片
  • 大小: 1 MB
  • 结合OPENNI2,Aruco与OPENCV进行视觉定位_第7张图片
  • 大小: 899.6 KB
  • 结合OPENNI2,Aruco与OPENCV进行视觉定位_第8张图片
  • 大小: 299.1 KB
  • 结合OPENNI2,Aruco与OPENCV进行视觉定位_第9张图片
  • 大小: 510 KB
  • 结合OPENNI2,Aruco与OPENCV进行视觉定位_第10张图片
  • 大小: 1.2 MB
  • 查看图片附件

你可能感兴趣的:(opencv,openni,aruco,图像处理)