ARToolkit

ARToolkit
ARToolkit

ARToolkit

增强现实互动扩展技术的实践与展望

学院:高等技术学院松江分院

专业:计算机应用技术

学号:07321595

姓名:潘忆芸

指导老师:郁松年老师

二〇一〇年四月

摘要

随着科技的日新月异的发展,增强现实(Augmented Reality,简称AR)再也不是一个不可及的技术。这种使虚拟场景更加真实的互动方式受到越来越多企业的青睐,并且应用在各个领域之中。

增强现实借助计算机图形技术和可视化技术产生现实环境中不存在的虚拟对象,并通过传感技术将虚拟对象准确“放置”在真实环境中,借助显示设备将虚拟对象与真实环境融为一体,并呈现给使用者一个感官效果真实的新环境。因此增强现实系统具有虚实结合、实时交互、三维注册的新特点。

本文介绍了利用ARToolKit实现增强现实技术的过程及其部分的原理,在自己的能力范围内学习并且尝试了AR技术的开发,并对此技术的将来作出一系列分析和展望。

Abstract

With the rapid development of science and technology, Augmented Reality (AR) is no longer an inaccessible technology. This interactive way, which can make virtual scene become much realer , now is more and more popular among the companies. Nowadays, it is being used in various industries.

AR is a term for a live direct or indirect view of a physical real-world environment whose elements are augmented by virtual computer-generated imagery. It is related to a more general concept called mediated reality in which a view of reality is modified (possibly even diminished rather than augmented) by a computer. In the case of Augmented Reality, the augmentation is conventionally in real-time and in semantic context with environmental elements, such as sports scores on TV during a match. With the help of advanced AR technology (e.g. adding computer vision and object recognition) the information about the surrounding real world of the user becomes interactive and digitally usable. Artificial information about the environment and the objects in it can be stored and retrieved as an information layer on top of the real world view.

In this article, I will introduce the process of achieving AR through ARToolKit and its principium. I will try to do some exploitation of AR technology and make some analysis and expectation of it.

目录

摘要 (1)

前言 (3)

1.1 ARToolKit的诞生 (3)

1.2 ARToolKit的简单原理及应用 (3)

1.2.1 简单原理描述 (3)

1.2.2 AR技术的应用 (4)

1.3 AR技术在世界上的现状、水平和发展趋势 (5)

开发环境介绍与导入 (6)

2.1 开发环境以及必要设备介绍 (6)

2.1.1 硬件准备 (6)

2.1.2 软件准备 (6)

2.2 导入ARToolKit (6)

2.3 制作识别标记 (6)

学习熟悉ARToolKit (7)

3.1 学习和熟悉最基本的样本程序 (7)

3.2 分析自身情况 (8)

3.3制定具体开发项目 (9)

开发简单的三维空间绘画程序 (9)

4.2 程序结构分析 (9)

4.2 具体编码编写 (10)

总结与展望 (11)

5.1 开发中学习到的经验与总结 (11)

5.2 对于ARToolKit技术未来的展望 (12)

参考文献 (12)

致谢 (12)

附录 (13)

前言

1.1 ARToolKit的诞生

ARToolKit 它是一个C/C++ 语言编写的库,通过它可以让我们很容易的编写增强现实应用程序。增强现实(AR)是将电脑虚拟的图像覆盖到真实世界画面中,这个技术在工业和理论研究方面都存在着极大的潜能。

ARToolKit原本是加藤博一教授(现奈良先端科学技术大学院大学教授)所开发,现由华盛顿大学的HIT Lab(Human Interface Technology Laboratory),坎特伯雷大学的HIT Lab NZ、ARToolworks.Inc着手进行进一步的研究。

其主要功能是实现真实场景中标志物相对于摄像头位置、方向信息的跟踪,以及完成虚拟物体的实时注册。ARToolKit工具包从跟踪注册的自然属性出发,在虚拟物体、真实环境、摄像机、2D成像平面坐标系空间之间的转换,将虚拟物体注册到真实场景中去,实现虚实无缝结合。

1.2 ARToolKit的简单原理及应用

1.2.1 简单原理描述

ARToolKit的原理是用摄像头读取印刷在纸上的标记,然后在标记上描绘出3D物体。

ARToolKit的系统架构

