被玩坏的现实

mikel阅读(809)

从虚拟现实VR的眼镜大卖,到各种眼镜的众筹,没有人再深入的优化硬件和软件的VR产品,各个都是想着钱。

于是乌烟瘴气的互联网彻底带坏了VR的世界。

[转载]Android开发之反编译代码和防止反编译 - superGao - 博客园

mikel阅读(888)

来源: [转载]Android开发之反编译代码和防止反编译 – superGao – 博客园

一、反编译apk文件

安装ApkTool工具,该工具可以解码得到资源文件,但不能得到Java源文件。
安装环境:需要安装JRE1.6
1> 到http://code.google.com/p/Android-apktool/
下载apktool1.3.2.tar.bz2 和apktool-install-windows-2.2_r01-3.tar.bz2 文件。
解压两个文件,然后把解压后的文件放在一起,如:c:\apktool
2> 在系统变量PATH中添加进aapt.exe,如:;c:\apktool\aapt.exe
3> 在DOS窗口下进入apktool.jar所在目录。
执行DOS命令:apktool d -s c:\soft\xxx.apk c:\soft\source。
命令格式:apktool d [opts] <file.apk> [dir]  中的d代表解码,[opts]代表选项,-s选项代表不解码源文件。

2、Apktool工具只能反编译成smali的中间代码文件,这里需要借助另外一个开源工具Dex2Jar,
该工具可以把dex文件转换成jar文件。这个工具不能直接翻译成java文件,但是可以把dex文件转换成jar文件
下载地址:http://code.google.com/p/dex2jar/
1> 把APK安装包中的classes.dex解压到某个目录下,如:c:\soft
2> 在DOS窗口下进入dex2jar.bat所在目录,执行DOS命令:dex2jar.bat c:\soft\source\classes.dex c:\soft\source,命令生成classes.dex.dex2jar.jar文件。

3、安装jd-gui工具,该工具可以把jar文件反编译成Java源文件
下载地址:http://java.decompiler.free.fr/jd-gui/downloads/jd-gui-0.3.3.windows.zip。
运行该软件,直接打开classes.dex.dex2jar.jar文件即可看到java源代码。

总结:
apktool1.4.1.tar.bz2       反编译工具的jar包
apktool-install-windows-r04-brut1.tar.bz2   windows下调用执行jar 的exe文件

1、 解压这两个文件,将apktool1.4.1中的apktool.jar拷贝到apktool-install-windows-r04-brut1目录下,此时文件有:

红色的为待反编译的apk文件

cmd切换到该目录,执行:
> apktool d -s queryNumber.apk  ./source 在当前目录生成source目录,下面放着资源文件

2、解压dex2jar-0.0.7.11-SNAPSHOT.zip将classes.dex拷贝该目录,执行:
> dex2jar class.dex
生成classes_dex2jar.jar文件

里面全是.class文件

3、打开jd-gui.exe,将classes_dex2jar.jar拖拽到jd-gui界面
此时可以看到所有的源文件:

 

 

如何防止反编译。。。。

由于apk是Android虚拟机加载的,它有一定的规范,加密apk后Dalvik无法识别apk了。
完全避免是不可能的,总有人能够破解你的代码。但是有几种方式来提高被反编译取代码的难度。

1 关键代码使用jni调用本地代码,用c或者c++编写,因此相对比较难于反编译

2 混淆java代码。混淆是不改变代码逻辑的情况下,增加无用代码,或者重命名,使反编译后的源代码难于看懂。
网上开源的java代码混淆工具较多,一般是用ant的方式来编译的

技术能走多远

mikel阅读(1891)

技术无极限,能走多远全看人,大家都在研究新的技术和产品,都在将梦想变为现实。

可真正能够做到的很少,都是在不断的摸索中前进,不断的迭代迭代的开发原型,然后才能商用。

技术改变生活,不是一句空话。

世界会因你改变!

[转载]IOS Vuforia SDK学习笔记 - 安钲熙 - 博客园

mikel阅读(930)

来源: [转载]IOS Vuforia SDK学习笔记 – 安钲熙 – 博客园

最近可能工作会用到关于AR方面的东西 所以找了一下有名气的AR库 发现2个:Metaio和Vuforia

先说说Metaio 我看了看网上的反应 好像这个库反响不错 用的人蛮多的。但是悲催的是 我7月1号去看的时候已经无法注册新用户了。没办法用 因为它被苹果收购了,也不知道该高兴还是该忧伤  好像目前是没办法用了。只好找了别的,比如:Vuforia

Vuforia是个啥?

Vuforia™ 是Qualcomm Connected Experiences, Inc.的产品。它是一款针对移动设备开发增强现实应用的开发工具。它具有跨平台特性,支持iOS和Android,同时还支持Unity3D扩展插件。 开发者除了可以在原生的开发环境下制作AR增强现实应用,更可以使用主流的移动游戏引擎Unity3D来简单的实现跨平台开发。

如何使用?

先到官网下载SDK 这里我们选择的是IOS的SDK:https://developer.vuforia.com/downloads/sdk

旁边就可以下载sample:https://developer.vuforia.com/downloads/samples

这里要注意一下 要想运行官方demo 我们要先把下载好的sample拷贝至sdk目录下的sample文件夹下 应该是这个样子:

否则直接运行sample会报错。或者你也可以自己修改demo中Build Settings ->Search Paths ->Header Search Paths/Library Search Paths.

然后你要申请一个 license keys才可以使用:https://developer.vuforia.com/license-manager

将申请到的 license keys添加到项目中的SampleApplicationSession.mm中的 QCAR::setInitParameters(mQCARInitFlags,”你的 license keys”);

