Luxand是一个简便易用的人脸识别的开放API,如果你需要在你的程序中加入识别的类似功能,你可以尝试使用它,但是有一点需要引起注意,在我实际的使用过程中,发现Luxand的驱动下占用的内存较多,或者说,不是很容易将进行优化。如果你仔细观察示例程序,你会发现你的电脑的CPU仪表上的内存占用基本上是不变的占用,而如果是自己去使用API编程加入识别功能,你会发现其实占用的内存还是挺多的,当然,这也不是没有办法,所以,在使用的时候,需要对此加以注意。
让我们开始吧,在使用之前,最好阅读以下相关的文档,以对Luxand有一个大概的了解,Luxand的使用并不是完全的免费的,其使用方式是经过一层签名认证,这个签名,也就是相当于系统注册码一样的东西,是需要通过在Luxand上进行注册来使用的,不过这一步并不复杂,就是申请一个邮箱然后获取分配的号码,这是很长的一串号码,这里不提供号码,如果有需要,你可以自己申请一个。
Luxand的原理就是人脸识别的一些基本的算法,其特点在于抓住了人脸上的一些不变的特征点,这些特征点是不易被识别错误的,普通的一些算法中需要学习,这样可以进行特定的场合下的适应,但是如果是平常的应用其实不必这么复杂,人脸的不变的特征就可以帮助摄像头找到需要的图案的位置,当然,这样做也导致其对于人脸的旋转等的判断大打折扣,不过在普通的应用中,你是不需要这些的,这里开始介绍具体的使用方法了。
好了,先介绍一下具体的使用到的一些参量,使用Luxand的时候,如果是识别指定的照片中的人脸,那么你就不需要使用到摄像头,不用怀疑,Luxand提供了能力,后面会详细的提到这件事,这里面还是有很多好玩的应用可以制作的。但是还是把和摄像头有关的参量一并给出:
这里是以java的标准给出的,TCameras CameraList = new TCameras();这是摄像头的列表,你的电脑上可能有不同的类型,不止一个数量的摄像头,TCameras CameraNameList = new TCameras(); TCameras CameraDevicePathList = new TCameras(); HCamera CameraHandle = new HCamera(); 这些也都是,基本上可以顾名思义,另外,在Luxand的官网上,也就是注册使用序列号(可以使用一年)的地方,有Luxand Document,也就是相当于API的说明。而就图像来说,在java中最重要的是HImage Image = new HImage();指示需要识别的图像。
另外,在准备阶段中,序列号和硬盘号也是需要的,所以可以这样定义,String HardwareID[] = {"xxxxxxxxxxxxxxx"}; String LicenseInfo = “xxxxxxxxxxxxxxx”;这些信息可以从提供的函数中得到,具体的代码在后面会给出。还有一个重要的识别用到的参量,就是FSDK_Features.ByReference feature_for_me = new FSDK_Features.ByReference();是存储脸部的特征的参量。好了,万事俱备,只欠东风,让我们开始识别吧。
if(FSDK.FSDKE_OK==FSDK.GetHardware_ID(HardwareID)){
}
if(FSDK.FSDKE_OK==FSDK.ActivateLibrary(LicenseInfo))
{
}
if(FSDK.FSDKE_OK==FSDK.Initialize())
{
}
if(FSDK.FSDKE_OK==FSDKCam.InitializeCapturing()){
}
if(FSDK.FSDKE_OK == FSDKCam.SetCameraNaming(false)){
}
if(FSDK.FSDKE_OK ==FSDKCam.GetCameraList(CameraList, CameraCount)){
}
if(FSDK.FSDKE_OK== == FSDKCam.GetCameraListEx(CameraNameList,CameraDevicePathList,CameraCount))
{
camera_name = CameraNameList.cameras[0];
}
这里是使用到摄像头的代码初始化部分,所以如果不适用摄像头,那么和摄像头相关的几个函数就不用了,也就是在函数名中带有camera的,其实这也是值得学习的,在命名的时候,需要让这些参量变得易于理解和使用。
在Luxand中,提供了打开图像的函数,其实在摄像头的连续识别中,道理是一样的,不过做了很多的优化,也是连续的得到图像,然后送入识别函数,仅此而已。
具体的函数是:
int FSDK.LoadImageFromFile(HImage Image, String FileName);
得到了图片,在之前我们的HImage参量中,然后,该函数FSDK.DetectFacialFeatures出场了, 首先看看照片中是否存在人脸:
if(FSDK.FSDKE_OK==FSDK.DetectFacialFeatures(for_detect,feature_for_me)),你可不恩能够蒙我,既然有人脸,就把人脸的位置信息识别出来:
if(FSDK.FSDKE_OK==FSDK.DetectFacialFeatures(detect,feature)),进行识别后,可以使用脸部特征存储的参量中的信息了,feature.features[0].y是第一个特征的y坐标,其他就同理了,不再赘述。不过你需要有一张特征的“地图”,嗯,就在附件中,或者你可以在Luxand帮助手册中找到。
那么,再加一些摄像头识别的东西:
if(FSDK.FSDKE_OK == FSDKCam.OpenVideoCamera(camera_name,CameraHandle)),先打开摄像头,当打开成功后,可以从摄像头中一幅一幅图像的拿出来:
if(FSDK.FSDKE_OK == FSDKCam.GrabFrame(CameraHandle,Image))
这里的Image是一个HImage类型的参量,下面的步骤基本上和图像识别无异了,那么,利用这个我们可以做啥呢?嗯,很多的有意思的东西都变得可能了。
比如,寒冷的冬天,你在电脑上读一份资料,手还得放在外面滑动鼠标,多么的不惬意啊,让Luxand帮助你吧,首先做一个简易的阅读器,可以读取鼠标的滑动信息,从摄像头中读取你的眼睛的“一举一动”,并读取你的眼部的运动,好了,然后模拟你的鼠标的移动,代码也是容易找到的:
void mouseWheelSetup2()
{
addMouseWheelListener( // the rest of of this is acutally the argument list for the function call
new java.awt.event.MouseWheelListener()
{
public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt)
{
viewadjust -= 9*evt.getWheelRotation(); // 调节当前页面的移动
}
}
) // this is the end of the argument list
; // this single semicolon is the entire, complete function body
}
你的双手就不需要再忍受寒冷的侵袭啦!当然,创意是无止境的,你还可以想出更多的应用来。
文章评论(0条评论)
登录后参与讨论