上图就是ARToolKit的系统架构,其图像捕捉参数(图像捕捉模块)是使用的是内部OS接口。比如Windows系统使用的就是名为DSVideoLib的DirectShow空间中的图像捕捉库文件。

图像的描绘以及假象空间视点的设定(图形处理模块)是使用OpenGL及其辅助的库文件GLUT(OpenGL Utility Toolkit)实现的。此外VRML形式的3DCG表示机能(VRML 描绘模块)使用的是OpenVRML。为了识别出标记的画面处理和标记识别算法(AR计算模块)使用的是标准API。

3DCG的操作(平移,旋转或者扩大缩小等)的参数并不包含在ARToolKit中。程序

员需要使用ARToolKit与OpenGL(或者是GLUT)做成相关应用。

1.2.2 AR技术的应用

利用AR进行游戏

索尼公司在2007年秋发表了应用AR技术的游戏《审判之眼(THE EYE OF JUDGEMENT)》。本作由SONY与Hasbro Inc. 合作推出,游戏时需要使用印有 CyberCode 的卡片与 3X3 的决斗盘,首先利用PLAYSTATION Eye 对准决斗盘,每格内会出现具有属性的地盘,两名对战玩家可依序放置适合的卡片,争取决斗盘的控制权;当卡片放在决斗盘的适当位置时,电视萤幕就会出现对应卡片的立体魔兽,魔兽会有华丽的魔法或者跳跃等动作,玩家只要率先取得九个方格中的任五个就算优胜。

很明显卡片上的CyberCode就类似识别用的标记。下图就是《审判之眼(THE EYE OF JUDGEMENT)》(?Sony Computer Entertainment Inc.)的图片

世上首创电脑手办アリス(ARis)

在08年的10月20日日本发售了号称世界首创的电脑手办アリス(ARis 译:爱丽丝)其中爱丽丝英文名字的AR便是现实增强的简写AR。

从爱丽丝的配件之中就可以发现ARToolKit技术中不可或缺的识别标记。

通过摄像头对识别标记进行图像捕捉,购买者就可以从自己的电脑中看到爱丽丝的身影。

1.3 AR技术在世界上的现状、水平和发展趋势

AR技术还是一个新兴技术,不管是从科学还是商用层面上,这个技术还是处于一个雏形发展的阶段。在07年日本奈良召开的关于显示增强的国际会议ISMAR2007中被评为最优秀论文的【Parallel Tracking and Mapping for Small AR Workspaces】,利用取得风景与自然特征并且利用这些实现了3D的地图,下图为部分图片报道。

增强现实(Augmented Reality,简称AR)是近年来国外众多知名大学和研究机构的研究热点之一,AR技术不仅在与VR技术相类似的应用领域,诸如尖端武器、飞行器的研制与开发、数据模型的可视化、虚拟训练、娱乐与艺术等领域具有广泛的应用,而且

由于其具有能够对真实环境进行增强显示输出的特性,在医疗研究与解剖训练、精密仪器制造和维修、军用飞机导航、工程设计和远程机器人控制等领域,具有比VR技术更加明显的优势。

虽然这个技术只有处于起步阶段,但是AR技术的特性决定了它在今后将是重点被研究开发的一种技术。总有一天会日本动画电脑线圈中的场景将会出现在显示生活中,人们的生活将与AR技术不可分离。

开发环境介绍与导入

2.1 开发环境以及必要设备介绍

2.1.1 硬件准备

首先因为有3DCG相关的计算和显示等等,对于PC本身也有一定的要求,参照ASCII社出版的《ARToolKit扩张现实感编程入门》(译名)一书中的要求CPU的主频应选择2GHz左右,内存1G,显卡的显存大于128MB的情况下进行开发。

USB摄像头也是不可缺少的,关系到摄像头采取的画面清晰度会影响到对于标志的识别情况,所以应该选择相对来说像素比较高的摄像头。

2.1.2 软件准备

ARToolkit使用C/C++语言编写,可以使用Visual C++ v6.0或者2008作为开发平台。本次毕业设计中使用的开发环境是Visual C++ 2008 Express Edition。此外还需去ARToolKit官网下载ARToolKit文件与支持WIN32的GLUT文件。

2.2 导入ARToolKit

具体方法如下:

一、安装GLUT:

1、将下载的GLUT文件中的glut32.dll文件放入文件夹C:\windows\system32。

2、将glut.h放入开发环境的include\GL文件夹中,glut32.lib放入Lib文件夹中。

二、导入ARToolKit:

1、从VC++2008中添加VC目录的包含文件,需要添加的目录为所下载的ARToolKit文件夹中的OpenVRML\dependencies\include、OpenVRML\include以及include文件夹。

2、添加VC目录的库文件,方法同1。所需要添加的文件为OpenVRML\dependencies\lib、OpenVRML\lib以及lib文件夹。

2.3 制作识别标记

识别标记是ARToolKit中必不可少的,在此系统中识别标记规则为正方形粗黑框中间添加黑白或者彩色图案均可,在黑框外侧有部分白色留空最佳。只要满足这些条件不

管是用绘图工具绘制后打印的或者是在纸上直接用记号笔手绘的均可以作为识别标记。需要注意的是中间的设计如果过于复杂可能会影响识别效果。

左图为资料中的一个常用识别标记,

Hiro便是作者的名字拼写。

设计打印完成识别标记之后便是将标记制成标记文件。利用ARToolKit中的工具给标记起名之后启动摄像头,使其识别并且生成patt.XXX(XXX为标记的名称)的文件,将文件放入bin\Data文件夹中,标记就制作完成了。

学习熟悉ARToolKit

3.1 学习和熟悉最基本的样本程序

因为ARToolKit对于我来说除了开发环境使用C/C++语言之外全部都是陌生的,所以首先的任务是要学习并且熟悉ARToolKit的代码。我选择了最简单的一个样本程序(见附1)作为学习和熟悉的对象。首先我先运行了这个程序,首先从主观上了解这个程序想要完成的是一件怎么样的任务。

左图为实际的运行之后的效果。

从这张图上可以看出的确是一个非常简

单的程序。它完成的任务在目前我观察

的到的情况下是2个。第一个是识别出

这个Hiro标志,第二个则是在识别出的

标志上画出一个绿色的正方体。

接下来就应该对照着程序的代码找出实现这2个功能的语句,并弄清楚其中的语法规则和其他扩展使用的方法,为之后自己的实践开发打好基础。因为样本程序是从日本的ARToolKit网站上下载的,大部分语句旁边都有日语的注释,这个对于我的理解有很大的帮助。

首先在main函数之前有#include语句,定义的全程变量与几个void函数的声明。其中#include语句应该是在今后开发中不会更换的,所以不需要花很多时间去了解这些头文件。其中可以看到GL和AR等单词,我想应该就是在准备开发环境时候下载的GLUT 与ARToolKit文件中的组件吧。接下来看到的是几个全程变量,前3个是字符型的变量,根据注释来看是摄像头还有识别标记的文件名字,应该是在程序运行的时候需要用到的几个文件。标记的文件名应该就是对应着当前程序需要识别的标记。之后的int和double还有void函数在语句上都可以理解,并且这些应该是在今后开发中不需要太大修改的。

接下来是main函数部分,经过阅读代码之后,发现上述2个功能也并没有在main 函数中实现。根据现有的注释main函数的任务是判断摄像头,标记是否正常工作,当所有组件都正常工作之后开始通过摄像头捕捉画面。

第三部分是mainloop函数,根据注释可以知道mainloop函数的主要功能是是检测出标志并且进行对比,当前画面中的标记是否是当前程序需要的。其中的for语句就知道比较方法是利用循环将所捕捉的标记和所有库中存在的标记进行对比。如果在库中找到了当前程序的目标识别标记就进行3D物体的描绘。当然在其中还发现一个语句是这样的:argDrawMode2D(); argDispImage(image,0,0);这2句语句其实说明了除了可以描绘3D图像以外还可以进行2D绘画与显示图片。

第四部分是DrawObject函数,在前几句注释上所写的3D物体描绘前的准备与行列变换的语句我并不理解其中的具体原理,但是有一点是肯定的,在今后的开发过程中,这几句语句并不需要去做修改。因为是最简单的样本程序,绘制这个绿色正方体的语句非常简单,从语句的英文的上就能知道4句语句的意思了,分别是位置,颜色,线条粗细和正方体的大小。感觉绘制图像的语句和学习VC++时候的语句有些相似,既然有正方体的语句,必然有其他绘制点,线,面和球体的语句。这些将在之后的时间开发中有着巨大的作用。