然后你就可以开心的运行项目 选择Image Targets 识别一下官方图片(http://developer.vuforia.com/sites/default/files/sample-apps /targets/imagetargets_targets.pdf),就可以看到茶壶出现在手机屏幕上了 还是挺好玩的吧?快来试试。

SIFT算法详解

mikel阅读(1040)

尺度不变特征变换匹配算法详解
Scale Invariant Feature Transform(SIFT)
Just For Fun

zdd  zddmail@gmail.com or (zddhub@gmail.com)

对于初学者,从David G.Lowe的论文到实现,有许多鸿沟,本文帮你跨越。

如果你学习SIFI得目的是为了做检索,也许OpenSSE更适合你,欢迎使用。

1、SIFT综述

尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。

其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。

此算法有其专利,专利拥有者为英属哥伦比亚大学。

局部影像特征的描述与侦测可以帮助辨识物体,SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。

SIFT算法的特点有:

1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;

2. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;

3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;

4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;

5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。

SIFT算法可以解决的问题:

目标的自身状态、场景所处的环境和成像器材的成像特性等因素影响图像配准/目标识别跟踪的性能。而SIFT算法在一定程度上可解决:

1. 目标的旋转、缩放、平移(RST)

2. 图像仿射/投影变换(视点viewpoint)

3. 光照影响(illumination)

4. 目标遮挡(occlusion)

5. 杂物场景(clutter)

6. 噪声

SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

Lowe将SIFT算法分解为如下四步:

1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。

2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。

3. 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。

4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

本文沿着Lowe的步骤,参考Rob Hess及Andrea Vedaldi源码,详解SIFT算法的实现过程。

2、高斯模糊

SIFT算法是在不同的尺度空间上查找关键点,而尺度空间的获取需要使用高斯模糊来实现,Lindeberg等人已证明高斯卷积核是实现尺度变换的唯一变换核,并且是唯一的线性核。本节先介绍高斯模糊算法。

2.1二维高斯函数

高斯模糊是一种图像滤波器,它使用正态分布(高斯函数)计算模糊模板,并使用该模板与原图像做卷积运算,达到模糊图像的目的。

N维空间正态分布方程为:

(1-1)

其中,是正态分布的标准差,值越大,图像越模糊(平滑)。r为模糊半径,模糊半径是指模板元素到模板中心的距离。如二维模板大小为m*n,则模板上的元素(x,y)对应的高斯计算公式为:

(1-2)

在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆,如图2.1所示。分布不为零的像素组成的卷积矩阵与原始图像做变 换。每个像素的值都是周围相邻像素值的加权平均。原始像素的值有最大的高斯分布值,所以有最大的权重,相邻像素随着距离原始像素越来越远,其权重也越来越 小。这样进行模糊处理比其它的均衡模糊滤波器更高地保留了边缘效果。

理论上来讲,图像中每点的分布都不为零,这也就是说每个像素的计算都需要包含整幅图像。在实际应用中,在计算高斯函数的离散近似时,在大概3σ距离之外的像素都可以看作不起作用,这些像素的计算也就可以忽略。通常,图像处理程序只需要计算的矩阵就可以保证相关像素影响。

2.2 图像的二维高斯模糊

根据σ的值,计算出高斯模板矩阵的大小(),使用公式(1-2)计算高斯模板矩阵的值,与原图像做卷积,即可获得原图像的平滑(高斯模糊)图像。为了确保模板矩阵中的元素在[0,1]之间,需将模板矩阵归一化。5*5的高斯模板如表2.1所示。


下图是5*5的高斯模板卷积计算示意图。高斯模板是中心对称的。

2.3分离高斯模糊

如图2.3所示,使用二维的高斯模板达到了模糊图像的目的,但是会因模板矩阵的关系而造成边缘图像缺失(2.3 b,c),越大,缺失像素越多,丢弃模板会造成黑边(2.3 d)。更重要的是当变大时,高斯模板(高斯核)和卷积运算量将大幅度提高。根据高斯函数的可分离性,可对二维高斯模糊函数进行改进。

高斯函数的可分离性是指使用二维矩阵变换得到的效果也可以通过在水平方向进行一维高斯矩阵变换加上竖直方向的一维高斯矩阵变换得到。从计算的角度来看,这是一项有用的特性,因为这样只需要次计算,而二维不可分的矩阵则需要次计算,其中,m,n为高斯矩阵的维数,M,N为二维图像的维数。

另外,两次一维的高斯卷积将消除二维高斯矩阵所产生的边缘。(关于消除边缘的论述如下图2.4所示, 对用模板矩阵超出边界的部分——虚线框,将不做卷积计算。如图2.4中x方向的第一个模板1*5,将退化成1*3的模板,只在图像之内的部分做卷积。)

附录1是用opencv2.2实现的二维高斯模糊和分离高斯模糊。表2.2为上述两种方法和opencv2.3开源库实现的高斯模糊程序的比较。


3、尺度空间极值检测

尺度空间使用高斯金字塔表示。Tony Lindeberg指出尺度规范化的LoG(Laplacion of Gaussian)算子具有真正的尺度不变性,Lowe使用高斯差分金字塔近似LoG算子,在尺度空间检测稳定的关键点。

3.1 尺度空间理论

尺度空间(scale space)思想最早是由Iijima于1962年提出的,后经witkin和Koenderink等人的推广逐渐得到关注,在计算机视觉邻域使用广泛。

尺度空间理论的基本思想是:在图像信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度参数获得多尺度下的尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测和不同分辨率上的特征提取等。

尺度空间方法将传统的单尺度图像信息处理技术纳入尺度不断变化的动态分析框架中,更容易获取图像的本质特征。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。

尺度空间满足视觉不变性。该不变性的视觉解释如下:当我们用眼睛观察物体时,一方面当物体所处背景的光照条件变化时,视网膜感知图像的亮度水平和对 比度是不同的,因此要求尺度空间算子对图像的分析不受图像的灰度水平和对比度变化的影响,即满足灰度不变性和对比度不变性。另一方面,相对于某一固定坐标 系,当观察者和物体之间的相对位置变化时,视网膜所感知的图像的位置、大小、角度和形状是不同的,因此要求尺度空间算子对图像的分析和图像的位置、大小、 角度以及仿射变换无关,即满足平移不变性、尺度不变性、欧几里德不变性以及仿射不变性。

3.2 尺度空间的表示

一个图像的尺度空间,定义为一个变化尺度的高斯函数与原图像的卷积。

(3-1)

其中,*表示卷积运算,

(3-2)

与公式(1-2)相同,m,n表示高斯模板的维度(由确定)。(x, y)代表图像的像素位置。是尺度空间因子,值越小表示图像被平滑的越少,相应的尺度也就越小。大尺度对应于图像的概貌特征,小尺度对应于图像的细节特征。

3.3 高斯金字塔的构建

尺度空间在实现时使用高斯金字塔表示,高斯金字塔的构建分为两部分:

1. 对图像做不同尺度的高斯模糊;

2. 对图像做降采样(隔点采样)。

图像的金字塔模型是指,将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。原图像为金子塔的第一层,每次降采样所得到的新图像为金字塔的一层(每层一张图像),每个金字塔共n层。金字塔的层数根据图像的原始大小和塔顶图像的大小共同决定,其计算公式如下:

(3-3)

其中M,N为原图像的大小,t为塔顶图像的最小维数的对数值。如,对于大小为512*512的图像,金字塔上各层图像的大小如表3.1所示,当塔顶图像为4*4时,n=7,当塔顶图像为2*2时,n=8。

为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。如图3.1所示,将图像金字塔每层的一张图像使用不同参数做高斯 模糊,使得金字塔的每层含有多张高斯模糊图像,将金字塔每层多张图像合称为一组(Octave),金字塔每层只有一组图像,组数和金字塔层数相等,使用公 式(3-3)计算,每组含有多张(也叫层Interval)图像。另外,降采样时,高斯金字塔上一组图像的初始图像(底层图像)是由前一组图像的倒数第三 张图像隔点采样得到的。

注:由于组内的多张图像按层次叠放,因此组内的多张图像也称做多层,为避免与金字塔层的概念混淆,本文以下内容中,若不特别说明是金字塔层数,层一般指组内各层图像。

注:如3.4节所示,为了在每组中检测S个尺度的极值点,则DOG金字塔每组需S+2层图像,而DOG金字塔由高斯金字塔相邻两层相减得到,则高斯金字塔每组需S+3层图像,实际计算时S在3到5之间。取S=3时,假定高斯金字塔存储索引如下:

第0组(即第-1组):  0 1  2  3  4   5

第1组:            6 7  8  9  10 11

第2组:            ?

则第2组第一张图片根据第一组中索引为9的图片降采样得到,其它类似。

 

3.4 高斯差分金字塔

2002年Mikolajczyk在详细的实验比较中发现尺度归一化的高斯拉普拉斯函数的极大值和极小值同其它的特征提取函数,例如:梯度,Hessian或Harris角特征比较,能够产生最稳定的图像特征。

而Lindeberg早在1994年就发现高斯差分函数(Difference of Gaussian ,简称DOG算子)与尺度归一化的高斯拉普拉斯函数非常近似。其中的关系可以从如下公式推导得到:

利用差分近似代替微分,则有:

因此有

其中k-1是个常数,并不影响极值点位置的求取。

如图3.2所示,红色曲线表示的是高斯差分算子,而蓝色曲线表示的是高斯拉普拉斯算子。Lowe使用更高效的高斯差分算子代替拉普拉斯算子进行极值检测,如下:

(3-4)

在实际计算时,使用高斯金字塔每组中相邻上下两层图像相减,得到高斯差分图像,如图3.3所示,进行极值检测。

3.5 空间极值点检测(关键点的初步探查)

关键点是由DOG空间的局部极值点组成的,关键点的初步探查是通过同一组内各DoG相邻两层图像之间比较完成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图3.4所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

由于要在相邻尺度进行比较,如图3.3右侧每组含4层的高斯差分金子塔,只能在中间两层中进行两个尺度的极值点检测,其它尺度则只能在不同组中进行。为了在每组中检测S个尺度的极值点,则DOG金字塔每组需S+2层图像,而DOG金字塔由高斯金字塔相邻两层相减得到,则高斯金字塔每组需S+3层图像,实际计算时S在3到5之间。

当然这样产生的极值点并不全都是稳定的特征点,因为某些极值点响应较弱,而且DOG算子会产生较强的边缘响应。

3.6 构建尺度空间需确定的参数

—尺度空间坐标

O—组(octave)数

S— 组内层数

在上述尺度空间中,O和S,的关系如下:

(3-5)

其中是基准层尺度,o为组octave的索引,s为组内层的索引。关键点的尺度坐标就是按关键点所在的组和组内的层,利用公式(3-5)计算而来。

在最开始建立高斯金字塔时,要预先模糊输入图像来作为第0个组的第0层的图像,这时相当于丢弃了最高的空域的采样率。因此通常的做法是先将图像的尺度扩大一倍来生成第-1组。我们假定初始的输入图像为了抗击混淆现象,已经对其进行的高斯模糊,如果输入图像的尺寸用双线性插值扩大一倍,那么相当于

取式(3-4)中的k为组内总层数的倒数,即

 (3-6)

在构建高斯金字塔时,组内每层的尺度坐标按如下公式计算:

(3-7)

其中初始尺度,lowe取,s为组内的层索引,不同组相同层的组内尺度坐标相同。组内下一层图像是由前一层图像按进行高斯模糊所得。式(3-7)用于一次生成组内不同尺度的高斯图像,而在计算组内某一层图像的尺度时,直接使用如下公式进行计算:

(3-8)

该组内尺度在方向分配和特征描述时确定采样窗口的大小。

由上,式(3-4)可记为

(3-9)

图3.5为构建DOG金字塔的示意图,原图采用128*128的jobs图像,扩大一倍后构建金字塔。

4、关键点定位

以上方法检测到的极值点是离散空间的极值点,以下通过拟合三维二次函数来精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。

4.1关键点的精确定位

离散空间的极值点并不是真正的极值点,图4.1显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值(Sub-pixel Interpolation)。

为了提高关键点的稳定性,需要对尺度空间DoG函数进行曲线拟合。利用DoG函数在尺度空间的Taylor展开式(拟合函数)为:

(4-1)

其中,。求导并让方程等于零,可以得到极值点的偏移量为:

(4-2)

对应极值点,方程的值为:

(4-3)

其中,代表相对插值中心的偏移量,当它在任一维度上的偏移量大于0.5时(即x或y或),意味着插值中心已经偏移到它的邻近点上,所以必须改变当前关键点的位置。同时在新的位置上反复插值直到收敛;也有可能超出所设定的迭代次数或者超出图像边界的范围,此时这样的点应该删除,在Lowe中进行了5次迭代。另外,过小的点易受噪声的干扰而变得不稳定,所以将小于某个经验值(Lowe论文中使用0.03,Rob Hess等人实现时使用0.04/S)的极值点删除。同时,在此过程中获取特征点的精确位置(原位置加上拟合的偏移量)以及尺度()。

4.2消除边缘响应

一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。

DOG算子会产生较强的边缘响应,需要剔除不稳定的边缘响应点。获取特征点处的Hessian矩阵,主曲率通过一个2×2 的Hessian矩阵H求出:

(4-4)

H的特征值α和β代表x和y方向的梯度,

(4-5)

表示矩阵H对角线元素之和,表示矩阵H的行列式。假设是α较大的特征值,而是β较小的特征值,令,则

(4-6)

导数由采样点相邻差估计得到,在下一节中说明。

D的主曲率和H的特征值成正比,令为α最大特征值,β为最小的特征值,则公式的 值在两个特征值相等时最小,随着的增大而增大。值越大,说明两个特征值的比值越大,即在某一个方向的梯度值越大,而在另一个方向的梯度值越小,而边缘恰恰 就是这种情况。所以为了剔除边缘响应点,需要让该比值小于一定的阈值,因此,为了检测主曲率是否在某域值r下,只需检测

(4-7)

式(4-7)成立时将关键点保留,反之剔除。

在Lowe的文章中,取r=10。图4.2右侧为消除边缘响应后的关键点分布图。

 

4.3有限差分法求导

有限差分法以变量离散取值后对应的函数值来近似微分方程中独立变量的连续取值。在有限差分方法中,我们放弃了微分方程中独立变量可以取连续值的特 征,而关注独立变量离散取值后对应的函数值。但是从原则上说,这种方法仍然可以达到任意满意的计算精度。因为方程的连续数值解可以通过减小独立变量离散取 值的间格,或者通过离散点上的函数值插值计算来近似得到。这种方法是随着计算机的诞生和应用而发展起来的。其计算格式和程序的设计都比较直观和简单,因 而,它在计算数学中使用广泛。

有限差分法的具体操作分为两个部分:

1. 用差分代替微分方程中的微分,将连续变化的变量离散化,从而得到差分方程组的数学形式;

2. 求解差分方程组。

一个函数在x点上的一阶和二阶微商,可以近似地用它所临近的两点上的函数值的差分来表示。如对一个单变量函数f(x),x为定义在区间[a,b]上的连续变量,以步长将区间[a,b]离散化,我们会得到一系列节点,

然后求出f(x)在这些点上的近似值。显然步长h越小,近似解的精度就越好。与节点相邻的节点有,所以在节点处可构造如下形式的差值:

节点的一阶向前差分

节点的一阶向后差分

节点的一阶中心差分

本文使用中心差分法利用泰勒展开式求解第四节所使用的导数,现做如下推导。

函数f(x)在处的泰勒展开式为:

(4-8)

则,

(4-9)

(4-10)

忽略h平方之后的项,联立式(4-9),(4-10)解方程组得:

(4-11)

 (4-12)

二元函数的泰勒展开式如下:

展开后忽略次要项联立解方程得二维混合偏导如下:

(4-13)

综上,推导了4.1,4.2遇到的所有导数计算。同理,利用多元泰勒展开式,可得任意偏导的近似差分表示。

在图像处理中,取h=1,在图4.2所示的图像中,将像素0的基本中点导数公式整理如下:

4.4 三阶矩阵求逆公式

高阶矩阵的求逆算法主要有归一法和消元法两种,现将三阶矩阵求逆公式总结如下:

若矩阵

可逆,即时,

(4-14)

5、关键点方向分配

为了使描述符具有旋转不变性,需要利用图像的局部特征为给每一个关键点分配一个基准方向。使用图像梯度的方法求取局部结构的稳定方向。对于在DOG金字塔中检测出的关键点点,采集其所在高斯金字塔图像3σ邻域窗口内像素的梯度和方向分布特征。梯度的模值和方向如下:

(5-1)

L为关键点所在的尺度空间值,按Lowe的建议,梯度的模值m(x,y)按的高斯分布加成,按尺度采样的3σ原则,邻域窗口半径为

在完成关键点的梯度计算后,使用直方图统计邻域内像素的梯度和方向。梯度直方图将0~360度的方向范围分为36个柱(bins),其中每柱10度。如图5.1所示,直方图的峰值方向代表了关键点的主方向,(为简化,图中只画了八个方向的直方图)。

方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。为了增强匹配的鲁棒性,只保留峰值大于主方向峰值 80%的方向作为该关键点的辅方向。因此,对于同一梯度值的多个峰值的关键点位置,在相同位置和尺度将会有多个关键点被创建但方向不同。仅有15%的关键 点被赋予多个方向,但可以明显的提高关键点匹配的稳定性。实际编程实现中,就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点,并 且,离散的梯度方向直方图要进行插值拟合处理,来求得更精确的方向角度值,检测结果如图5.2所示。

至此,将检测出的含有位置、尺度和方向的关键点即是该图像的SIFT特征点。

6、关键点特征描述

通过以上步骤,对于每一个关键点,拥有三个信息:位置、尺度以及方向。接下来就是为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使 其不随各种变化而改变,比如光照变化、视角变化等等。这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点,并且描述符应该有较高的独特性,以 便于提高特征点正确匹配的概率。

SIFT描述子是关键点邻域高斯图像梯度统计结果的一种表示。通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。

Lowe建议描述子使用在关键点尺度空间内4*4的窗口中计算的8个方向的梯度信息,共4*4*8=128维向量表征。表示步骤如下:

1. 确定计算描述子所需的图像区域

特征描述子与特征点所在的尺度有关,因此,对梯度的求取应在特征点对应的高斯图像上进行。将关键点附近的邻域划分为d*d(Lowe建议d=4)个子区域,每个子区域做为一个种子点,每个种子点有8个方向。每个子区域的大小与关键点方向分配时相同,即每个区域有个子像素,为每个子区域分配边长为的矩形区域进行采样(个子像素实际用边长为的矩形区域即可包含,但由式(3-8),不大,为了简化计算取其边长为,并且采样点宜多不宜少)。考虑到实际计算时,需要采用双线性插值,所需图像窗口边长为。在考虑到旋转因素(方便下一步将坐标轴旋转到关键点的方向),如下图6.1所示,实际计算所需的图像区域半径为:

  (6-1)

计算结果四舍五入取整。

2. 将坐标轴旋转为关键点的方向,以确保旋转不变性,如6.2所示。

旋转后邻域内采样点的新坐标为:

(6-2)

3. 将邻域内的采样点分配到对应的子区域内,将子区域内的梯度值分配到8个方向上,计算其权值。

旋转后的采样点坐标在半径为radius的圆内被分配到的子区域,计算影响子区域的采样点的梯度和方向,分配到8个方向上。

旋转后的采样点落在子区域的下标为

 (6-3)

Lowe建议子区域的像素的梯度大小按的高斯加权计算,即

(6-4)

其中a,b为关键点在高斯金字塔图像中的位置坐标。

4. 插值计算每个种子点八个方向的梯度。

如图6.3所示,将由式(6-3)所得采样点在子区域中的下标(图中蓝色窗口内红色点)线性插值,计算其对每个种子点的贡献。如图中的红色点,落在第0行和第1行之间,对这两行都有贡献。对第0行第3列种子点的贡献因子为dr,对第1行第3列的贡献因子为1-dr,同理,对邻近两列的贡献因子为dc和1-dc,对邻近两个方向的贡献因子为do和1-do。则最终累加在每个方向上的梯度大小为:

(6-5)

其中k,m,n为0或为1。

5. 如上统计的4*4*8=128个梯度信息即为该关键点的特征向量。特征向量形成后,为了去除光照变化的影响,需要对它们进行归一化处理,对于图像灰度值整体漂移,图像各点的梯度是邻域像素相减得到,所以也能去除。得到的描述子向量为,归一化后的特征向量为

 (6-7)

6. 描述子向量门限。非线性光照,相机饱和度变化对造成某些方向的梯度值过大,而对方向的影响微弱。因此设置门限值(向量归一化后,一般取0.2)截断较大的梯度值。然后,再进行一次归一化处理,提高特征的鉴别性。

7. 按特征点的尺度对特征描述向量进行排序。

至此,SIFT特征描述向量生成。

 

描述向量这块不好理解,我画了个草图,供参考:

7、SIFT的缺点

SIFT在图像的不变特征提取方面拥有无与伦比的优势,但并不完美,仍然存在:

1. 实时性不高。

2. 有时特征点较少。

3. 对边缘光滑的目标无法准确提取特征点。

等缺点,如下图7.1所示,对模糊的图像和边缘平滑的图像,检测出的特征点过少,对圆更是无能为力。近来不断有人改进,其中最著名的有SURF和CSIFT。

8、总结

本人研究SIFT算法一月有余,鉴于相关知识的缺失,尺度空间技术和差分近似求导曾困我良久。Lowe在论文中对细节提之甚少,甚至只字未提,给实现带来了很大困难。经过多方查阅,实现,总结成此文。自认为是到目前为止,关于SIFT算法最为详尽的资料,现分享给你,望批评指正。

一同分享给你的还有同时实现的高斯模糊源码,sift算法源码,见附录1,2。源码使用vs2010+opencv2.2实现。

zdd

2012年4月28日 于北师大

2012年5月17日15:33:23第一次修正

修正内容:第3.3部分内容,图3.1,图3.5。

修正后代码:http://download.csdn.net/detail/zddmail/4309418

 

参考资料

1、David G.Lowe Distinctive Image Features from Scale-Invariant Keypoints. January 5, 2004.

2、David G.Lowe Object Recognition from Local Scale-Invariant Features. 1999

3、 Matthew Brown and David Lowe Invariant Features from Interest Point Groups. In British Machine Vision Conference, Cardiff, Wales, pp. 656-665.

4、 PETER J. BURT, MEMBER, IEEE, AND EDWARD H. ADELSON, The Laplacian Pyramid as a Compact Image Code. IEEE TRANSACTIONS ON COMMUNICATIONS, VOL. COM-3l, NO. 4, APRIL 1983

5、宋丹 10905056 尺度不变特征变换匹配算法Scale Invariant Feature Transform (SIFT)(PPT)

6、RaySaint 的博客SIFT算法研究http://underthehood.blog.51cto.com/2531780/658350

7、Jason Clemons SIFT: SCALE INVARIANT FEATURE TRANSFORM BY DAVID LOWE(ppt)

8、Tony Lindeberg Scale-space theory: A basic tool for analysing  structures at different scales.1994

9、SIFT官网的Rob Hess <hess@eecs.oregonstate.edu> SIFT源码

10、Opencv2.2 Andrea Vedaldi(UCLA VisionLab)实现的SIFT源码 http://www.vlfeat.org/~vedaldi/code/siftpp.html,  opencv2.3改用Rob Hess的源码

11、科学计算中的偏微分方程有限差分法 杨乐主编

12、维基百科SIFT词条:http://zh.wikipedia.org/zh-cn/Scale-invariant_feature_transform

13、百度百科SIFT词条:http://baike.baidu.com/view/2832304.htm

14、其它互联网资料

附录1 高斯模糊源码

http://blog.csdn.net/zddmail/article/details/7450033

http://download.csdn.net/detail/zddmail/4217704

附录2 SIFT算法源码

http://download.csdn.net/detail/zddmail/4309418

 

SIFT 特征提取算法总结

mikel阅读(997)

          主要步骤 

  

  1)、尺度空间的生成;

 

   2)、检测尺度空间极值点;

 

  3)、精确定位极值点;

 

  4)、为每个关键点指定方向参数;

 

  5)、关键点描述子的生成。

 

 

 

