好久没写博客了,最近在做一个教授给的任务,任务要求就是使用华硕的Xtion pro 这个设备(和微软的Kinect差不多)来识别一个一个的小机器人的位置和角度。
做之前什么都不知道,上网查了好多资料,但是中文的资料较少,所以写点东西出来一是给自己记录,而是方便以后研究这个东西的童鞋。
首先介绍一下思路:
Aruco是一个做显示增强技术的库,但是我只要它的识别坐标和角度的功能
OPENNI2 相当于是个驱动库,提供调用设备各种功能的接口,在这个项目中我要用到深度数据流和彩色数据流,其他的功能像是人体检测什么的我就不需要了。
OpenCV是个很好用的图像处理库,用它来处理和显示设备获取的图像,比如进行图像格式转换,去噪之类的操作
因为现在VS2013免费了,就用VS2013了,配置OpenCV的帖子地址如下:
http://my.phirobot.com/blog/2014-02-opencv_configuration_in_vs.html
然后是OpenNI2 和 OpenGL结合的一个小例子
http://www.cnblogs.com/yemeishu/archive/2013/01/11/2856859.html
最后是配置Aruco,下面链接是这个库的下载链接,最新的是1.2.5版
http://sourceforge.net/projects/aruco/files/1.2.5/
在装好环境后,测试一下Aruco
下面来说一下距离数据的作用,下图是原图经过提取轮廓后的图片,图片中间是个水壶,上面有个标签,可以看到乱七八糟的东西很多,不方便进行图像识别
写了个简单的过滤方法,因为距离数据和图像数据是对应的,所以可以设定一个距离的阈值来删掉不需要的部分,我的做法很蠢,一个像素一个像素的比较,所以速度很慢,希望大家给我点更好的建议,来几块这个速度。下面这张图就是通过距离过滤后的图像,我把标签放在小纸盒子上面。识别的还是很准的
但是我现在的问题是摄像头的距离不能太高,不然识别不出来,华硕Xtion的视频最大分辨率是1280*1024,教授要求的工作空间很大,所以要把摄像头悬挂在离地大约2.5米的地方,这样分辨率就不够用了。下图就是现在的高度下的照片
画面左上角是一个透明胶带,用来示意机器人或者标签的大小,而且也可以发现画面的噪点较多,下面就是要解决识别的问题。
另外一个问题就是虽然Xtion的深度数据的分辨率可以达到640*480,但是速度太慢,而且当彩色数据流达到1280*960分辨率后苏的也变得很慢。
另外一个问题是摄像头挂高后,摄像头到工作区域中心的距离河道边界的距离变化很大,简单通过一个阈值来二值化深度数据显然不可能,需要用一个函数来进行二值化。
下面是我现在的想法:
1.在工作空间4个角落放置四个大的标签,可以直接不用图像处理就能识别出来,来获得工作区间边界到摄像头的距离并且得到工作空间与摄像头图片之间的夹角。
2.利用而知化后的距离数据分割彩色图像的灰度图像,两个图像像素相乘?有没有更好的方法?卷积?这样得到的结果就是符合距离条件的地方有图像,不符合的地方为白色。
3.如果能直接识别出来最好(还没试,但是之前距离超过1.5米就识别不出来了),识别不出来有两个想法,如果拍摄静态图片可以得到更高的分辨率的话,那就是用距离数据来实时更新坐标信息(因为速度快),再通过静态高分辨率的照片得到机器人编号的角度信息,但是我现在还没能找到Xtion拍摄静态高分辨率图片的方法。第二个想法就是将分割后的图像线性放大提高分辨率后再处理一下图像后进行识别。
请教各位有没有更好点的解决方案,欢迎大家留言和我讨论,多谢~~