最后的部分是事件处理函数,包括了KeyEvent与MouseEvent,在之后开发过程中如果有需要的情况下还可以通过鼠标和键盘进行互动。

3.2 分析自身情况

因为ARToolKit在事件处理等地方需要使用到C语言的知识,在3DCG操作时候则需要有一定OpenGL的知识。并且2种知识需要互相配合才能做出一个完整的作品,缺一不可。

C语言方面在学校的学习和实训的实践中的确是积累的一点经验,对于编程也不陌生。并且在有相关资料的情况下,我相信可以靠自己编出简单的程序应该不是一个很难的任务。虽然目前只能算是熟悉了较简单的程序,但是经过一段时间的联系和时间之下C语言应该不会成为这次毕业设计的难点。当然选择这个题目作为毕业设计的一部分原因也是ARToolKit需要使用到C/C++语言。

但是另外一方面,OpenGL对于我来说是一个完全陌生的领域,无论是在学校的学习

中,还是在课外的兴趣方面,都完全没有接触到过OpenGL。即使ARToolKit可以使用第三方软件绘画的3DCG,但是这个也是我心有余而力不足的方面。

所以在选择具体想要尝试开发的题目时候应该尽量的取长补短,将自己OpenGL方便的不足降到最低。

3.3制定具体开发项目

第一考虑到OpenGL方面知识不足的弱点,所以决定在3DCG绘制的方面尽可能的使用简单的图形。其实也可以选择用网上共享的3D图形但是毕竟在考虑到之后的互动等功能时候可能有局限性,所以不作为考虑的对象。

第二是想要充分体现出ARToolKit的增强现实互动扩展的特性,就是给人一种能与虚拟互动的特点,所以想尽量选择以互动为主的项目。

综合这2点,我想到的项目便是三维空间绘画。这个想法是从VC++的学习中得到的启发,当时也是在学VC++如果绘图,在鼠标经过的轨迹上绘制一个点。这个就是当时编程的主要思想。如果将这个思想扩展的三维空间中其实也是相同的并且在3D绘制方面的工作就简单了许多,在经过的轨迹上绘制一个球体。当然根据距离和角度将会有一个立体的效果,使绘画者有一种身临其境的感觉,画布就是身边的这个三维空间。在绘制完毕之后也可以旋转识别标记或者改变摄像角度360度的观赏到所绘制的作品。

开发简单的三维空间绘画程序

4.2 程序结构分析

首先在正式开始编程之前,需要先整理清楚三维空间绘画程序所需要实现的功能。并且落实这些功能是在那些函数中实现的,这样在编程的过程之中就会少走弯路。也可以在调试时候减少错误的发生。

三维空间绘画程序构想中的工作原理是这样的:首先让摄像头识别主识别标记,找到主识别标记之后进入绘画模式,然后使用比较小的表示作为绘画识别标记,也就是画笔。绘画标记有多个,分别是有变化画笔颜色与清空画板2种功能。当识别到颜色画笔时候就在标记的位置绘制一个圆球体,如果识别到清除标记就删除画面上所有的球体。

虽然功能看起来并不多,但确实对我是一个很大的挑战。首先能知道的是与绘图相关的功能是在DrawObject函数之中,而标志的识别是在Mainloop函数之中。2个函数之间有点的个数与颜色这2个数据是需要共享的,所以需要有静态变量。同时参照资料上的方法,在识别复数标记时2个标记有其分别的矩阵数据和标记的尺寸,所谓的摄像头坐标系的行列变换这样一来也是需要变换2次了,分别是绘画时候一次与显示图像一次。

总体来说这个程序与那个最初最简单的程序虽然大致结构类似,但是自己分析之后感觉到许多细节都是有许多不同的,实际在编程时候遇到的困难只有在实践和通过阅读更多的程序来解决了。

4.2 具体编码编写

编程时想要尽可能利用样本程序,所以程序编写顺序也和之前的分析是相同的顺序,在样本程序的基础上进行适当的添加、删除和修改。