L(x,y,σ), σ= 1.6 a good tradeoff

 

D(x,y,σ), σ= 1.6 a good tradeoff

 

 

关于尺度空间的理解说明:图中的2是必须的,尺度空间是连续的。  Lowe的论文中 ,

   将第0层的初始尺度定为1.6,图片的初始尺度定为0.5. 在检测极值点前对原始图像的高斯

  平滑以致图像丢失高频信息,所以 Lowe 建议在建立尺度空间前首先对原始图像长宽扩展

  一倍,以保留原始图像信息,增加特征点数量。尺度越大图像越模糊。   

 

next octave 是由 first octave 降采样得到(如2

尺度空间的所有取值,s为每组层数,一般为3~5

 

同一组中的相邻尺度(由于k的取值关系,肯定是上下层)之间进行寻找

 

在极值比较的过程中,每一组图像的首末两层是无法进行极值比较的,为了满足尺度

     变化的连续性,我们在每一组图像的顶层继续用高斯模糊生成了 3 幅图像,高斯金字

塔有每组S+3层图像。DOG金字塔每组有S+2层图像.

 

 

 

 

 

 

If ratio > (r+1)2/(r), throw it out (SIFT uses r=10)

表示DOG金字塔中某一尺度的图像x方向求导两次

通过拟和三维二次函数以精确确定关键点的位置和尺度(达到亚像素精度)?

 

 

 

 

 

 

直方图中的峰值就是主方向,其他的达到最大值80%的方向可作为辅助方向

 

 Identify peak and assign orientation and sum of magnitude to key point

  The user may choose a threshold to exclude key points based on their

                             assigned sum of magnitudes.

 

利用关键点邻域像素的梯度方向分布特性为每个关键点指定方向参数,使算子具备

旋转不变性。以关键点为中心的邻域窗口内采样,并用直方图统计邻域像素的梯度

方向。梯度直方图的范围是0~360度,其中每10度一个柱,总共36个柱。随着距

中心点越远的领域其对直方图的贡献也响应减小.Lowe论文中还提到要使用高斯函

数对直方图进行平滑,减少突变的影响。

 

 

 

关键点描述子的生成步骤

 

通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性

          的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。

每一个小格都代表了特征点邻域所在的尺度空间的一个像素 ,箭头方向代表了像素梯

度方向,箭头长度代表该像素的幅值。然后在4×4的窗口内计算8个方向的梯度方向直

方图。绘制每个梯度方向的累加可形成一个种子点。

               

每个直方图有8方向的梯度方向,每一个描述符包含一个位于关键点附近的四个直方图

数组.这就导致了SIFT的特征向量有128维.(先是一个4×4的来计算出一个直方图,

每个直方图有8个方向。所以是4×4×8=128维)将这个向量归一化之后,就进一步

      去除了光照的影响。

 

 

     旋转为主方向

 

 

 

 

 

 

 

 

 

 

基本概念及一些补充

什么是局部特征?

  • 局部特征从总体上说是图像或在视觉领域中一些有别于其周围的地方
  • 局部特征通常是描述一块区域,使其能具有高可区分度
  • 局部特征的好坏直接会决定着后面分类、识别是否会得到一个好的结果

局部特征需具备的特性

  • 重复性
  • 可区分性
  • 准确性
  • 数量以及效率
  • 不变性

局部特征提取算法-sift

  • SIFT算法由D.G.Lowe 1999年提出,2004年完善总结。后来Y.Ke将其描述子部分用PCA代替直方图的方式,对其进行改进。
  • SIFT算法是一种提取局部特征的算法,在尺度空间寻找极值点,提取位置,尺度,旋转不变量
  • SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
  • 独特性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配。
  • 多量性,即使少数的几个物体也可以产生大量SIFT特征向量。
  • 可扩展性,可以很方便的与其他形式的特征向量进行联合。

尺度空间理论

  • 尺度空间理论目的是模拟图像数据的多尺度特征
  • 其基本思想是在视觉信息图像信息处理模型中引入一个被视为尺度的参数, 通过连续变化尺度参数获得不同尺度下的视觉处理信息, 然后综合这些信息以深入地挖掘图像的本质特征。

描述子生成的细节

  • 以极值点为中心点,并且以此点所处于的高斯尺度sigma值作为半径因子。对于远离中心点的梯度值降低对其所处区域的直方图的贡献,防止一些突变的影响。
  • 每个极值点对其进行三线性插值,这样可以把此极值点的贡献均衡的分到直方图中相邻的柱子上

归一化处理

  • 在求出4*4*8的128维特征向量后,此时SIFT特征向量已经去除了尺度变化、旋转等几何变形因素的影响。而图像的对比度变化相当于 每个像素点乘上一个因子,光照变化是每个像素点加上一个值,但这些对图像归一化的梯度没有影响。因此将特征向量的长度归一化,则可以进一步去除光照变化的 影响。
  • 对于一些非线性的光照变化,SIFT并不具备不变性,但由于这类变化影响的主要是梯度的幅值变化,对梯度的方向影响较小,因此作者通过限制梯度幅值的值来减少这类变化造成的影响。

PCA-SIFT算法

  • PCA-SIFT与标准SIFT有相同的亚像素位置,尺度和主方向。但在第4步计算描述子的设计,采用的主成分分析的技术。
  • 下面介绍一下其特征描述子计算的部分:
  • 用特征点周围的41×41的像斑计算它的主元,并用PCA-SIFT将原来的2×39×39维的向量降成20维,以达到更精确的表示方式。
  • 它的主要步骤为,对每一个关键点:在关键点周围提取一个41×41的像斑于给定的尺度,旋转到它的主方向 ;计算39×39水平和垂 直的梯度,形成一个大小为3042的矢量;用预先计算好的投影矩阵n×3042与此矢量相乘;这样生成一个大小为n的PCA-SIFT描述子。

Android版】AR 高通 Vuforia QCAR SDK学习笔记

mikel阅读(831)

Android版】AR 高通 Vuforia QCAR SDK学习笔记_steven_新浪博客,steven,

一、准备工作:

1. 下载高通ar项目的sdk

2. 下载高能ar项目对应的Samples
比如 Image Targets项目,Video Playback项目等。下载链接同1,需要注册登录。
3. 在windows环境下需要下载Cygwin
4. 编译QCAR需要NDK环境
二、项目编译及运行
首先对samples项目中的jni进行编译成libQCAR.so等文件
1. 将下载到的Samples(比如Video Playback项目)解压缩到sdk的samples文件夹下(如F盘: F:\workspace\vuforia-sdk-Android-2-6-10\samples)
2.将NDK解压缩(如F盘:F:\android-ndk-r8c-windows)
2. 运行cygwin对jni进行编译,如:F:\workspace\vuforia-sdk-android-2-6-10\samples\VideoPlayback-2-6-7\jni,编译步骤如下图所示:
【Android版】AR <wbr>高通 <wbr>Vuforia <wbr>QCAR <wbr>SDK学习笔记
【Android版】AR <wbr>高通 <wbr>Vuforia <wbr>QCAR <wbr>SDK学习笔记
当出现如下界面即编译成功:
【Android版】AR <wbr>高通 <wbr>Vuforia <wbr>QCAR <wbr>SDK学习笔记
此时,在F:\workspace\vuforia-sdk-android-2-6-10\samples\VideoPlayback-2-6-7项 目中,多了一个libs及obj文件夹,在libs文件夹中包括有libQCAR.so、libVideoPlayback.so及QCAR.jar文 件。
3. 用eclipse打开VideoPlayback-2-6-7项目,设置Java Build Path,将自动加入的QCAR.jar remove(不这样操作运行不了),然后再Add JARs将项目libs中的QCAR.jar文件引入
4. 真机运行即可。

对话 UNIX: 在 Windows 上使用 Cygwin

mikel阅读(800)

如果您是本专栏的忠实读者,应该已经熟悉了许多 UNIX 行话。“用管道重定向输出”、“杀死进程” 和 “使用通配符” 等行话对于新手来说很奇怪,但是您应该很熟悉这些说法了。

常用的首字母缩写词

  • API:应用程序编程接口
  • IT:信息技术

对 于 UNIX 本身,也有各种称呼。IBM® 大型机用户说各种带字母 “z” 的行话,比如 IBM z/OS® 和 System z9 Virtual Machine (z/VM);嵌套系统开发人员使用 eCos 这个词;在聊天中还会提到其他许多风格的 UNIX,比如 Linux®、FreeBSD、Sun Solaris 和 Mac OS X。现代信息技术使用各种各样的方言,简直就像是圣经中巴别塔的故事。

当然,也有不少人说 Windows 术语,尽管大多数人只掌握 “指向和单击” 这样的简单词汇。经过 20 年的发展,大多数 Windows 用户已经忘了古老的 DOS 术语。

但是,与 UNIX shell 相比,Windows COMMAND 实用程序的功能实在很差;因此,UNIX 用户通常认为 Windows 是一种让人灰心丧气的平台。对于习惯于使用丰富的命令行工具集的 UNIX 软件开发人员来说,Windows 尤其别扭。对于 UNIX 开发人员来说,使用 Windows 简直就像是到了陌生的外国。

幸运的是,Cygwin(见 参考资料)在 Windows 环境中提供大家熟悉的一片天地,就像是美国人在法国找到了麦当劳。

Cygwin 是一个用于 Windows 的类 UNIX shell 环境。 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性;以及 Bash shell 的改写版本和许多 UNIX 实用程序,它们提供大家熟悉的 UNIX 命令行界面。前一个组件是一个 Windows 动态链接库 (DLL)。后一个组件是一组基于 Cygwin DLL 的程序,其中许多是用未经修改的 UNIX 源代码编译的。它们合在一起提供大家熟悉的 UNIX 环境。

在本期的 对话 UNIX 专栏中,我们要安装 Cygwin,讨论它的命令行界面 (CLI),并构建标准 Cygwin 发行版中未包含的开放源码,以此体会把 UNIX 应用程序(至少是一部分 UNIX 应用程序)迁移到这个模拟环境是多么容易。

版本详细信息

到编写 本文时,Cygwin DLL 的当前版本是 1.5.25-15。可以在近期的任何 Windows 商业版本上安装 Cygwin,但是 Windows CE 除外。(但是,未来的 Cygwin 版本将不再支持 Windows 95、Windows 98 和 Windows ME)。本文给出的示例和图基于带 Service Pack 3 (SP3) 的 Windows XP Professional,使用的计算机是采用 Coherence 模式的 Apple MacBook,并使用 Parallels version 3.0。

安装 Cygwin

与这里介绍的其他软件不同,Cygwin 使用 Windows 安装程序。Cygwin setup.exe 文件可以重新安装软件,可以添加、修改或升级 Cygwin 配置的组件。

在 Windows 系统上打开浏览器,通过访问 http://cygwin.com/setup.exe 下载 Cygwin 安装程序。安装程序本身非常小(大约 600KB),因为大多数 Cygwin 软件是在安装过程中下载的。完成下载之后,按照以下步骤安装 Cygwin:

  1. 运行安装程序。图 1 显示 Cygwin 欢迎屏幕。
    图 1. 在安装 Cygwin 期间出现的第一个对话框

    Cygwin 欢迎屏幕

  2. 单击 Next 进入下一个屏幕,选择要执行的安装类型。
  3. 单击 Install from Internet
  4. 单击 Next,然后选择一个安装目录。配置安装的窗口见图 2。
    图 2. Cygwin 安装选项

    选择如何安装 Cygwin在大多数情况下,推荐的安装选项是合适的,也可以进行定制,但是要注意几点:

    • 不要在 Windows 系统的根目录(比如 C:)中安装 Cygwin。最好把 Cygwin 安装在它自己的子目录中,比如默认目录(C:\cygwin)或 C:\Program Files\cygwin。(您选择的目标目录将成为模拟的 UNIX 环境的根目录 /。例如,如果在 C:\cygwin 中安装,那么虚拟的 /usr/bin 实际上是 C:\cygwin\usr\bin) 。
    • 对于 Install For 选项,不要选择 Just Me
    • Default Text File 类型设置为 Unix,从而尽可能提高与其他 UNIX 机器上存储的现有文件的兼容性。
  5. 单击 Next。在下一个窗口中,选择一个存储 Cygwin 所需的数据的目录。不要选择前一步中选择的 Cygwin 目录。 如果可能的话,应该在有至少 1GB 空闲空间的驱动器上创建或选择一个目录。
  6. 再次单击 Next,选择使用的 Internet 连接类型。通常应该选择 Direct Connection。
  7. 再次单击 Next。稍等一会儿,Cygwin 会下载当前的镜像站点列表,让您选择一个镜像站点,见图 3。如果不确定应该选择哪个站点,就选择地理位置比较近的站点。
    图 3. 选择您认为可靠的或地理位置比较近的安装站点

    选择镜像站点经过短暂的延迟之后,安装程序显示可用的类别和包的完整列表。图 4 显示一个类别的部分内容。单击加号 (+) 展开对应的类别;单击 “循环” 标志在 Skip(忽略此包)和包的所有可用版本之间循环。如果 Cygwin 提供一个实用程序的多个版本,应该选择满足您的需求的实例。顺便说一下,如果选择 B 列,就会下载二进制包;选择 S,也会下载源代码。

    图 4. 选择最适合需要的包和实例

    选择包在 Cygwin 中可用的包超过 1,000 个,所以应该只选择您需要的类别和包。(安装所有 Cygwin 包会占用超过 800MB 的磁盘空间)。以后随时可以添加整个类别或单独的包:只需重新运行 Cygwin 安装程序。(还可以在任何时候用相同的安装程序删除或更新包)。搜索 Cygwin 包列表(参见 参考资料),检查您喜欢的 UNIX 实用程序是否在 Cygwin 中可用。

  8. 选择您需要的工具之后,单击 Next,下载过程开始!进度条分别反映每个包的下载进度、总下载进度和磁盘使用量。图 5 是在我的测试计算机上在安装期间截取的屏幕图。
    图 5. Cygwin 下载大量软件,所以请耐心等待

    下载过程的屏幕图最后,安装程序安装软件并(可选地)在 Start 菜单和桌面中添加快捷方式。单击 Finish

  9. 通过使用 Start 菜单或双击 Cygwin 图标(如果添加了这些快捷方式的话),启动 Cygwin;也可以执行 Cygwin 目录中的 Cygwin 脚本(比如 C:\cygwin\Cygwin.bat)。图 6 显示第一次启动 Cygwin 时的情况:它创建您的主目录,执行 shell 启动文件,显示提示。现在可以运行 UNIX 命令了!
    图 6. 现在可以在 Windows 中使用 UNIX 命令了!

    在 Windows 中运行的 UNIX shell例如,试一下 ls -atype touch。后一个命令表明 touch 是可执行文件 /usr/bin/touch。

在 Windows 中发挥 UNIX 的优势(反之亦然)

Cygwin 在 Windows 中几乎完整地模拟一个 UNIX shell。实际上,它把这两种操作系统很好地结合在一起了。例如,可以运行 df -h 命令显示 “UNIX” 机器上的空闲磁盘空间。图 7 显示结果。

图 7. 是 Windows 上的 UNIX 文件系统,还是 UNIX 上的 Windows 文件系统?

Cygwin 中的文件系统清单正如 前面提到的,Cygwin 安装目录作为虚拟 UNIX 系统的根目录。Cygwin 把安装目录中的子目录映射到 UNIX 目录。它以单独的卷的形式提供 Windows 驱动器,比如 /cygwin/c。可以使用这样的虚拟路径启动 Windows 程序。请尝试输入 /cygwin/c/Program\ Files/Internet\ Explorer/IEXPLORE.EXE 从命令行启动 Windows Internet Explorer®。(还可以使用 Tab 键自动展开路径的元素) 。

顺便说一句,如果要把 Windows 路径名转换为等效的 UNIX 路径名或者相反,可以试试内置命令 cygpath。在默认情况下,cygpath 产生 UNIX 路径名。使用 -w 选项产生 Windows 路径。

$ cygpath -w /cygwin/c/Program\ Files/Internet\ Explorer/IEXPLORE.EXE
c:\Program Files\Internet Explorer\IEXPLORE.EXE

还有帮助沟通这两个环境的其他特性:

  • Cygwin 提供它自己的 lpr(/usr/bin/lpr 而不是 Windows 的 LPR.EXE),可以直接从模拟的 UNIX 环境进行打印。只需把 PRINTER 环境变量设置为 \\server\printer_name 或 //server/printer_name 这样的 Cygwin UNC;前向斜杠和反向斜杠都可以,在 Cygwin 中的其他地方也是如此。
  • 在 Cygwin 中用 ln -s 创建的符号链接在 Windows 中被解释为快捷方式。同样,Windows 快捷方式在 Cygwin 中被解释为符号链接。因此,可以使用 Windows 快捷方式带参数启动 UNIX 命令。
  • 因为 Cygwin 提供完整的 Bash shell,所以可以使用上述的所有兼容特性(和其他特性)编写 UNIX shell 脚本来维护 Windows!例如,可以使用 UNIX find 在驱动器上搜索数据。请注意一点:在 Windows 文件名中常常使用空格。为了保持完整的文件名(请记住,UNIX 参数以空格分隔),一定要使用 find -print0xargs -0

如何更新和扩展 Cygwin

正如前面提到的,在任何时候都可以通过运行 Cygwin 安装程序添加、删除和更新 Cygwin 类别和包。我们来添加几个软件开发包,以便像在传统的 UNIX 系统上那样从源代码构建程序。

再次运行 Cygwin setup.exe 应用程序,依次通过前几个对话框,直到到达 Select Packages 窗口,见 图 4。展开 Devel 类别,使用循环控件选择以下包的最高版本:

  • autoconf2.1
  • automake1.10
  • binutils
  • gcc-core
  • gcc4-core
  • gdb
  • pcre
  • pcre-devel

做出选择之后(为了满足依赖性,可能会自动选择其他包),单击 Next 开始更新。与前面一样,下载和安装过程需要一定的时间(开发包往往相当大)。

在此期间,打开一个浏览器并通过访问 http://ftp.gnu.org/gnu/wget/wget-1.11.4.tar.gz 下载 GNU wget 实用程序的最新源代码。(wget 是一种命令行工具,它可以下载任何东西。关于此工具的更多信息,请参见 参考资料)。使用 Cygwin 把此文件复制到 Cygwin 中的主目录,展开压缩文件。清单 1 显示压缩文件的内容。

清单 1. wget-1.11.4.tar 的内容
$ cp /cygdrive/c/Documents\ and\ Settings/Martin/My\ Documents/wget-1.11.4.tar ~
$ tar xzvf wget-11.4.tar
wget-1.11.4/
wget-1.11.4/AUTHORS
wget-1.11.4/NEWS
wget-1.11.4/COPYING
wget-1.11.4/configure.bat
wget-1.11.4/ChangeLog
wget-1.11.4/ChangeLog.README
wget-1.11.4/msdos/
wget-1.11.4/msdos/ChangeLog
wget-1.11.4/msdos/Makefile.DJ
...
wget-1.11.4/src/cookies.c
wget-1.11.4/src/http.h
wget-1.11.4/src/log.h
wget-1.11.4/src/sysdep.h
wget-1.11.4/src/alloca.c
wget-1.11.4/src/getopt.c
wget-1.11.4/src/gnu-md5.h
wget-1.11.4/src/ftp.c
wget-1.11.4/config.sub
wget-1.11.4/config.guess
$

当 Cygwin 下载和安装过程完成时,单击 Finish。现在可以从源代码构建 wget 实用程序了。

$ cd wget-1.11.4
$ ./configure
configure: Configuring for GNU wget 1.11.4
...
creating po/Makefile
$ make
gcc -I. ...
$ make install
...
/usr/bin/install -c -m 644 ./wget.1 /usr/local/share/man/man1/wget.1
$ type wget
/usr/local/bin/wget

为了测试这个新的实用程序,在 Cygwin 中运行它并下载 wget 源代码:

$ /usr/local/bin/wget http://ftp.gnu.org/gnu/wget/wget-1.11.4.tar.gz

稍后就会得到一个新的源代码压缩文件。使用 Cygwin 安装程序从 Cygwin 存储库获得实用程序是最简单的方法,但是也可以在 Cygwin 中构建下载的或自己的源代码。在 Cygwin 中可以使用全套 UNIX 开发工具,包括最流行的脚本编程语言。

如果您不喜欢 Microsoft Visual Studio® 等 Windows 开发工具,甚至可以用 Cygwin 中的 UNIX 编译器和工具构建原生 Windows WIN32 应用程序。(这些应用程序不在 UNIX 上运行。要想在 UNIX 上运行 Windows 应用程序,可以考虑使用 WINE。更多信息参见 参考资料) 。

结束语

Cygwin 并不是完美的 UNIX 模拟环境,但已经相当好了。核心组件的文档很完善,而且特别方便,它们介绍了模拟 DLL 中的限制和安全风险。如果希望把复杂的 UNIX 包迁移到 Cygwin,请参考开发人员指南(参见 参考资料),评估 Cygwin 的支持是否能够满足您的 API 需要。

Cygwin 最棒的特性可能是它与 Windows 的集成。使用 Cygwin 和它的 UNIX 命令行来操纵系统可以大大提高生产力。建议在您的 shell PATH 变量中包含 Windows 的 Program Files 中的子目录,这样只需输入程序名,就能够启动路径中的任何二进制程序。

更棒的是,Cygwin 可以在同一个窗口中管理多个作业。按 Control-Z 可以暂停正在运行的作业;输入 bgfg 分别在后台和前台运行作业;输入 jobs 管理作业列表。当然,Cygwin 还可以对输入和输出进行重定向,可以通过管道把一个命令的输出发送给另一个命令。

Cygwin 真的很不错。

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文
  • 对话 UNIX:阅读本系列中的其他文章。
  • 了解关于 Cygwin 的特性的更多信息。
  • 阅读官方指南 Cygwin User’s Guide
  • 查阅 Cygwin 包列表
  • 阅读 Cygwin API Reference,了解与 UNIX 的兼容性以及如何迁移到 Cygwin。
  • 了解关于 UNIX shell 的更多信息。
  • 了解关于 WINE 的更多信息,WINE 是一种开放源码的 Windows API 实现。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • 技术书店 浏览关于这些主题和其他技术主题的图书。

获得产品和技术

讨论

[转载]Augmented reality using a webcam and Flash | Adobe Developer Connection

mikel阅读(1435)

Take a look at augmented reality, its current uses, and its future potential; then dig in and create an AR experience.

来源: [转载]Augmented reality using a webcam and Flash | Adobe Developer Connection

Additional required products

External code libraries:

 

Optional drawing/rendering programs:

User Level

Beginning

Required products

Sample files

Augmented reality (AR) is a field of computer science that involves combining the physical world and an interactive, three-dimensional virtual world. This article takes a look at augmented reality, its current uses, and its future potential. Then you’ll dig in and see how to apply this exciting technology using Adobe Flash CS4 Professional, Adobe Flash Player 10, and a webcam.

While mainstream audiences are now becoming aware of AR, it is not new. Its background is intertwined with decades of computer science development. Virtual reality (VR), AR’s more familiar counterpart, is the replacement of the user’s physical reality (particularly that which is experienced through sight and hearing) with a computer-generated reality. The idea of a virtual experience is exciting—creating entertaining and educational sensory encounters that do not exist in our everyday lives.

From a consumer standpoint, it seems that AR advances have come out of nowhere to surpass VR advances. The acceleration in AR technology is due to two major factors: First, users are still experiencing reality, so believability is easier to achieve. Adding simple graphics (such as text or simple shapes) and color effects (such as night vision or thermal vision) to reality creates a better user experience. The user is still seeing a mostly familiar world. Second, this more subtle use of computer graphics is less expensive with today’s technology, making it more feasible than VR.

Applications of augmented reality

The video game industry has released major augmented reality products for more than a decade. The EyeToy for Sony PlayStation 2 and 3 takes input from an inexpensive video camera and composites the live video feed with CG onto the TV screen. This toy detects the user’s body position in front of the camera as an alternative input method to the typical joystick or gamepad, deepening the user’s immersion into the game world. Detection schemes continue to advance, allowing for more engaging interaction.

There are AR applications outside of console games, including military and consumer products, too. Night-vision goggles and targeting-assistance technology help marksmen in battle, and children’s stories come to life with AR-enhanced books. The uses are vast.

With AR-enhanced books, each page of a real-world book is outfitted with a marker—a pattern that is detectable by AR. As the child turns each page, a computer is able to place a virtual 3D animation on top of a physical image printed on paper. In this article, you will learn to create this type of AR experience. Let’s dig in!

Augmented reality with Flash CS4

Let’s create a project in which a webcam will capture the user, holding a marker image in an arbitrary position, and the application will augment the webcam feed with a 3D model overlaid onto the marker’s position in a believable way. You can get this project up and running in less than an hour.

With Flash Player 10, developers have the most robust toolset yet for rich application development. Flash Player handles the heavy lifting such as video input, pixel-level image manipulation, and the heavy number crunching afforded with ActionScript 3. All you need is a webcam, a few open source libraries, and Flash CS4 to get the job done.

New project setup

Before coding a Flash CS4 project, you need to prepare the libraries and assets. Once the project is set up, most changes will happen within the document class (see Figure 1). To get started:

  1. Create a new project in Flash CS4 by choosing File > New > Flash File (ActionScript 3.0), and save the project as AugmentedReality.fla inside an AugmentedReality folder on your desktop.
  2. Create a document class by choosing File > New > ActionScript File, and save it as AugmentedReality.as within the AugmentedReality folder.
  3. Set this file as the project’s document class to the AugmentedReality class file by choosing Window > Property > Class. The class file will be empty at this point.
  4. Create a libs folder inside the AugmentedReality folder, and add it to the project’s library path by choosing File > Publish Settings > Flash > ActionScript 3.0 > Library Path > [Folder Icon].
  5. Download the three libraries discussed in the next section, and add each SWC to the libs folder.
  6. Create an Assets folder and add the 3D Collada model file and two AR data files.

Augmented reality project folder after setup
Figure 1. Augmented reality project folder after setup

External library setup

A great benefit of ActionScript3’s object-oriented programming model is that developers can importexisting libraries of code to save ramp-up time and vastly expand thedevelopment power of Flash. This implementation of AR takes advantageof three such libraries, each with a specific role in the project:

Asset preparation

TheFlash Augmented Reality Toolkit (FLARToolkit) library holds much of themagic for this application. It will introspect the webcam image for aparticular graphic image and judge where in real space to map the 3Dmodel. The FLARCameraParams.dat file, which comes with the toolkit,will be used as-is. It corrects webcam distortion and helps the toolkitwith its general detection routine. The graphic marker imageinformation is held within the FLARPattern.pat file. The file is madeto work with a particular marker graphic image (see Figure 2). If youwant to use a different graphic, create a JPEG image with your favoritedrawing program, and use the FLAR Marker Generator (AIR, 322K) to generate a new pattern file.

Tower marker graphic
Figure 2. Tower marker graphic

The marker image is a graphic drawn, printed, and shown to the endapplication as it runs. FLAR, with help from the marker data file andparameters file, will detect this shape via webcam. To design agraphic, fit the desired shape within a white square that is centeredwithin a larger black square. Keep your shape simple for best results.

Notethe sun shape in the graphic. This helps the application detect whichway is up for the marker and assists its angle and rotation detection.Your design doesn’t need to have this shape per se, but it should beasymmetrical in some way for best results.

Also, you’ll needa 3D model in the Collada format that Papervision3D requires. Colladamodels can be created and exported using many popular 3D modelingtools, including the open source Blender3D.

The document class

TheAugmentedReality.as document class is where all of the project’s codelives. The following code shows the completed class. As you can see,much of the complexity of FLAR and Papervision3D for the project ishidden within the imported libraries and is therefore out of the way:

package { //-------------------------------------- // Imports //-------------------------------------- import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.media.Camera; import flash.media.Video; import flash.utils.ByteArray; import org.libspark.flartoolkit.core.FLARCode; import org.libspark.flartoolkit.core.param.FLARParam; import org.libspark.flartoolkit.core.raster.rgb.FLARRgbRaster_BitmapData; import org.libspark.flartoolkit.core.transmat.FLARTransMatResult; import org.libspark.flartoolkit.detector.FLARSingleMarkerDetector; import org.libspark.flartoolkit.pv3d.FLARBaseNode; import org.libspark.flartoolkit.pv3d.FLARCamera3D; import org.papervision3d.lights.PointLight3D; import org.papervision3d.materials.shadematerials.FlatShadeMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.parsers.DAE; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D; //-------------------------------------- // Class Definition //-------------------------------------- public class AugmentedReality extends Sprite { //-------------------------------------- // Class Properties //-------------------------------------- // 1. WebCam private var video : Video; private var webcam : Camera; // 2. FLAR Marker Detection private var flarBaseNode : FLARBaseNode; private var flarParam : FLARParam; private var flarCode : FLARCode; private var flarRgbRaster_BitmapData : FLARRgbRaster_BitmapData; private var flarSingleMarkerDetector : FLARSingleMarkerDetector; private var flarCamera3D : FLARCamera3D; private var flarTransMatResult : FLARTransMatResult; private var bitmapData : BitmapData; private var FLAR_CODE_SIZE : uint = 16; private var MARKER_WIDTH : uint = 80; [Embed(source="./assets/FLAR/FLARPattern.pat", mimeType="application/octet-stream")] private var Pattern : Class; [Embed(source="./assets/FLAR/FLARCameraParameters.dat", mimeType="application/octet-stream")] private var Params : Class; // 3. PaperVision3D private var basicRenderEngine : BasicRenderEngine; private var viewport3D : Viewport3D; private var scene3D : Scene3D; private var collada3DModel : DAE; // Fun, Editable Properties private var VIDEO_WIDTH : Number = 640; //Set 100 to 1000 to set width of screen private var VIDEO_HEIGHT : Number = 480; //Set 100 to 1000 to set height of screen private var WEB_CAMERA_WIDTH : Number = VIDEO_WIDTH/2; //Smaller than video runs faster private var WEB_CAMERA_HEIGHT : Number = VIDEO_HEIGHT/2; //Smaller than video runs faster private var VIDEO_FRAME_RATE : Number = 30; //Set 5 to 30. Higher values = smoother video private var DETECTION_THRESHOLD : uint = 80; //Set 50 to 100. Set to detect marker more accurately. private var DETECTION_CONFIDENCE : Number = 0.5; //Set 0.1 to 1. Set to detect marker more accurately. private var MODEL_SCALE : Number = 0.8; //Set 0.1 to 5. Set higher to enlarge model // Fun, Editable Properties: Load a Different Model private var COLLADA_3D_MODEL : String = "./assets/models/licensed/hummer/models/hummer.dae"; //-------------------------------------- // Constructor //-------------------------------------- /** * The constructor is the ideal place * for project setup since it only runs once. * Prepare A,B, & C before repeatedly running D. **/ public function AugmentedReality() { //Prepare prepareWebCam(); //Step A prepareMarkerDetection(); //Step B preparePaperVision3D(); //Step C // Repeatedly call the loop method // to detect and adjust the 3D model. addEventListener(Event.ENTER_FRAME, loopToDetectMarkerAndUpdate3D); //Step D } //-------------------------------------- // Methods //-------------------------------------- /** * A. Access the user's webcam, wire it * to a video object, and display the * video onscreen. **/ private function prepareWebCam() : void { video = new Video(VIDEO_WIDTH, VIDEO_HEIGHT); webcam = Camera.getCamera(); webcam.setMode(WEB_CAMERA_WIDTH, WEB_CAMERA_HEIGHT, VIDEO_FRAME_RATE); video.attachCamera(webcam); addChild(video); } /** * B. Prepare the FLAR tools to detect with * parameters, the marker pattern, and * a BitmapData object to hold the information * of the most recent webcam still-frame. **/ private function prepareMarkerDetection() : void { // The parameters file corrects imperfections // In the webcam's image. The pattern file // defines the marker graphic for detection // by the FLAR tools. flarParam = new FLARParam(); flarParam.loadARParam(new Params() as ByteArray); flarCode = new FLARCode(FLAR_CODE_SIZE, FLAR_CODE_SIZE); flarCode.loadARPatt(new Pattern()); // A BitmapData is Flash's version of a JPG image in memory. // FLAR studies this image every frame with its // marker-detection code. bitmapData = new BitmapData(VIDEO_WIDTH, VIDEO_HEIGHT); bitmapData.draw(video); flarRgbRaster_BitmapData = new FLARRgbRaster_BitmapData(bitmapData); flarSingleMarkerDetector = new FLARSingleMarkerDetector(flarParam, flarCode, MARKER_WIDTH); } /** * C. Create PaperVision3D's 3D tools including * a scene, a base node container to hold the * 3D Model, and the loaded 3D model itself. **/ private function preparePaperVision3D() : void { // Basics of the empty 3D scene fit for // FLAR detection inside a 3D render engine. basicRenderEngine = new BasicRenderEngine(); flarTransMatResult = new FLARTransMatResult(); viewport3D = new Viewport3D(); flarCamera3D = new FLARCamera3D(flarParam); flarBaseNode = new FLARBaseNode(); scene3D = new Scene3D(); scene3D.addChild(flarBaseNode); // Load, scale, and position the model // The position and rotation will be // adjusted later in method D below. collada3DModel = new DAE(); collada3DModel.load(COLLADA_3D_MODEL); collada3DModel.scaleX = collada3DModel.scaleY = collada3DModel.scaleZ = MODEL_SCALE; collada3DModel.z = 5; //Moves Model 'Up' a Line Perpendicular to Marker collada3DModel.rotationX = -90; //Rotates Model Around 2D X-Axis of Marker collada3DModel.rotationY = 180; //Rotates Model Around 2D Y-Axis of Marker collada3DModel.rotationZ = 90; //Rotates Model Around a Line Perpendicular to Marker // Add the 3D model into the // FLAR container and add the // 3D cameras view to the screen // so the user can view the result flarBaseNode.addChild(collada3DModel); addChild(viewport3D); } /** * D. Detect the marker in the webcamera. * If found: move, scale, and rotate the * 3D model to composite it over the marker * in the user's physical space. **/ private function loopToDetectMarkerAndUpdate3D(aEvent : Event) : void { // Copy the latest still-frame of the webcam video // into the BitmapData object for detection bitmapData.draw(video); try { // Detect *IF* the marker is found in the latest still-frame if(flarSingleMarkerDetector.detectMarkerLite(flarRgbRaster_BitmapData, DETECTION_THRESHOLD) && flarSingleMarkerDetector.getConfidence() > DETECTION_CONFIDENCE) { // Repeatedly Loop and Adjust 3D Model to Match Marker flarSingleMarkerDetector.getTransformMatrix(flarTransMatResult); flarBaseNode.setTransformMatrix(flarTransMatResult); basicRenderEngine.renderScene(scene3D, flarCamera3D, viewport3D); } } catch(error : Error) {} } } }

Stepping through the document class

ActionScript 3 class basics

ActionScript 3 class files are structured into several sections, and each has a specific role in this project.

  • Imports:Typically your class will take advantage of existing codelibraries—libraries you may not have coded yourself. Each importstatement loads in the needed class or package from an existinglibrary. You need libraries from Flash, FLARToolkit, and Papervision3Dfor this project.
  • Class definition: The bulk of your classes code should be in the class definition section.
  • Class properties:Declare all public, private, and static variables. Arguments and localvariables are declared within the constructor body and the methodbodies. For this project, you need only private variables; no outsideclasses need access.
  • Constructor: Thisfunction runs when the class is created. The function’s name must matchthe class name. It runs only once so it’s an ideal place to initializeyour class. In the following steps, setup code will be placed here. Inthis project, code is placed to set up the camera, FLARToolkit, andPapervision3D and to prepare a repeating loop to handle markerdetection.
  • Methods: Methods are classfunctions or reusable chunks of code. This project uses only fourmethods to handle setup and marker detection.

Imports and properties

Startingat the top of the AugmentedReality.as document class, we see importstatements for the needed libraries. Within the Properties section,variables are declared. Most of this section is pretty standard, exceptthe Pattern and Params property declarations from lines 58–62. Thissection showing the Flex Embed metatag within Flash CS4 appears here:

[Embed(source="../assets/FLAR/FLARPattern.pat", mimeType="application/octet-stream")] private var Pattern: Class; [Embed(source="../assets/FLAR/FLARCameraParameters.dat", mimeType="application/octet-stream")] private var Params : Class;

Adobe Flex uses a special type of code called the Embed metatag.Embed tags, as they are commonly called, enable a property to beinitialized with a value loaded from an external file. A unique aspectis that the byte loading happens at compile time (as the project ispublished) rather than at runtime (while the user interacts with theapplication). The bytes for the loaded file are baked into the SWFfile. Flash CS4 now supports this feature as well with help from theflex.SWC, which is included in this project’s libs folder.

Class constructor

Sincethe constructor of a class is called only once, it is an ideal locationfor one-time-only setup code. Starting on line 93, the preparationmethods are called for each of the following: the webcam, the markerdetection, and Papervision3D. In addition to the setup methods, the loopToDetectMarkerAndUpdate3Dfunction is set up to run again and again. By listening to theENTER_FRAME event built into Flash, this loop will be called repeatedlyas long as the application is running.

Webcam setup

Flashfeatures great webcam support. As the application runs and a camera isdetected, Flash Player will automatically prompt the user to enable itas line 96 of the code executes. The Video object is the windowonscreen where the video will be shown, and the Camera object recordsand feeds its live footage to that Video object.

FLAR setup

Acornerstone of this project is marker detection. As the marker graphicis detected via webcam, its position, rotation, and scale in the user’sphysical space are calculated. This calculation will be used in thenext steps. Starting with line 97, FLAR will search each still-frame ofwebcam footage for the predefined marker graphic (Pattern object). Thedetection scheme uses an ActionScript BitmapData object, which containsonly the latest still-frame of video at any given time (the BitmapDataDraw function).

Papervision3D setup

For the mostpart, the 3D setup at line 98 is typical of any Papervision3D project.A BasicRenderEngine object will handle the bulk of the vector math,converting 3D geometry to 2D graphics for display on the screen. TheCollada 3D model is loaded and inserted into the 3D scene, and the viewinto that scene (ViewPort object) is added to the Stage (see Figure 3).Luckily this is all done for you. In the final project, this view islayered on top of the 2D webcam Video object shown earlier so thecomposite of 2D and 3D will look believable.

Collada model loaded and rendered with Papervision3D
Figure 3. Collada model loaded and rendered with Papervision3D

Repeated detect-and-update routine

As mentioned earlier, by using the ENTER_FRAME you ensure this loopToDetectMarkerAndUpdate3Dfunction on lines 102 will be called 30 times per second. Each time,the BitmapData object will copy in the latest still-frame from thewebcam footage. FLAR runs detection on the still-frame. If the markeris detected, FLAR returns updated position, rotation, and scale data(TransformMatrix object). The container (FLARBaseNode object) holdingthe 3D model is updated to that position so the model appears to be atthe same position in the user’s physical space as the marker. Theresulting effect is nothing short of amazing for first-time viewers.

Running the completed project

Printout the graphic marker. Show the marker to the running application viathe webcam (see Figure 4). The red line is for illustration purposes todenote successful initial marker detection. Much like ArnoldSchwarzenegger’s Terminator character, the project can now read in thesurrounding environment, visually scan and detect relevant objects, andmake calculations based on that information. It works best to have asimple backdrop of a solid wall in the application because complexscenes may confuse the detection scheme.

Application detecting the graphic marker via webcam
Figure 4. Application detecting the graphic marker via webcam

Next, seeing the marker graphic through the webcam, the applicationsuperimposes an animated 3D model onto the user’s physical space (seeFigure 5). The model now rotates and scales believably as the usermoves the marker.

Application replaces the marker with a 3D model
Figure 5. Application replaces the marker with a 3D model

Where to go from here

There you have it. Augmentedreality is within the grasp of all Flash developers. The FLARToolkitcan detect multiple markers to bring even more 3D into your world. Astechnology matures, you will be able to detect more complex graphicmarkers within more complex scenes. The choices are endless. What willyou choose to do with augmented reality: print and show a marker to anonline application as we’ve done here, buy and play with a real-worldAR-enabled toy, or detect and destroy like the Terminator?

To see another example of augmented reality, check out the MAX 2009 example with links to AR sessions at the conference.

Note: This article appeared originally in the Edge newsletter.

高通Qualcomm vuforia SDK4.0相关

mikel阅读(1374)

一.新一代vuforia SDK4.0一般准备步骤为:
1.建立新工程
2.导入vuforia-unity-mobile-Android-ios-4-2-3.unitypackage
点击import默认全部导入
这个就是下载的识别图数据库文件,同样,我们导进unity
到这里我们基本完工,但是由于高通新版4.0插件开始需要联网验证,需要输入一个 License Key,我们接下来要在官网创建出我们自己的key
完工,点击运行,将识别图片放在摄像头前,识别后就会出现Cube

二.Vuforia sdk 4.0的新功能就是物体识别Object Recognition和物体扫描器 vuforia object scanner,制作一个手表扫描案例简单说一下使用流程。

Vuforia 对象扫描仪使用有四个阶段

  • 设置-应用于设置环境。
  • 扫描-捕捉各个角度的对象。
  • 测试-评估对应用程序本身拍摄的对象
  • 对象数据文件传输-上传到目标管理

下载安装扫描器

Vuforia 对象扫描仪下载地址:https://developer.vuforia.com/downloads/tool

下载之后包含的内容是一个安卓的apk安装包,安装到手机上。支持的设备,支持三星Galaxy S5和谷歌Nexus 5。注意,在其他安卓设备可能性能受影响,不是最佳的效果。

在media文件中还有两个文件,为对象扫描图ObjectScanningTarget

 

这个图片在扫描3d物品时会起到辅助作用。

一旦你安装了扫描仪在手机上就会有一个扫描的图标启动app进入,这里需要手机连接网络,如果不连接网络会提示你没有连接,不能提供服务。

界面,当你有扫描物品

下面就是如果扫描对象,并创建一个对象数据文件。

要通过扫描对象创建一个对象的数据文件,请按照下列步骤操作

1. 打印对象扫描目标图片

2. 定位对象

3. 扫描对象

4. 测试对象

在进行扫描时,需要注意的问题是,你选择的扫描物体最好是不规则的,我测试了几个物体

第一个是葫芦,表面比较光滑,第一次测试,识别的点不多.不建议使用3d物体识别,可以用vuforia的Cylinder 识别,会有专门教程进行讲解。杯子盖测试也是识别点比较少,这个可以与光线、周围环境都有影响。鼠标和手机是不规则的物体,这个可以并建议使用用3d识别 追踪。

扫描并创建数据文件

扫描的步骤为

用手机围绕对象旋转,让这个points越多对之后的识别效率越高。

测试对象的扫描结果

出现这个物体说明你的物体就会比识别,如果没有这个物体或者这个物体偶尔出现,说明points不够多,你需要继续添加这个对象数据文件。

编辑和上传对象数据文件

 

 

 

通过这几种方式可以上传到电脑上。然后在添加对象到目标数据库中使用。 格式为.od

3d手表识别案例

通过上面3d扫描已经获取了watch001的数据文件,如何在项目使用这个文件。我使用的unity+vuforia技术路线。

第一步,需要创建License Manager

第二步,添加 Target Manager数据 addDatabase,创建watch Target Manager

第三步,添加数据信息

第四步,下载unity需要的文件

第五步,在unity中添加

第六步,组件,并进行设置

第七步,添加组件,并进行设置选择数据文件

第八步,再添加一个人物模型

第九步,点击运行

最后,识别手表就可以出现人物了,实现3d模型的识别。

版权声明:本文为博主原创文章,未经博主允许不得转载。