图像处理之_增强现实工具ARToolKit
图像处理之 _ 增强现实工具 ARToolKit
#图形图像
1. 增强现实
增强现实(AR)是将电脑虚拟的图像覆盖到真实世界画面中,这个技术在工业和理论研究方面都存在着极大的潜能。
2. 相关概念
(1) ARToolkit
ARToolkit,是一个开源的 AR(增强现实)SDK。它是用 C/C++ 语言编写的库,通过它可以很容易地编写增强现实应用程序。增强现实中最困难的部分在于实时的将虚拟图像覆盖到用户视口,并且和真实世界中的对象精确对齐。ARToolKit 使用电脑图像技术计算摄像机和标记卡之间的相对位置,从而使程序员能够将他们的虚拟对象覆盖到标记卡上面。ARToolKit 提供的快速和准确的标记跟踪,能够让你快速的开发出许多更新更有趣的 AR 程序。
(2) OpenGL
OpenGL 是 Open Graphics Library,用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口(API),可绘制从简单的图形到复杂的三维景象。
(3) OpenCV
OpenCV 是 Open Source Computer Vision Library。它提供图像处理和视频处理的基础算法库,还涉及一些机器学习的算法。比如实现视频的降噪、运动物体的跟踪、目标(比如人脸)的识别等。
(4) 关系
OpenCV 专注于从采集到的视觉图像中获取信息,是用机器来理解图像;OpenGL 是用机器绘制合适的视觉图像给人看,ARToolkit 依赖 OpenCV 和 OpenGL,虽然大多功能用 OpenCV 也能实现,但使用 ARToolkit 更加方便和高效。
3. 安装软件
(1) OpenGL
1 | $ sudo apt-get install build-essential libgl1-mesa-dev |
mesa 是一个软件实现的 OpenGL 功能,虽然慢,但在你的显卡或者系统不支持硬件加速时,它使程序还能运行。
(2) OpenCV
1 | $ wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/3.1.0/opencv-3.1.0.zip |
OpenCV 也可使用 apt 安装,不过建议下载编译源码,源码中有很多示例可以参考,也能追进函数,查看其功能具体如何实现。
(3) 安装 ARToolKit
1 | $ sudo apt install clang libc++-dev libc++1 libdc1394-22 libraw1394-dev libv4l-dev |
对于数据源,它支持 gstreamer 和 V4L(Video For Linux),这里我主要使用了 V4L。另外还有一个小问题,编译时可能提示找不到 opencv 的头文件,我把它修改成了#include <opencv/cv.h>。
4. 运行示例
还是在 ARToolKit 目录下,编译后运行
(1) 校正摄像头
calib_camera 是校正摄像头的程序,代码在 util/calib_camera 目录下,编译后程序生成在 bin 目录下,运行此程序时,需要一个 5x7 的棋盘图,位置在./doc/patterns/Calibration chessboard**.pdf,我用手机拍了一张相片,即可和摄像头配合使用,可以看到视频上出现了对棋盘位置的标注。
1 | $ ./bin/calib_camera |
(2) 图片追踪示例
nftSimple 是图像追踪的示例,代码在 examples/nftSimple 目录下,只要在摄像头前移动该图片,三维的小方块就能跟着它移动,且能随之变换三维角度,也就是简单的增强现实效果。它所需要的 Marker 在./examples/ARAppNFTOSG/Markers/pinball.jpg,当然你也可以用工具制作 自己 marker,用程序把 jpg 文件转换成 set 标注。
1 | $ ./bin/nftSimple |
(3) 调试说明
太多东西累加到一起,遇到问题时,难以定位是 opengl, opencv 还是 artoolkit 的问题。上面两个例程在调试的时候,屏幕上的标注和立体效果一开始出不来,看到一些 ioctl 的报错,怀疑是不是摄像头不支持某些功能引起的,后来又在 opencv 的源码里找相似的校正例程,怀疑是摄像头捕捉的图片和 opencv 支持的格式不一致(校正程序只支持 1 通道 8 位灰图),之后又在代码中把捕捉到的每帧图像存成 jpg 找线索。后来发现:需要在拍摄的第一帧中就出现 maker——左手运行程序,右手举着图片,这也同样很奇怪,只能识别第一帧。
最终看代码,AR2VideoBufferT 帧数据有两种 buff,一种是存储的是各通道颜色数据 buff,另一种为亮度数据 buffLuma,我们使用的主要是这个亮度数据,我在两台 ubuntu 笔记本上都遇到同一问题:默认情况下,buffLuma 只在第一帧时更新,之后里面的内容就不变了,修改方法是改其源码 lib/SRC/Video/video2.c,在 ar2VideoGetImage 函数中, 将 "if (!ret->buffLuma)“判断去掉,在任何情况下都重新计算 buffLuma。
5. 参考
(1) 制作 marker 和 NFT
https://www.cnblogs.com/polobymulberry/p/5905912.html
(2) ARToolKit 例程及对应效果
http://www.cnblogs.com/polobymulberry/p/5905680.html
(3) ARToolKit 流程图
http://www.mamicode.com/info-detail-2331367.html
(4) 标准相机