首先是头文件上因为这次的程序比较简单,所以在定义点的结构时候除了必须的行列式变换之外只有颜色一个信息。具体的点数限制就想用定义的DOTINFO类型创建一个数组,数组中存放着每个点的颜色和行列式的信息。因为在DrawObject时候以及不单单是简单的图形了,所以在函数里面添加了参数。一个是int型的用来传递点的个数,另外一个则是描绘坐标的行列矩阵。

Main函数中我并没有做什么特别的修改,因为都主要是摄像头等的一些判断,所以只修改了一个窗口的名称就算完成了。

MainLoop函数个人感觉是最难的一部分,前半的部分是按照原来的样本程序,在判断标记的时候我使用了一个switch语句,比如在红色标记时候就设定颜色为红色然后使用break语句,并且在进入DrawObject前使用一次dotNum++语句,使每一个被描绘的点都正确的计数。

DrawObject函数中使用for语句来描绘每一个点。绘画多个3D物体更具参考资料上写的,需要使用glPushMatrix()与glPopMatrix()语句。于是我就依样画葫芦的在画点之前添加Push,画完之后添加Pop。

完成最初的编写之后进行编译,第一次编译非常顺利,除了一些因为粗心而造成的语句报错以外没有其他大的错误,并且在修正之后都通过了。但是运行的情况和想象中的不一样。运行状况如下图:

将蓝色绘画标记进行识别之后主标识上就是蓝色,红色则是红点,绿色就是绿点。这个说明我没有将主标记和绘画标记的模式进行转换,只是进行了识别而已。

于是去寻找相关资料上关于判断复数标记并且进行转换使用的例子。一开始是想到绘制原点是要在绘画标记为基础上绘画的,应该是在DrawObject函数上缺少了语句。经过检查之后发现时是发现绘画点的时候因为没有添加相关语句所以绘制在了主标记上。但是添加之后所有的标记上都没有图案,这个是说明绘画标记并没有东西可绘制。以此类推想到既然DrawObject函数上有相关主标记和绘画标记相关的语句,那MainLoop上也应该需要类似的语句。

资料上有一个所谓的逆行列计算的公式,而上面的解释和功能似乎是我想要的。arUtilMatInv( 1 , 2 );arUtilMatMul( 3, 4, 5 );这2句就是转换时候用的公式,但是应该在哪里使用,参数应该怎么写我不是特别了解。

这个时候我采用了一个比较简单的办法进行这2句语句的测试,就是穷举法。从资料上的解释上可以知道2个参数应该填写什么,那就是1和5。1应该填写的是原始标记的行列式,5应该填写目标标记的行列式。根据公式5=3*4,所以2和3或者4应该是相同的,就是中间用于转换的一个3*4的行列式,剩下的4就填上了绘画标记的行列式,完成小错误的修正之后再次进行了测试。

基本的功能是完成了,具体的测试结果为下图:

总结与展望

5.1 开发中学习到的经验与总结

因为事先准备好了ARToolKit的资料,所以不管是从学习还是到开发整个过程都是属于比较顺利的。但是还是暴露了不少的问题,是应该在今后需要改善的。

首先是对于OpenGL知识的缺乏,还是就是对于陌生语言自学能力不足的问题。在学习ARToolKit的知识时就得知了是需要使用到OpenGL的相关知识,也去尝试着学习OpenGL,但是由于时间以及其他因素,到最终掌握的只是非常基础的一部分知识,同时也使所实践开发的程序也受到了限制。虽然客观因素不能完全排除,但是我自己认为自身对于新语言的自学能力还是非常不足的,离开了课堂与老师的教授方式感觉对于新语言的接受能力下降了很多,但是面对未来的工作,这个是我必须努力去克服和解决的。

其次就是开发过程中因为语言和资料的限制,能够找到和接触到的范例程序太少,

并没有真正理解ARToolKit的原理。我是有一定的日语能力并且ARToolKit也诞生在日本,但是更多研究成果与范例程序都是有在以英语为主要语言的网站上,这个对于更进一步的学习ARToolKit也有一定的阻碍。这个也是这次毕业设计中的一个遗憾,使开发的程序受到了一定的限制。

另一个方面,这次的毕业设计让我学到了很多。不仅仅是ARToolKit一种技术而言,而是开发与图形相关程序时候的思维方法,这种思维方法一定在今后对我也会有所帮助的。

