终于到了说再见的时候了,说实话从最开始对这个工程的满脸懵的状态到现在能弄出个像样的3D Rigid Object Tracking出来,感觉自己学到很多高大上的东西(opencv,图像处理算法,android等)。最深的体会有两点:
1,网上的代码到自己手里并不是那么容易跑出效果来的,你需要配置很多的环境,必须具备一定的基础知识才能找到错误所在,还要有坚强的意志不停的调试。
2,团结力量大!非常谢谢我的队友们,特别要谢谢老师给我们提供参考的代码,谢谢师兄的帮忙!
Team & Project
课程名称: 图像分析与理解 项目名称: 3D Rigid Object Tracking HeadLine: 6/17/2016 队员姓名:杨梅,许佳琪,罗音 华中科技大学 电子信息与通信学院 |
Introduction
The objective of 3D rigid object tracking is to associate 3D target objects in consecutive video frames and meanwhile estimate the relative pose (3D translation and 3D rotation) between the 3D targetand the camera. Rigid means the relative position among object components do not change. For instance, a cup, a book and a car are rigid object while a human face and a cat are non-rigid object. It has a variety of uses, some of which are: humancomputer interaction, security and surveillance, video communication and compression, augmented reality, traffic control, medical imaging and video editing.3D object tracking can be especially difficult when the objects are moving fast relative to the frame rate. Another situation that increases the complexity of the problem is when the tracked object changes orientation over time. For these situations the tracking system usually employs a motion model whichdescribes how the image of the target might change for different possible motions of the object. |
Progress
一 环境
我们用到的环境是:
系统:win8
软件平台:vs2012+ opencv3.1.0
二 项目介绍:
这个工程是 opencv3.1.0里自带的例子,放在 samples/cpp/tutorial_code/calib3d/real_time_pose_estimation/ 。该项目主要由2部分组成:Model registration和 Model detection,即目标的注册和追踪。
(1)Model registration:流程图如下:
也就是说如果我们在第一个模块输入的原图是下面这些:
他们的3D mesh 的ply文件分别是:(ply文件主要是人工标注立方体的8个顶点的坐标,这8个坐标是根据实实在在的物体的长宽高比例确定的)
那么运行Model registration会得到下面的结果,并产生对应的myl格式的文件作为下一个模块(Model detection)的输入。
说明一下:之所以选上面3副图像是因为魔方是正方体,但特征点不是很多;而墨水属于长方体,而且特征丰富;而杯子是不规则图形。
(2)Model detection:流程图如下:
More info: Real Time pose estimation of a textured object
Demo:
最终运行的结果如下:
可以看出该算法的帧率大概是8fps,但追踪的还是很正确的。
总结
总结几点要注意的地方:
(1)如何保证代码能顺利的跑起来,这是第一步。最开始我直接在vs2012上新建一个c++解决方案,配置好opencv环境,新建项目后将opencv里面OpenCV\sources\samples\cpp\tutorial_code\calib3d的real_time_pose_estimation源代码加进来,能够编译通过,运行的时候第一个register项目运行到将八个点标完之后,程序跑死,第二个detect项目完全跑不起来,没找到原因。由于opencv教程里讲的是直接运行编译好的opencv库里面的.exe文件,而我们所下的opencv3.1里面的bin文件夹下并没有所需要的两个.exe文件,所以决定重新编译一次opencv源代码库。按照网上教程Windows下利用CMake和VS2013编译OpenCV 利用cmake和opencv3.1下的sources源代码来产生所需vs版本下的opencv解决方案,我所用的是vs2012,然后打开解决方案编译即可。直接编译opencv出来的解决方案里面还是没有我所需要的两个项目,然后查看sources文件夹的CMakeLists.txt发现“OCV_OPTION(BUILD_EXAMPLES “Build all examples” OFF )”,将OFF改为ON后重新用cmake产生解决方案,然后打开,发现opencv解决方案下有了我们所需的两个项目register和detect,运行register发现运行到waitkey(0)处输入按键无反应,一直等待在那里,将其参数改为其他任何参数都可运行,不知道原因。至此两个程序都可以正常运行了。
(2)如何保证刚追踪第一帧时准确匹配,这是跟踪成功的第一步。跑代码时我们发现模块 registration中用来注册目标的图片和模块 detection的输入视频的起始帧不一致,所以导致跟踪一开始就不成功,于是我们把视频的第一帧保存为模块一的输入图像,结果就成功了!
(3)ply文件的更改。随着跟踪目标的形状不一致,8个顶点的对应坐标要自己手动敲进去(顶点的标记要和定义的坐标点的顺序一致)。
(4)用程序跑自己拍的视频时,发现会出现视频旋转180度的情况,更改程序将读出的视频帧旋转180度后再处理可以解决(此时用来register的图片也要跟着旋转)。
参考代码:
More info: 我的github
References
[1]. Multiple 3D Object Tracking for Augmented Reality, In ISMAR, 2008.
[2]. https://www.ssontech.com/tutes/tuteobj.html
[3]. Manipulator and Object Tracking for In-Hand 3D Object Modeling, IN IJRR, 2011.
[4]. Robust Statistics for 3D Object Tracking, In ICRA 2006.
[5]. Real-time 3D Object Pose Estimation and Tracking for Natural Landmark Based Visual Servo. In IROS.