在我大学的最后一年项目中,我正在为Android扩展一个名为Rviz的应用程序。这是一个Android平板电脑的应用程序,它使用ROS(机器人操作系统)来显示来自机器人的信息。这个项目的主要意图本质上是与传统的增强现实相反的——我不是将一些数字的东西投射到现实世界的视图上,而是将来自平板电脑摄像头的现实世界的视图投射到世界的数字视图(一个抽象的地图)上。该应用程序的预期目的是,现实世界的视图应该随着平板电脑的移动而在地图上移动。
为了移动屏幕上的摄像头馈送视图,我使用了平板电脑的加速度计并计算行进的距离。这本身就是有缺陷的,因此,这一运动远非准确(这本身并不重要——这是我报告的重要材料)。为了改善摄像机馈送的移动,我希望使用放置在现实世界中预定义位置的标记,目的是,如果检测到标记,则视图跳转到标记的位置。不幸的是,虽然有许多SDK处理标记检测(如高通SDK),但它们都是面向适当的增强现实(也就是说,在标记上覆盖一些东西)。
到目前为止,我发现的唯一两个框架可能有点用的是OpenCV(看起来确实很有前途,尽管我对c++不是很有经验)和AndAR,它似乎非常专注于传统的AR用途,但我可能会修改。这两种框架在这里合适吗?还有其他方法可以实现解决方案吗?
如果它有帮助的话,这是我正在扩展的应用程序的源代码,这是Android上ROS的源代码(使用相机的代码在"android_gingerread_mr1"文件夹中)。我也可以提供一个链接到我的扩展到Rviz,如果这也会有所帮助。非常感谢!
编辑:我目前的主要问题是试图整合两个独立的类访问相机(JavaCameraView在OpenCV,和CameraPreviewView在ROS)。他们都需要同时活跃,但他们做不同的事情。我肯定我能把它们结合起来。如前所述,如果需要,我将链接到/上传相关的类。
请查看OpenCV文档中关于模板匹配的部分。
所以我已经设法找到了一个解决我的问题的方法,它与我想象的完全不同。所有的图像处理都卸载到计算机上,并由ROS节点执行。该节点使用一个名为ArUco的库来检测标记。标记是由库提供的一个单独的程序生成的,每个标记都有自己唯一的ID。
当检测到标记时,将发布包含该标记ID的ROS消息。平板电脑上的应用程序接收到信息,并根据接收到的标记移动现实世界的视图。它工作得很好,虽然有点不可靠,因为我必须使用低质量的图像来更快地渲染和传输图像。这就是我的解决方案!一旦项目完成,我可能会在这里发布我的源代码。