5.2 对于ARToolKit技术未来的展望

目前ARToolKit只是一个刚刚起步的技术,许多使用它的人只是使用其演示一些3D的物体,使人们有更加直观的感受。但是随着这个技术的成熟一定会有越来越多的地方使用到这个技术。试想将来只要有一双特殊的眼镜,书本将不再是平面的,而是由画面配合读者更好的理解。例如我这次尝试的三维空间绘图,经过完善和添加功能之后将产生一种全新的艺术形式。

ARToolKit技术将活跃在医疗、军事、教育、娱乐、旅游等多个领域。其价值在今后是非常大的。

参考文献

1、ISBN-10: 4048673610,《3Dキャラクターが現実世界に誕生! ARToolKit拡張現実感プログラミング入門》,橋本直,アスキー?メディアワークス(2008/9/17)

致谢

能够完成这篇报告我要感谢指导老师郁老师给予我的指导,以及对于我选择这个题目时候给予我的支持与鼓励。

附录

1、样本程序的代码

/*--------------------------------------------------------------------------- マーカ「Hiro」を認識してワ?ヤフレームの立方体を表示させるプログラム

---------------------------------------------------------------------------*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

// グローバル変数

char *vconf_name = "Data/WDM_camera_flipV.xml"; // ビデオデバ?スの設定フ??ル

char *cparam_name = "Data/camera_para.dat"; // カメラパラメータフ??ルchar *patt_name = "Data/patt.hiro"; // パターンフ??ル

int patt_id; // パターンのID

double patt_trans[3][4]; // 座標変換行列

double patt_center[2] = { 0.0, 0.0 }; // パターンの中心座標

double patt_width = 80.0; // パターンのサ?ズ(単位:mm)

int thresh = 100; // 2値化の閾値

// プロトタ?プ宣言

void MainLoop(void);

void DrawObject(void);

void MouseEvent(int button, int state, int x, int y);

void KeyEvent(unsigned char key, int x, int y);

void Cleanup(void);

//===========================================================================

// main関数

//=========================================================================== int main( int argc, char **argv )

{

ARParam cparam; // カメラパラメータ

ARParam wparam; // カメラパラメータ(作業用変数)

int xsize, ysize; // 画像サ?ズ

// GLUTの初期化

glutInit( &argc, argv );

// ビデオデバ?スの設定

if ( arVideoOpen( vconf_name ) < 0 ) {

printf("ビデオデバ?スのエラー");

return -1;

}

// カメラパラメータの設定

if ( arVideoInqSize( &xsize, &ysize ) < 0 ) {

printf("画像サ?ズを取得できませんでした\n");

return -1;

}

if ( arParamLoad( cparam_name, 1, &wparam ) < 0 ) {

printf("カメラパラメータの読み込みに失敗しました\n");

return -1;

}

arParamChangeSize( &wparam, xsize, ysize, &cparam );

arInitCparam( &cparam );

// パターンフ??ルのロード

if ( (patt_id = arLoadPatt(patt_name)) < 0 ) {

printf("パターンフ??ルの読み込みに失敗しました\n");

return -1;

}

// ウ?ンドウの設定

argInit( &cparam, 1.0, 0, 0, 0, 0 );

// ビデオキャプチャの開始

arVideoCapStart();

// メ?ンループの開始

argMainLoop( MouseEvent, KeyEvent, MainLoop );

return 0;

}

//=========================================================================== // メ?ンループ関数

//=========================================================================== void MainLoop(void)

{

ARUint8 *image;

ARMarkerInfo *marker_info;

int marker_num;

int j, k;

// カメラ画像の取得

if ( (image = arVideoGetImage()) == NULL ) {

arUtilSleep( 2 );

return;

}

// カメラ画像の描画

argDrawMode2D();

argDispImage( image, 0, 0 );

// マーカの検出と認識

if ( arDetectMarker( image, thresh, &marker_info, &marker_num ) < 0 ) { Cleanup();

exit(0);

}

// 次の画像のキャプチャ指示

arVideoCapNext();

// マーカの信頼度の比較

k = -1;

for( j = 0; j < marker_num; j++ ) {

if ( patt_id == marker_info[j].id ) {

if ( k == -1 ) k = j;

else if ( marker_info[k].cf < marker_info[j].cf ) k = j;

}

}

if ( k != -1 ) {

// マーカの位置?姿勢(座標変換行列)の計算

arGetTransMat( &marker_info[k], patt_center, patt_width, patt_trans );

// 3Dオブジェクトの描画

DrawObject();

}

// バッフ?の内容を画面に表示

argSwapBuffers();

}

//=========================================================================== // 3Dオブジェクトの描画を行う関数

//=========================================================================== void DrawObject(void)

{

double gl_para[16];

// 3Dオブジェクトを描画するための準備

argDrawMode3D();

argDraw3dCamera( 0, 0 );

// 座標変換行列の適用

argConvGlpara( patt_trans, gl_para );

glMatrixMode( GL_MODELVIEW );

glLoadMatrixd( gl_para );

// 3Dオブジェクトの描画

glTranslatef( 0.0, 0.0, 20.0 );

glColor3f( 0.0, 1.0, 0.0 );

glLineWidth( 3.0 );

glutWireCube( 40.0 );

}

//=========================================================================== // マウス入力処理関数

//=========================================================================== void MouseEvent(int button, int state, int x, int y)

{

// 入力状態を表示

printf("ボタン:%d 状態:%d 座標:(x,y)=(%d,%d) \n", button, state, x, y);

}

//=========================================================================== // キーボード入力処理関数

//=========================================================================== void KeyEvent( unsigned char key, int x, int y)

{

// ESCキーを入力したら?プリケーション終了

if ( key == 0x1b ) {

Cleanup();

exit(0);

}

}

//=========================================================================== // 終了処理関数

//=========================================================================== void Cleanup(void)

{

arVideoCapStop(); // ビデオキャプチャの停止

arVideoClose(); // ビデオデバ?スの終了

argCleanup(); // グラフ?ック処理の終了

}

2、简单三维空间绘画程序代码

#include

#include

#include

#include

#include

#include

#include

#include

#include

//最大的点数

#define MAX_DOT 10000

// 标记总数

#define N_PATT 5

// 标记编号

#define PATT_PAINT 0

#define PATT_ERASE 1

#define PATT_R 2

#define PATT_G 3

#define PATT_B 4

typedef enum { COLOR_R, COLOR_G, COLOR_B } COLOR;

// 定义点的类型

typedef struct {

COLOR color; // 颜色

double Trm[3][4]; // 行列变换

} DOTINFO;

char *g_vconfName = "Data/WDM_camera_flipV.xml";

char *g_cparamName = "Data/camera_para.dat";

char *g_pattName[N_PATT] = { "Data/patt.paint", // 0

"Data/patt.erase", // 1

"Data/patt.R", // 2

"Data/patt.G", // 3

"Data/patt.B" // 4

};

DOTINFO g_dot[MAX_DOT]; // 点的情况static int dotNum = 0; // 点的计数器

int g_pattID[N_PATT]; // 标记ID

double g_pattCenter[2] = { 0.0, 0.0 }; // 标记中心坐标

double g_WidthDraw = 45.0; // 绘图标记尺寸double g_WidthPaint = 90.0; // 主标记尺寸

double g_thresh = 100;

void MainLoop( void );

void DrawObject( double trans_paint[3][4], int dotNum );

void KeyEvent( unsigned char key, int x, int y);

void Cleanup( void );

int main( int argc, char **argv )

{

ARParam cparam;

ARParam wparam;

int width, height;

int i;

// GLUT初始化

glutInit( &argc, argv );

if ( arVideoOpen( g_vconfName ) < 0 ) {

printf("摄像头驱动错误");

return -1;

}

if ( arVideoInqSize( &width, &height ) < 0 ) {

printf("没有取得图像大小\n");

return -1;

}

if ( arParamLoad( g_cparamName, 1, &wparam ) < 0 ) { printf("摄像头读取失败\n");

return -1;

}

arParamChangeSize( &wparam, width, height, &cparam );

arInitCparam( &cparam );

for ( i=0; i

if ( ( g_pattID[i] = arLoadPatt( g_pattName[i] ) ) < 0 ) { printf("识别标记读取失败\n");

return -1;

}

}

// 窗口设定

argInit( &cparam, 1.0, 0, 0, 0, 0 );

// ウィンドウのタイトル

相关主题
相关文档
最新文档