android人脸识别API
Android实例开发基于ArcSoft实现人脸识别
Android实例开发基于ArcSoft实现⼈脸识别⽬录效果图激活引擎第⼀步配置APP_ID和SDK_KEY第⼆步:判断是否添加动态链接库(so⽂件与jar包)第三步:判断是否申明所有权限⼈脸⽐对 1:N第⼀步:初始化本地⼈脸库第⼆步:初始化引擎和相机第三步:初始化引擎第四步:活体检测⼈脸注册切换前置、后置摄像头尾⾔效果图激活引擎第⼀步配置APP_ID和SDK_KEYint activeCode = FaceEngine.activeOnline( ChooseFunctionActivity.this, Param.APP_ID, Param.SDK_KEY);public static final String APP_ID = "AwY6okHQHxtM92YRYSEqJQwb8cED5huPvYyMhK1w7BSo";public static final String SDK_KEY = "AF8SaLYtP3ALsmaTR55y9UXaykBZjTtMt5gwCBkUGugh";第⼆步:判断是否添加动态链接库(so⽂件与jar包)private boolean checkSoFile(String[] libraries) {File dir = new File(getApplicationInfo().nativeLibraryDir);File[] files = dir.listFiles();if (files == null || files.length == 0) {return false;}List<String> libraryNameList = new ArrayList<>();for (File file : files) {libraryNameList.add(file.getName());}boolean exists = true;for (String library : libraries) {exists &= libraryNameList.contains(library);}return exists;}第三步:判断是否申明所有权限protected boolean CheckPermissions(String[] neededPermissions) {if (neededPermissions == null || neededPermissions.length == 0) {return true;}boolean allGranted = true;for (String neededPermission : neededPermissions) {allGranted &= ContextCompat.checkSelfPermission(this, neededPermission) == PackageManager.PERMISSION_GRANTED; }return allGranted;}激活引擎代码如下if (!libraryExists) {ShowToast(getString(R.string.library_not_found));return;}if (!CheckPermissions(NEEDED_PERMISSIONS)) {ActivityCompat.requestPermissions(this, NEEDED_PERMISSIONS, ACTION_REQUEST_PERMISSIONS);return;}if (view != null) {view.setClickable(false);}Observable.create( new ObservableOnSubscribe<Integer>() {@Overridepublic void subscribe(ObservableEmitter<Integer> emitter) {RuntimeABI runtimeABI = FaceEngine.getRuntimeABI();Log.i(TAG, "subscribe: getRuntimeABI() " + runtimeABI);long start = System.currentTimeMillis();int activeCode = FaceEngine.activeOnline( ChooseFunctionActivity.this, Param.APP_ID, Param.SDK_KEY);Log.i(TAG, "subscribe cost: " + (System.currentTimeMillis() - start));emitter.onNext(activeCode);}}).subscribeOn( Schedulers.io()).observeOn( AndroidSchedulers.mainThread()).subscribe(new Observer<Integer>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(Integer activeCode) {if (activeCode == ErrorInfo.MOK) {ShowToast(getString(R.string.activation_succeeded));} else if (activeCode == ErrorInfo.MERR_ASF_ALREADY_ACTIVATED) {ShowToast(getString(R.string.already_activated));} else {ShowToast(getString(R.string.active_failed, activeCode));}if (view != null) {view.setClickable(true);}ActiveFileInfo activeFileInfo = new ActiveFileInfo();int res = FaceEngine.getActiveFileInfo(ChooseFunctionActivity.this, activeFileInfo);if (res == ErrorInfo.MOK) {Log.i(TAG, activeFileInfo.toString());}}@Overridepublic void onError(Throwable e) {ShowToast(e.getMessage());if (view != null) {view.setClickable(true);}}@Overridepublic void onComplete() {}});}⼈脸⽐对 1:N第⼀步:初始化本地⼈脸库FaceServer.getInstance().init(this);第⼆步:初始化引擎和相机public void onGlobalLayout() {previewView.getViewTreeObserver().removeOnGlobalLayoutListener(this);if (!CheckPermissions(NEEDED_PERMISSIONS)) {ActivityCompat.requestPermissions(this, NEEDED_PERMISSIONS, ACTION_REQUEST_PERMISSIONS);} else {initEngine();initCamera();}}第三步:初始化引擎private void initEngine() {ftEngine = new FaceEngine();ftInitCode = ftEngine.init(this, DetectMode.ASF_DETECT_MODE_VIDEO, ConfigUtil.getFtOrient(this),16, MAX_DETECT_NUM, FaceEngine.ASF_FACE_DETECT);frEngine = new FaceEngine();frInitCode = frEngine.init(this, DetectMode.ASF_DETECT_MODE_IMAGE, DetectFaceOrientPriority.ASF_OP_0_ONLY, 16, MAX_DETECT_NUM, FaceEngine.ASF_FACE_RECOGNITION);flEngine = new FaceEngine();flInitCode = flEngine.init(this, DetectMode.ASF_DETECT_MODE_IMAGE, DetectFaceOrientPriority.ASF_OP_0_ONLY, 16, MAX_DETECT_NUM, FaceEngine.ASF_LIVENESS);Log.i(TAG, "initEngine: init: " + ftInitCode);if (ftInitCode != ErrorInfo.MOK) {String error = getString(R.string.specific_engine_init_failed, "ftEngine", ftInitCode);Log.i(TAG, "initEngine: " + error);ShowToast(error);}if (frInitCode != ErrorInfo.MOK) {String error = getString(R.string.specific_engine_init_failed, "frEngine", frInitCode);Log.i(TAG, "initEngine: " + error);ShowToast(error);if (flInitCode != ErrorInfo.MOK) {String error = getString(R.string.specific_engine_init_failed, "flEngine", flInitCode);Log.i(TAG, "initEngine: " + error);ShowToast(error);}}第四步:活体检测private void initCamera() {DisplayMetrics metrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics);final FaceListener faceListener = new FaceListener() {@Overridepublic void onFail(Exception e) {Log.e(TAG, "onFail: " + e.getMessage());}//请求FR的回调@Overridepublic void onFaceFeatureInfoGet(@Nullable final FaceFeature faceFeature, final Integer requestId, final Integer errorCode) { //FR成功if (faceFeature != null) {// Log.i(TAG, "onPreview: fr end = " + System.currentTimeMillis() + " trackId = " + requestId);Integer liveness = livenessMap.get(requestId);//不做活体检测的情况,直接搜索if (!livenessDetect) {searchFace(faceFeature, requestId);}//活体检测通过,搜索特征else if (liveness != null && liveness == LivenessInfo.ALIVE) {searchFace(faceFeature, requestId);}//活体检测未出结果,或者⾮活体,延迟执⾏该函数else {if (requestFeatureStatusMap.containsKey(requestId)) {Observable.timer(WAIT_LIVENESS_INTERVAL, LISECONDS).subscribe(new Observer<Long>() {Disposable disposable;@Overridepublic void onSubscribe(Disposable d) {disposable = d;getFeatureDelayedDisposables.add(disposable);}@Overridepublic void onNext(Long aLong) {onFaceFeatureInfoGet(faceFeature, requestId, errorCode);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {getFeatureDelayedDisposables.remove(disposable);}});}}}//特征提取失败else {if (increaseAndGetValue(extractErrorRetryMap, requestId) > MAX_RETRY_TIME) {extractErrorRetryMap.put(requestId, 0);String msg;// 传⼊的FaceInfo在指定的图像上⽆法解析⼈脸,此处使⽤的是RGB⼈脸数据,⼀般是⼈脸模糊if (errorCode != null && errorCode == ErrorInfo.MERR_FSDK_FACEFEATURE_LOW_CONFIDENCE_LEVEL) {msg = getString(R.string.low_confidence_level);} else {msg = "ExtractCode:" + errorCode;}faceHelper.setName(requestId, getString(R.string.recognize_failed_notice, msg));// 在尝试最⼤次数后,特征提取仍然失败,则认为识别未通过requestFeatureStatusMap.put(requestId, RequestFeatureStatus.FAILED);retryRecognizeDelayed(requestId);} else {requestFeatureStatusMap.put(requestId, RequestFeatureStatus.TO_RETRY);}}}@Overridepublic void onFaceLivenessInfoGet(@Nullable LivenessInfo livenessInfo, final Integer requestId, Integer errorCode) {if (livenessInfo != null) {int liveness = livenessInfo.getLiveness();livenessMap.put(requestId, liveness);// ⾮活体,重试if (liveness == LivenessInfo.NOT_ALIVE) {faceHelper.setName(requestId, getString(R.string.recognize_failed_notice, "NOT_ALIVE"));// 延迟 FAIL_RETRY_INTERVAL 后,将该⼈脸状态置为UNKNOWN,帧回调处理时会重新进⾏活体检测retryLivenessDetectDelayed(requestId);}} else {if (increaseAndGetValue(livenessErrorRetryMap, requestId) > MAX_RETRY_TIME) {livenessErrorRetryMap.put(requestId, 0);String msg;// 传⼊的FaceInfo在指定的图像上⽆法解析⼈脸,此处使⽤的是RGB⼈脸数据,⼀般是⼈脸模糊if (errorCode != null && errorCode == ErrorInfo.MERR_FSDK_FACEFEATURE_LOW_CONFIDENCE_LEVEL) {msg = getString(R.string.low_confidence_level);} else {msg = "ProcessCode:" + errorCode;}faceHelper.setName(requestId, getString(R.string.recognize_failed_notice, msg));retryLivenessDetectDelayed(requestId);} else {livenessMap.put(requestId, LivenessInfo.UNKNOWN);}}};CameraListener cameraListener = new CameraListener() {@Overridepublic void onCameraOpened(Camera camera, int cameraId, int displayOrientation, boolean isMirror) {Camera.Size lastPreviewSize = previewSize;previewSize = camera.getParameters().getPreviewSize();drawHelper = new DrawHelper(previewSize.width, previewSize.height, previewView.getWidth(), previewView.getHeight(), displayOrientation, cameraId, isMirror, false, false);Log.i(TAG, "onCameraOpened: " + drawHelper.toString());// 切换相机的时候可能会导致预览尺⼨发⽣变化if (faceHelper == null ||lastPreviewSize == null ||lastPreviewSize.width != previewSize.width || lastPreviewSize.height != previewSize.height) {Integer trackedFaceCount = null;// 记录切换时的⼈脸序号if (faceHelper != null) {trackedFaceCount = faceHelper.getTrackedFaceCount();faceHelper.release();}faceHelper = new FaceHelper.Builder().ftEngine(ftEngine).frEngine(frEngine).flEngine(flEngine).frQueueSize(MAX_DETECT_NUM).flQueueSize(MAX_DETECT_NUM).previewSize(previewSize).faceListener(faceListener).trackedFaceCount(trackedFaceCount == null ? ConfigUtil.getTrackedFaceCount(FaceComparison_RGB.this.getApplicationContext()) : trackedFaceCount).build();}}@Overridepublic void onPreview(final byte[] nv21, Camera camera) {if (faceRectView != null) {faceRectView.clearFaceInfo();}List<FacePreviewInfo> facePreviewInfoList = faceHelper.onPreviewFrame(nv21);if (facePreviewInfoList != null && faceRectView != null && drawHelper != null) {drawPreviewInfo(facePreviewInfoList);}registerFace(nv21, facePreviewInfoList);clearLeftFace(facePreviewInfoList);if (facePreviewInfoList != null && facePreviewInfoList.size() > 0 && previewSize != null) {for (int i = 0; i < facePreviewInfoList.size(); i++) {Integer status = requestFeatureStatusMap.get(facePreviewInfoList.get(i).getTrackId());/*** 在活体检测开启,在⼈脸识别状态不为成功或⼈脸活体状态不为处理中(ANALYZING)且不为处理完成(ALIVE、NOT_ALIVE)时重新进⾏活体检测*/if (livenessDetect && (status == null || status != RequestFeatureStatus.SUCCEED)) {Integer liveness = livenessMap.get(facePreviewInfoList.get(i).getTrackId());if (liveness == null|| (liveness != LivenessInfo.ALIVE && liveness != LivenessInfo.NOT_ALIVE && liveness != RequestLivenessStatus.ANALYZING)) {livenessMap.put(facePreviewInfoList.get(i).getTrackId(), RequestLivenessStatus.ANALYZING);faceHelper.requestFaceLiveness(nv21, facePreviewInfoList.get(i).getFaceInfo(), previewSize.width, previewSize.height, FaceEngine.CP_PAF_NV21, facePreviewInfoList.get(i).getTrackId(), LivenessType.RGB); }}/*** 对于每个⼈脸,若状态为空或者为失败,则请求特征提取(可根据需要添加其他判断以限制特征提取次数),* 特征提取回传的⼈脸特征结果在{@link FaceListener#onFaceFeatureInfoGet(FaceFeature, Integer, Integer)}中回传*/if (status == null|| status == RequestFeatureStatus.TO_RETRY) {requestFeatureStatusMap.put(facePreviewInfoList.get(i).getTrackId(), RequestFeatureStatus.SEARCHING);faceHelper.requestFaceFeature(nv21, facePreviewInfoList.get(i).getFaceInfo(), previewSize.width, previewSize.height, FaceEngine.CP_PAF_NV21, facePreviewInfoList.get(i).getTrackId());// Log.i(TAG, "onPreview: fr start = " + System.currentTimeMillis() + " trackId = " + facePreviewInfoList.get(i).getTrackedFaceCount());}}}}@Overridepublic void onCameraClosed() {Log.i(TAG, "onCameraClosed: ");}@Overridepublic void onCameraError(Exception e) {Log.i(TAG, "onCameraError: " + e.getMessage());}@Overridepublic void onCameraConfigurationChanged(int cameraID, int displayOrientation) {if (drawHelper != null) {drawHelper.setCameraDisplayOrientation(displayOrientation);}Log.i(TAG, "onCameraConfigurationChanged: " + cameraID + " " + displayOrientation);}};cameraHelper = new CameraHelper.Builder().previewViewSize(new Point(previewView.getMeasuredWidth(), previewView.getMeasuredHeight())).rotation(getWindowManager().getDefaultDisplay().getRotation()).specificCameraId(rgbCameraID != null ? rgbCameraID : Camera.CameraInfo.CAMERA_FACING_FRONT).isMirror(false).previewOn(previewView).cameraListener(cameraListener).build();cameraHelper.init();cameraHelper.start();}⼈脸注册private void registerFace(final byte[] nv21, final List<FacePreviewInfo> facePreviewInfoList) {if (registerStatus == REGISTER_STATUS_READY && facePreviewInfoList != null && facePreviewInfoList.size() > 0) {registerStatus = REGISTER_STATUS_PROCESSING;@Overridepublic void subscribe(ObservableEmitter<Boolean> emitter) {boolean success = FaceServer.getInstance().registerNv21(FaceComparison_RGB.this, nv21.clone(), previewSize.width, previewSize.height,facePreviewInfoList.get(0).getFaceInfo(), "registered" + faceHelper.getTrackedFaceCount());emitter.onNext(success);}}).subscribeOn( putation()).observeOn( AndroidSchedulers.mainThread()).subscribe(new Observer<Boolean>() {@Overridepublic void onSubscribe(Disposable d) {}/**判断是否注册成功*/@Overridepublic void onNext(Boolean success) {//String result = success ? "register success!" : "register failed!";//ShowToast(result);// AlertDialog.Builder builder = new AlertDialog.Builder( FaceComparison_RGB.this );// AlertDialog dialog = builder.create();// View AlertDialog_View = View.inflate( FaceComparison_RGB.this,yout.register_result,null );// dialog.setView( AlertDialog_View );// dialog.show();ShowPopWindows(success);registerStatus = REGISTER_STATUS_DONE;}@Overridepublic void onError(Throwable e) {e.printStackTrace();ShowToast("register failed!");ShowFailPopWindows();registerStatus = REGISTER_STATUS_DONE;}@Overridepublic void onComplete() {}});}}切换前置、后置摄像头public void switchCamera(View view) {if (cameraHelper != null) {boolean success = cameraHelper.switchCamera();if (!success) {ShowToast(getString(R.string.switch_camera_failed));} else {ShowToast(getString(R.string.notice_change_detect_degree));}}}尾⾔本⽰例⼯程基于官⽅Demo改编⽽成,若有唐突之处,望君海涵到此这篇关于Android 实例开发基于ArcSoft实现⼈脸识别的⽂章就介绍到这了,更多相关Android ⼈脸识别内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
AndroidFaceDetector实现人脸检测功能
AndroidFaceDetector实现⼈脸检测功能关于⼈脸检测被折磨了半个⽉,前2周开需求会时需要要做⼀个“⼈脸认证上传功能,具体是打开前置摄像头,识别出⽤户的脸并且脸在⼀个指定的圆圈内然后⾃动保存这个状态的图像待⽤户是否确定上传”。
听到这个需求我第⼀时间想到⽐较专业的图形处理库OpenCV。
去github上⾯搜了⼀下关于openCV识别⼈脸的demo,样例确实有点多,也确实是可以实现但是OpenCV库实在是有点⼤8M,⽤这个库估计会被构架师说死。
然后我还搜过其它的第三⽅库(虹软,face++,阿⾥云⼈脸检测)这⼏款都不是省油的灯⼀款需要兼容android5.0以上,其它2款都是收费版,⾄于阿⾥云更厉害了不⽀持离线检测。
后来才选择了google⾃带api,⽹上⼀搜发现google 的⼀个类android.hardware.Camera⾥⾯有已经帮你封装好的⼈脸检测的api有这⽅⾯了解的同学可以参考⼀下点击打开链接。
我开始也是使⽤这种⽅式实现的,磕磕碰碰的写完后最终发现合乎需求,后来⾃⼰打算测试⼀下机⼦兼容性,拿了⼀台华为机⼦⼀测试,发现⼈脸的那个接⼝没有任何回调(nexus6P调⽤还会发现闪退,打log发现是ndk层抛出来的),⼼马上沉⼊⾕底。
最后发现好像没有啥捷径可⾛了,只好⽼实实使⽤android.media.FaceDetector进⾏开发。
这种⽅式的使⽤的思路是,使⽤Camera+TextureView(鉴于对开发时间紧,对已过时有点了解就没有使⽤Camera2)进⾏预览,通过设置PreviewCallback实时抓取每⼀帧图像进⾏检测是否合格。
图像预览本⼈推荐google关于Camera使⽤demo进⾏修改,因为在实际中有很多机型未必都能合乎预想(本⼈也确实被坑过,⾃⼰封装的Camera发现跑在⼀些机⼦上图像⽅向是反向的。
当然如果对Camera很熟悉那也是可以⾃⼰写的)。
好了啰嗦了⼀⼤堆下⾯来看看正题先看看集成到app⾥⾯的实际效果这⾥说明不是APP卡,我⽤的录屏软件共享桌⾯时⼀卡⼀卡的⾸先图像预览改⾃google demo,demo拿过来是不能直接使⽤的,⾥⾯需要⾃⼰⼿动添加每⼀帧的回调,代码如下(这⾥直接贴图了,更直观,稍后我会把demo发出来)google CameraDemo主要改了这么多,下⾯来看看在获取到每⼀帧时对图像的处理跟识别再看看FaceThread做的Bitmap转换,Bitmap旋转及对Bitmap是否有⼈脸的识别好了,主要逻辑就这些吧,关于FaceDetector具体使⽤,这是我写好的demo(上⾯演⽰是把demo验证没问题情况拷贝到项⽬中,最终实现需要按照你的需求来。
Android开发中的人脸检测和人脸识别技术(八)
Android开发中的人脸检测和人脸识别技术近年来,随着移动设备的普及和功能的提升,人脸检测和人脸识别技术在Android开发中得到了广泛应用。
人脸检测和人脸识别技术在安全、娱乐、商业等领域都有着重要的作用。
本文将分析Android 开发中的人脸检测和人脸识别技术的应用和发展。
一、人脸检测技术在Android开发中的应用人脸检测技术是通过分析图像或视频流中的人脸特征来确定是否存在人脸的一种模式识别技术。
在Android应用中,人脸检测技术可以用于解锁手机、人脸识别支付、人脸表情识别等领域。
首先,人脸解锁是近年来Android设备中常见的功能之一。
通过使用人脸检测技术,用户可以用自己的面部特征来解锁手机,提供了更加方便快捷的解锁方式,同时也增加了手机的安全性。
其次,人脸识别支付是另一个应用人脸检测技术的领域。
通过将人脸特征与用户的支付账号绑定,用户可以通过人脸识别完成支付,免去了繁琐的输入账号密码的过程,提高了支付的便捷性。
另外,人脸表情识别也是人脸检测技术的一个重要应用。
通过分析人脸表情特征,可以判断用户的情绪状态,在游戏、社交网络等领域都有广泛应用。
比如,一些游戏会根据玩家的表情变化来改变游戏难度或提供不同的游戏体验。
二、人脸识别技术在Android开发中的应用人脸识别技术是通过对人脸图像进行特征提取和匹配,从而达到识别身份的目的。
在Android应用中,人脸识别技术可以应用于人脸识别登录、人脸识别门禁等领域。
首先,人脸识别登录是一种替代传统账号密码登录方式的技术,通过分析用户的面部特征来验证身份。
用户只需将手机摄像头对准自己的脸部,即可完成登录操作,无需输入繁琐的账号密码,提高了系统的安全性和用户的使用便捷性。
其次,人脸识别门禁系统是一种常见的控制进出人员的方式。
通过在门禁系统中集成人脸识别技术,可以实现对员工或者访客身份的自动识别,避免了传统门禁卡被转借、丢失等问题,提高了门禁系统的安全性。
如何使用Android的图像识别和人脸识别功能进行开发(一)
如何使用Android的图像识别和人脸识别功能进行开发一、引言随着科技的发展和人们对智能手机的需求增加,移动应用的开发变得日益重要。
其中,图像识别和人脸识别技术的应用越来越受到开发者的重视。
本文将介绍如何使用Android平台的图像识别和人脸识别功能进行应用开发,以帮助开发者更好地利用这些功能。
二、Android平台图像识别功能的使用在Android平台上,图像识别功能可以通过各种第三方库和API实现。
其中,最为常用的是Google提供的Google Cloud Vision API。
该API可以通过上传图片来分析图像内容,包括标签、成分和其它相关信息。
实际应用中,我们可以将图像识别功能应用于多个场景,如物体识别、文字识别、二维码识别等。
图像识别功能的实现一般包括以下几个步骤:1. 注册并获取Google Cloud Vision API的开发者密钥;2. 在Android应用中集成相关库,并使用密钥进行验证;3. 将需要进行图像识别的图片通过API发送到服务器,并接收返回的结果;4. 解析服务器返回的JSON数据,提取所需的图像识别信息。
三、Android平台人脸识别功能的使用人脸识别是一种基于生物特征识别技术的应用,其在移动应用中的应用场景也越来越广泛。
Android平台上实现人脸识别功能可以利用FaceDetector类和Face类,它们是Android SDK中提供的默认库。
使用人脸识别功能一般需要遵循以下步骤:1. 通过Camera接口获取到摄像头的预览图像;2. 创建FaceDetector对象,并设置需要识别的最大人脸数量;3. 将预览图像转换为Bitmap,并通过FaceDetector进行人脸识别;4. 分析识别结果,如人脸的位置、大小、特征等,并进行进一步的处理。
需要注意的是,人脸识别功能在Android平台上的实现还需要考虑到摄像头的适配和权限申请等问题。
此外,为了提高识别的准确性,我们可以结合深度学习和神经网络等技术来进行人脸特征的提取和比对。
如何使用Android的图像识别和人脸识别功能进行开发(八)
现在的移动智能设备已经具备了强大的图像识别和人脸识别功能,这为开发者们带来了更多的可能性。
特别是在Android平台上,利用Android的图像识别和人脸识别功能进行开发已经变得更加简单和便捷。
本文将探讨如何充分利用Android的这些功能进行应用开发。
一、图像识别功能的开发首先,我们来讨论如何使用Android的图像识别功能进行开发。
Android提供了一系列的API和工具,可以帮助我们高效地实现图像识别功能。
下面是一些关键的步骤和技术。
1. 资源准备在进行图像识别之前,我们首先需要收集大量的图像数据作为训练集。
这些图像数据可以分为不同的类别,如动物、植物、物体等。
我们可以通过网络爬取和用户上传等方式来获取这些数据。
同时,还需要对这些数据进行预处理,如图像剪裁、大小调整、灰度化等。
2. 特征提取特征提取是图像识别的关键环节,它可以将图像的关键特征提取出来,从而进行分类和识别。
在Android中,我们可以使用OpenCV等开源库来实现特征提取的功能。
这些库提供了各种图像处理和计算机视觉算法,如边缘检测、颜色直方图等。
我们可以根据具体的需求选择适合的算法进行特征提取。
3. 模型训练与优化在进行图像识别之前,我们需要先训练一个模型。
模型是由大量的样本数据训练得到的,它可以根据输入的图像数据进行分类和识别。
在Android中,我们可以使用机器学习框架TensorFlow Lite来进行模型的训练和优化。
TensorFlow Lite提供了简洁高效的API和工具,可以帮助我们快速搭建和优化模型。
4. 应用集成当模型训练完成后,我们就可以将其应用到Android应用程序中了。
Android提供了一系列的图像处理和识别API,如Camera API、ImageReader API等,可以帮助我们获取摄像头数据、读取图像等。
我们可以将这些API与我们训练好的模型进行集成,从而实现图像识别的功能。
二、人脸识别功能的开发除了图像识别功能,Android平台还为开发者提供了强大的人脸识别功能。
android opencv facedetectyn 用法
android opencv facedetectyn 用法全文共四篇示例,供读者参考第一篇示例:Android中使用OpenCV进行人脸检测的方法是通过使用OpenCV库中的人脸检测算法来识别图像中的人脸。
OpenCV是一个开源的计算机视觉库,它提供了很多强大的图像处理和计算机视觉算法,包括人脸检测。
人脸检测是计算机视觉领域中的一个基础问题,它通常包括在一张图像中检测出所有的人脸,并标记出它们的位置。
人脸检测在很多应用中都被广泛使用,比如人脸识别、人脸表情识别、人脸跟踪等。
在Android应用中使用OpenCV进行人脸检测首先需要在项目中引入OpenCV库。
可以通过gradle添加依赖来引入OpenCV库,如下所示:implementation 'org.opencv:opencv-android:3.4.1'然后在代码中进行初始化OpenCV库,在Activity的onCreate 方法中调用OpenCVLoader.initDebug()方法进行初始化,如下所示:if (!OpenCVLoader.initDebug()) {Log.e("OpenCV", "初始化失败");} else {Log.d("OpenCV", "初始化成功");}}初始化成功后就可以使用OpenCV库中的人脸检测算法来进行人脸检测了。
OpenCV提供了CascadeClassifier类来实现人脸检测,它可以加载已经训练好的人脸检测器,如haarcascade_frontalface_default.xml。
在使用CascadeClassifier进行人脸检测时,首先需要创建一个CascadeClassifier对象并加载人脸检测器,如下所示:CascadeClassifier faceCascade = new CascadeClassifier();faceCascade.load(context.getResources().openRawResource(R.ra w.haarcascade_frontalface_default));然后可以使用CascadeClassifier的detectMultiScale方法来进行人脸检测,它会返回检测到的人脸的矩形区域。
如何使用Android的图像识别和人脸识别功能进行开发
文章主题:如何使用Android的图像识别和人脸识别功能进行开发引言:近年来,随着人工智能技术的快速发展,图像识别和人脸识别已经成为了一个热门研究方向。
而作为移动端主流操作系统之一的Android也不例外,已经提供了图像识别和人脸识别的相关功能接口。
本文将向你介绍如何使用Android的图像识别和人脸识别功能进行开发。
一、图像识别技术图像识别技术的背景图像识别技术是指通过计算机视觉技术和机器学习算法,对输入的图像进行分析和理解,从而识别出图像中的目标物体。
这种技术不仅可以应用于安防监控、智能交通等领域,还在社交媒体、智能手机等普通用户端应用中得到广泛应用。
在Android上使用图像识别技术在Android上使用图像识别技术,你可以借助Google提供的机器学习库TensorFlow Lite进行开发。
TensorFlow Lite是专门为移动设备和嵌入式设备设计的轻量级机器学习框架,可以帮助开发者在移动端应用中快速集成图像识别功能。
同时,TensorFlow Lite还提供了预训练好的模型供开发者使用,省去了自己训练模型的繁琐过程。
第二、人脸识别技术人脸识别技术的背景人脸识别技术是指通过对人脸进行特征提取和匹配,从而识别出人脸中的个体身份。
这种技术在人证合一、刷脸支付等场景中已经得到了广泛应用,并且在移动端设备上也逐渐普及。
在Android上使用人脸识别技术要在Android上开发人脸识别功能,你可以使用Google提供的移动端人脸识别库Google Face Detection API。
这个API对于静态图像和实时视频流中的人脸识别都提供了支持,可以检测出人脸的位置和姿态,并提取出人脸的特征点,如眼睛、鼻子等。
同时,你还可以借助OpenCV库对人脸特征进行更加详细的分析和处理。
结语:通过本文的介绍,我们了解到了在Android上使用图像识别和人脸识别功能的方法和工具。
随着人工智能技术的不断发展,这些功能已经成为移动应用开发的重要组成部分,为用户带来了更加智能和便捷的体验。
android人脸识别原理
android人脸识别原理Android人脸识别原理1. 介绍人脸识别技术在Android设备上得到了广泛应用,可以用于人脸解锁、人脸支付等多种场景。
本文将从浅入深,解释Android人脸识别的原理和工作流程。
2. 基本原理Android人脸识别的基本原理是通过分析人脸图像中的特征点和特征区域来判断身份。
以下是Android人脸识别的基本工作流程:1.检测人脸:首先,Android设备会使用摄像头捕捉人脸图像。
然后,通过人脸检测算法,检测出图像中的人脸位置和大小。
2.提取特征:接下来,Android设备会使用人脸特征提取算法,分析人脸图像中的特征点和特征区域。
这些特征包括眼睛、鼻子、嘴巴等部位的位置和形状。
3.特征匹配:Android设备会将提取到的人脸特征与已存储的人脸特征库进行比对。
比对算法会计算两个特征之间的相似度,并判断是否匹配。
4.判断身份:最后,Android设备会根据相似度结果来判断人脸是否属于已存储的用户身份。
如果相似度超过设定的阈值,就认为人脸匹配成功。
3. 人脸检测算法人脸检测算法是Android人脸识别的第一步,用于确定图像中人脸的位置和大小。
以下是一些常用的人脸检测算法:•Viola-Jones算法:一种经典的基于特征分类器的人脸检测算法,通过使用Haar-like特征和级联分类器来实现高效的人脸检测。
•基于深度学习的算法:近年来,深度学习算法在人脸检测领域取得了巨大的突破。
基于深度神经网络的算法能够准确地检测出多种姿态、光照条件下的人脸。
4. 人脸特征提取算法人脸特征提取算法用于提取人脸图像中的特征点和特征区域,以便进行后续的比对。
以下是一些常用的人脸特征提取算法:•主成分分析(PCA):该算法通过计算人脸图像的主成分来提取特征,具有较好的鲁棒性和识别性能。
•局部二值模式(LBP):该算法将人脸图像分割为小的区域,然后对每个区域中的像素进行二值化,最后使用直方图来描述整个人脸图像的特征。
Android开发中的人脸检测和人脸识别技术(九)
Android开发中的人脸检测和人脸识别技术人脸检测和人脸识别技术在Android开发中扮演着重要的角色,它们不仅在安全领域有着广泛的应用,还在社交、娱乐等方面提供了丰富的体验。
本文将深入探讨Android开发中的人脸检测和人脸识别技术,并探讨它们的原理和应用。
一、人脸检测技术人脸检测技术是人脸识别的基础,它可以确定一张图像或视频中是否存在人脸,并将其定位出来。
在Android开发中,常用的人脸检测技术包括基于特征的方法、神经网络方法和级联分类器方法。
基于特征的方法通过提取图像中的特征点或特征向量来进行人脸检测。
这些特征点可以是眼睛、鼻子、嘴巴等人脸的重要部位,在图像中具有一定的特征规律,通过对这些特征进行检测和匹配,可以确定图像中是否存在人脸。
神经网络方法通过训练神经网络模型来实现人脸检测。
神经网络模型通常会通过大量的样本图像进行训练,学习到人脸和非人脸的特征和模式,从而可以在未知图像中进行人脸检测。
这种方法能够适应不同光照、角度和表情等变化,具有较好的鲁棒性。
级联分类器方法是一种基于机器学习的人脸检测方法,常用的算法包括AdaBoost和Haar-like特征分类器。
通过训练分类器模型,可以将图像中的人脸和非人脸进行分离,实现人脸的检测。
二、人脸识别技术人脸识别技术是在人脸检测的基础上,对人脸图像进行进一步的分析和识别。
在Android开发中,常用的人脸识别技术包括特征脸方法、局部二值模式方法和深度学习方法。
特征脸方法是一种基于统计学的人脸识别方法,它通过主成分分析或线性判别分析等技术,将图像中的人脸投影到一个低维空间中,然后通过比较投影后的特征向量,实现对人脸的识别。
局部二值模式方法是一种基于纹理特征的人脸识别方法,它通过提取图像局部的纹理特征,将其表示为二值模式,然后通过比较不同图像之间的纹理特征,实现对人脸的识别。
深度学习方法是目前人脸识别领域最热门的技术之一,它通过构建深度神经网络模型,并通过大规模训练样本的学习来实现对人脸的识别。
android java opencv facedetectyn 用法
android java opencv facedetectyn用法在Android平台上使用OpenCV库进行人脸识别是一项涉及多个步骤的任务。
以下是一个关于如何使用OpenCV的Java接口进行人脸检测的基本指南。
1. 导入OpenCV库首先,你需要在你的Android项目中导入OpenCV库。
这通常通过在你的build.gradle 文件中添加依赖来完成。
确保你已经下载并安装了OpenCV的Android SDK。
2. 初始化OpenCV在你的应用程序中,你需要初始化OpenCV库。
这通常在主活动(MainActivity)的onCreate方法中完成。
你可以调用OpenCVLoader.initDebug()来初始化OpenCV库。
3. 加载人脸检测器OpenCV提供了多种人脸检测方法,其中最常见的是Haar特征级联分类器。
你需要加载一个预训练的XML文件,该文件包含了用于人脸检测的特征和参数。
javaCascadeClassifier faceDetector = new CascadeClassifier(getContext().getResources().getIdentifier("lbpcascade_frontal face", "raw", getContext().getPackageName()));if (faceDetector.empty()) {Log.e(TAG, "Failed to load cascade classifier");// 处理加载失败的情况}4. 处理图像接下来,你需要从摄像头或图像库获取图像,并将其转换为OpenCV可以处理的格式(通常是Mat对象)。
5. 进行人脸检测使用加载的人脸检测器在图像上检测人脸。
这通常通过调用detectMultiScale方法完成。
javaMatOfRect faceDetections = new MatOfRect();faceDetector.detectMultiScale(grayImage, faceDetections);其中grayImage是一个灰度图像,因为Haar特征级联分类器通常在灰度图像上运行得更快。
Android开发中的人脸检测和人脸识别技术(三)
Android开发中的人脸检测和人脸识别技术随着移动设备的普及,Android开发已成为许多开发者的首选。
而在Android开发中,人脸检测和人脸识别技术也越来越受到关注和应用。
本文将探讨人脸检测和人脸识别技术在Android开发中的应用,并介绍一些相关的技术和工具。
一、人脸检测技术的原理和应用人脸检测技术是通过图像处理和模式识别算法来识别图像中的人脸区域。
其原理主要包括图像采集、预处理、特征提取和分类器生成等几个步骤。
在Android开发中,人脸检测技术可以应用于许多场景,例如人脸识别登录、人脸表情识别、面部特征提取等。
通过利用设备摄像头获取用户的人脸信息,并结合相关的算法进行处理和分析,可以实现各种有趣且实用的功能。
二、人脸识别技术的原理和应用人脸识别技术是一种基于人脸生物特征的自动识别技术,其原理是对已知人脸特征数据进行比对和匹配,从而判断输入图像中的人脸是属于哪个人。
在Android开发中,人脸识别技术可以应用于许多领域,如人脸支付、人脸考勤、人脸门禁等。
通过将用户的人脸信息和相关的身份信息进行关联,可以实现更安全和便捷的身份认证和授权。
三、常用的人脸检测和人脸识别技术工具1. OpenCVOpenCV是一个开源的计算机视觉库,提供了许多用于图像处理和模式识别的函数和工具。
在Android开发中,可以利用OpenCV提供的人脸检测和人脸识别算法,快速实现相关功能。
2. DlibDlib是一个C++库,提供了许多用于机器学习和计算机视觉的算法和工具。
在Android开发中,可以利用Dlib提供的人脸检测和人脸识别算法,实现更准确和高效的人脸处理应用。
3. Google Play Services Vision APIGoogle Play Services Vision API是Google提供的一组图像处理工具和API,包括人脸检测和人脸识别等功能。
通过调用Vision API,可以在Android应用中轻松实现人脸检测和人脸识别功能。
Android之人脸识别
Android之⼈脸识别
**前⾔**
⼈⼯智能时代快速来临,其中⼈脸识别是当前⽐较热门的技术,在国内也越来越多的运⽤,例如刷脸打卡、刷脸App,⾝份识别,⼈脸门禁等等。
当前的⼈脸识别技术分为WEBAPI和SDK调⽤两种法⽅式,WEBAPI需要实时联⽹,SDK调⽤可以离线使⽤。
Android作为⼀个⽐较⼴泛的平台,如何实现⼈脸识别功能呢?
**Android⼈脸识别**
Android实现⼈脸识别可以通过google原⽣⾃带或第三⽅提供,googel⾃带的只能识别静态图⽚,第三⽅提供的功能⽐较强⼤。
**google官⽅⾃带**
google通过FaceDetector类实现⼈脸识别功能,查看官⽅说明:Identifies the faces of people in a Bitmap graphic object.
**识别结果**
第三⽅SDK提供
Opencv
虹软免费SDK
Face++
科⼤讯飞⼈脸识别。
Android开发人脸识别登录功能
Android开发⼈脸识别登录功能近来,很多公司的APP都实现了⼈脸识别登录的功能。
今天呢,银鹏带⼤家从头到尾做⼀下这个⼈脸识别登录。
⾸先呢,我们需要采⽤⼀个拥有⼈脸识别算法的平台,这边我建议使⽤虹软的⼈脸识别,因为我个⼈⽤的就是这个,关键有⼀点好处,就是免费。
注册链接:。
注册完毕以后,话不多说,我们进⼊流程。
第⼀步:在虹软平台创建应⽤直接安装SDK查看激活码下载虹软识别库地址:下载好之后进⾏依赖添加:implementation 'com.github.tyhjh:PermissionUtil:v1.0.5'implementation 'com.github.tyhjh:picturePickUtil:v1.0.6'implementation project(':arclibrary')接下来进⼊步骤详解:第⼀步:初始化,在Application⾥进⾏:private void initArcFace() {new AcrFaceManagerBuilder().setContext(this).setFreeSdkAppId(Constants.FREESDKAPPID).setFdSdkKey(Constants.FDSDKKEY).setFtSdkKey(Constants.FTSDKKEY).setFrSdkKey(Constants.FRSDKKEY).setLivenessAppId(Constants.LIVENESSAPPID).setLivenessSdkKey(Constants.LIVENESSSDKKEY).create();}温馨提⽰:Constants为存储虹软信息的常量类,主要存放APPID等信息,这些信息在查看激活码⾥⾯有。
public class Constants {public static String FREESDKAPPID = "ELVF52xrBj21FKQxXygS6HvkdoMzeUVaAcBDtLa1vu4F";public static String FDSDKKEY = "59nZG5b13BNroFAyvMW74PEMD5Ke5ieWiZK1n6YVTEoe";public static String FTSDKKEY = "59nZG5b13BNroFAyvMW74PEE3g4RPbX4UPAn1XV7Hcra";public static String FRSDKKEY = "59nZG5b13BNroFAyvMW74PEqrgNHG1iZPTi78m1mctQt";public static String IDCARDAPPID = "ELVF52xrBj21FKQxXygS6HvkdoMzeUVaAcBDtLa1vu4F";public static String IDCARDSDKKEY = "";public static String LIVENESSAPPID = "ELVF52xrBj21FKQxXygS6HvkdoMzeUVaAcBDtLa1vu4F";public static String LIVENESSSDKKEY = "59nZG5b13BNroFAyvMW74PEMD5Ke5ieWiZK1n6YVTEoe";}有些需要下载arc⽂件⾥的代码,这是下载地址:【主要业务逻辑我这边都放在LivenessActivity⾥】⼈脸识别注册LivenessActivity.flag = 1;startActivity(new Intent(MainActivity.this, LivenessActivity.class));⼈脸识别登录LivenessActivity.flag = 2;startActivity(new Intent(MainActivity.this, LivenessActivity.class));以上只是本地注册和登录,咱们需要和服务端进⾏交互,那么注册时,就要绑定faceId,对faceId进⾏存储,当⽤户对⼈脸识别开启后,进⾏本地⼈脸识别登录校验,成功后,请求刷脸登录接⼝。
如何使用Android的图像识别和人脸识别功能进行开发(十)
使用Android的图像识别和人脸识别功能进行开发随着人工智能技术的快速发展,图像识别和人脸识别已成为Android开发中的热门领域。
本文将探讨如何使用Android的图像识别和人脸识别功能进行开发,帮助开发者了解相关技术和实现方法。
1. 图像识别技术背景图像识别是一种通过计算机对图像进行分析,理解图像中所包含的信息的技术。
在Android开发中,可以利用图像识别技术实现各种有趣的功能,如图像搜索、图像标签、图像分类等。
为了实现这些功能,我们可以使用现有的图像识别引擎,如Google Cloud Vision API、Microsoft Azure Computer Vision API等。
2. 图像识别功能开发方法在Android开发中,使用图像识别功能涉及到图像的获取、传输和处理。
首先,我们需要通过Android设备的摄像头或者从图库中选择图像来获取图像数据。
接下来,我们可以使用网络传输图像数据到服务器端,通过调用图像识别引擎的API来实现图像识别。
服务器端返回的结果可以包含图像的标签、分类、文字信息等。
最后,我们可以将识别结果展示在Android应用的界面上。
3. 人脸识别技术介绍人脸识别是一种通过对人脸进行分析,判断人脸身份的技术。
在Android开发中,人脸识别功能可以应用于人脸解锁、人脸支付、人脸表情识别等方面。
与图像识别不同,人脸识别需要获取图像中的人脸数据,并进行面部特征分析,以达到识别的目的。
4. 人脸识别功能开发方法为了实现人脸识别功能,我们可以使用Android的内置人脸识别库,如Google的Firebase ML Kit和OpenCV库。
这些库提供了建模、检测、识别等人脸相关的功能。
在使用这些库进行开发时,我们首先需要获取图像中的人脸数据,然后进行人脸特征提取和比对,最后判断人脸的身份。
5. 图像识别与人脸识别的结合应用有了图像识别和人脸识别的基础知识后,我们可以将这两种技术结合起来,开发一些有趣的应用。
虹软人脸识别sdk使用-android(一)
虹软⼈脸识别sdk使⽤-android(⼀)在这篇⽂章中已经介绍了如何使⽤camera+surfaceview在此基础上我们介绍如何接⼊虹软的⼈脸识别功能。
⾸先⾃⼰去注册虹软的开发者账号,并⾃⾏下载SDK,SDK的APP_ID和SDK_KEY是唯⼀的,可以激活⼀台设备,完成认证后,可以⽤于激活100台设备。
⼀、SDK接⼊配置1、在官⽅⽂档中可以看到主要将⼏个jar包和⼏个so⽂件接⼊到你的项⽬⽬录下。
完成这步就算完成了接⼊SDK。
2、激活引擎我们在⾃定义的camera的项⽬中,将激活与初始化封装起来,重新写init()函数private void init() {/** 激活* */String APP_ID = "换成⾃⼰的ID";String SDK_KEY = "换成⾃⼰的key";int code = FaceEngine.activeOnline(MainActivity_l.this, APP_ID, SDK_KEY);if (code == ErrorInfo.MOK) {Log.i(TAG, "activeOnline success");Toast.makeText(MainActivity_l.this, "激活成功", Toast.LENGTH_SHORT).show();} else if (code == ErrorInfo.MERR_ASF_ALREADY_ACTIVATED) {Log.i(TAG, "already activated");Toast.makeText(MainActivity_l.this, "已经激活", Toast.LENGTH_SHORT).show();} else {Log.i(TAG, "activeOnline failed, code is : " + code);}/** 初始化* */faceEngine = new FaceEngine();// int code_init = faceEngine.init(getApplicationContext(),DetectMode.ASF_DETECT_MODE_VIDEO, DetectFaceOrientPriority.ASF_OP_0_ONLY, scale,maxFaceNum, initMask);int code_init = faceEngine.init(getApplicationContext(), DetectMode.ASF_DETECT_MODE_VIDEO, DetectFaceOrientPriority.ASF_OP_ALL_OUT, scale, maxFaceNum, initMask);if (code_init != ErrorInfo.MOK) {Toast.makeText(this, "init failed, code is : " + code,Toast.LENGTH_SHORT).show();} else {Log.i(TAG, "init success");Toast.makeText(MainActivity_l.this, "初始化成功", Toast.LENGTH_SHORT).show();}}View Code这样我们就完成了如何激活与初始化3、属性检测我们使⽤虹软SDK主要是使⽤他进⾏⼈脸追踪和⼈脸识别等功能,⽐如画⼈脸框,显⽰性别,年龄,⼈脸数,是否活体等功能,所以我们继续在init()添加功能/** 检测属性* */Camera camera = CameraUtils.getmCamera();camera.setDisplayOrientation(90);DisplayMetrics metrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics);final Camera.Parameters parameters = camera.getParameters();parameters.setPreviewFormat(ImageFormat.NV21);camera.setParameters(parameters);camera.setPreviewCallback(new Camera.PreviewCallback() {@Overridepublic void onPreviewFrame(byte[] nv21, Camera camera) {// 这⾥⾯的Bytes的数据就是NV21格式的数据previewSize = camera.getParameters().getPreviewSize();/** 显⽰⼈脸个数* */faceInfoList = new ArrayList<>();// long start = System.currentTimeMillis();int code = faceEngine.detectFaces(nv21, previewSize.width, previewSize.height,FaceEngine.CP_PAF_NV21, faceInfoList);if (code == ErrorInfo.MOK && faceInfoList.size() > 0) {Log.i(TAG, "detectFaces, face num is : " + faceInfoList.size());// Toast.makeText(MainActivity.this,"检测成功",Toast.LENGTH_SHORT).show();} else {Log.i(TAG, "no face detected, code is : " + code);// Toast.makeText(MainActivity.this,"检测失败",Toast.LENGTH_SHORT).show();}face_num.setText("⼈脸数:" + faceInfoList.size());/** 显⽰年龄* */processMask = FaceEngine.ASF_AGE | FaceEngine.ASF_GENDER | FaceEngine.ASF_FACE3DANGLE | FaceEngine.ASF_LIVENESS;int faceProcessCode = faceEngine.process(nv21, previewSize.width, previewSize.height,FaceEngine.CP_PAF_NV21, faceInfoList, processMask);if (faceProcessCode == ErrorInfo.MOK) {Log.i(TAG, "process success");// Toast.makeText(MainActivity.this,"属性成功",Toast.LENGTH_SHORT).show();} else {Log.i(TAG, "process failed, code is : " + faceProcessCode);// Toast.makeText(MainActivity.this,"属性失败",Toast.LENGTH_SHORT).show();}List<AgeInfo> ageInfoList = new ArrayList<>();int ageCode = faceEngine.getAge(ageInfoList);// 获取第⼀个⼈脸的年龄信息,多⼈脸情况进⾏循环即可if (ageCode == ErrorInfo.MOK && ageInfoList.size() > 0) {if (ageInfoList.size() > 0) {Log.i(TAG, "age of the first face is : " + ageInfoList.get(0).getAge());// age.setText("年龄:"+ageInfoList.get(0).getAge());} else {Log.i(TAG, "no face processed");// age.setText("年龄:--");}} else {Log.i(TAG, "get age failed, code is : " + ageCode);}if (ageInfoList.size() == 1) {age.setText("年龄:" + ageInfoList.get(0).getAge());}if (ageInfoList.size() == 2){age.setText("年龄:"+ageInfoList.get(0).getAge()+" ,"+ageInfoList.get(1).getAge());}if (ageInfoList.size() == 0) {age.setText("年龄:--");}/** 显⽰性别* */List<GenderInfo> genderInfoList = new ArrayList<>();int genderCode = faceEngine.getGender(genderInfoList);// 获取第⼀个⼈脸的性别信息,多⼈脸情况进⾏循环即可if (genderCode == ErrorInfo.MOK) {if (genderInfoList.size() > 0) {Log.i(TAG, "gender of the first face is : " +genderInfoList.get(0).getGender());} else {Log.i(TAG, "no face processed");}} else {Log.i(TAG, "get gender failed, code is : " + genderCode);}if (genderInfoList.size() > 0 && genderInfoList.get(0).getGender() == 0) {gender.setText("年龄:M");}if (genderInfoList.size() > 0 && genderInfoList.get(0).getGender() == 1) {gender.setText("年龄:F");}if (genderInfoList.size() == 2 ){gender.setText("年龄:"+gen(genderInfoList.get(0).getGender())+gen(genderInfoList.get(1).getGender()));}if (genderInfoList.size() == 0) {gender.setText("年龄:--");}/** 活体* */List<LivenessInfo> livenessInfoList = new ArrayList<>();int livenessCode = faceEngine.getLiveness(livenessInfoList);// RGB活体不⽀持多⼈脸,因此只能拿第1个活体信息if (livenessCode == ErrorInfo.MOK) {if (livenessInfoList.size() > 0) {Log.i(TAG, "liveness of the first face is : " +livenessInfoList.get(0).getLiveness());} else {Log.i(TAG, "no face processed");}} else {Log.i(TAG, "get liveness failed, code is : " + livenessCode);}if (livenessInfoList.size() > 0 && livenessInfoList.get(0).getLiveness() == 1) {liveness.setText("活体:Y");} else {liveness.setText("活体:--");}if (livenessInfoList.size() == 2 ){liveness.setText("活体:"+Live(livenessInfoList.get(0).getLiveness())+Live(livenessInfoList.get(1).getLiveness()));}View Code所以写完这些就完成了检测⼈脸数,年龄等。
android人脸识别API
摘要:通过两个主要的API,Android提供了一个直接在位图上进行脸部检测的方法,这两个API分别是android.media.FaceDetector和android.media.FaceDetector.Face,已经包含在Android官方API中。
通过两个主要的API,Android提供了一个直接在位图上进行脸部检测的方法,这两个API分别是android.media.FaceDetector和android.media.FaceDetector.Face,已经包含在Android官方API中。
本教程来自Developer网站,向大家介绍了这些API,同时提供教程中实例代码下载。
图片来源:Wikipedia所谓人脸检测就是指从一副图片或者一帧视频中标定出所有人脸的位置和尺寸。
人脸检测是人脸识别系统中的一个重要环节,也可以独立应用于视频监控。
在数字媒体日益普及的今天,利用人脸检测技术还可以帮助我们从海量图片数据中快速筛选出包含人脸的图片。
在目前的数码相机中,人脸检测可以用来完成自动对焦,即“脸部对焦”。
“脸部对焦”是在自动曝光和自动对焦发明后,二十年来最重要的一次摄影技术革新。
家用数码相机,占绝大多数的照片是以人为拍摄主体的,这就要求相机的自动曝光和对焦以人物为基准。
via 构建一个人脸检测的Android Activity你可以构建一个通用的Android Activity,我们扩展了基类ImageView,成为MyImageView,而我们需要进行检测的包含人脸的位图文件必须是565格式,API才能正常工作。
被检测出来的人脸需要一个置信测度(confidence measure),这个措施定义在android.media.FaceDetector.Face.CONFIDENCE_THRESHOLD。
最重要的方法实现在setFace(),它将FaceDetector对象实例化,同时调用findFaces,结果存放在faces里,人脸的中点转移到MyImageView。
Android自带的人脸识别
Android自带的人脸识别1. Android自带的人脸识别Android自带的人脸识别只能识别出人脸在画面中的位置,中点,眼间距,角度等基本特性,提供给拍照性质的应用使用。
从基本功能中不能得出明显的特征数据2. 底层库支持external/neven/*3. 接口frameworks/base/media/java/android/media/FaceDetector.java4. Android源码参考packages/apps/Gallery/src/com/android/camera/*5. 关键代码分析package com.android.mydetect;import android.app.Activity;import android.widget.TextView;import android.os.Bundle;import android.media.FaceDetector; // 人脸识别接口import android.widget.ImageView;import android.graphics.BitmapFactory;import android.graphics.Bitmap;import android.graphics.PointF;import android.graphics.Matrix;import android.util.Log;import android.graphics.Canvas;import android.graphics.Paint;public class MyDetectActivity extends Activity {private ImageView mImageView; // 图片显示控件private Bitmap mBitmap;private float mScale = 1F;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);mImageView = (ImageView) this.findViewById(R.id.image);detect(); // 识别函数}private void handleFace(FaceDetector.Face f) { // 在图片上对每张脸进行处理PointF midPoint = new PointF();int r = ((int) (f.eyesDistance() * mScale * 1.5)); // 取眼睛间距离f.getMidPoint(midPoint); // 取脸的中点midPoint.x *= mScale;midPoint.y *= mScale;Canvas c = new Canvas(mBitmap);Paint p = new Paint();p.setAntiAlias(true);p.setAlpha(0x80);c.drawCircle(midPoint.x, midPoint.y, r, p) // 用半透明标出人脸区域;mImageView.setImageBitmap(mBitmap); // 显示图片}private void detect() {Matrix matrix = new Matrix();FaceDetector.Face[] mFaces = new FaceDetector.Face[3]; // 定义最多识别三张脸int mNumFaces = 0;mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.baby); // 取原始图if (mBitmap == null) {return;}if (mBitmap.getWidth() > 256) {mScale = 256.0F / mBitmap.getWidth();}matrix.setScale(mScale, mScale);Bitmap faceBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true); // 生成缩放后的新图mScale = 1.0F / mScale;if (faceBitmap != null) {FaceDetector detector = new FaceDetector(faceBitmap.getWidth(),faceBitmap.getHeight(), mFaces.length); // 创建识别器mNumFaces = detector.findFaces(faceBitmap, mFaces); // 识别if (mNumFaces > 0) {for (int i = 0; i < mNumFaces; i++) {handleFace(mFaces[i]); // 调用函数对人脸画面进行处理}}}}}。
如何使用Android的图像识别和人脸识别功能进行开发(三)
近年来,随着科技的不断进步,人工智能在各个领域得到了广泛的应用。
其中,图像识别和人脸识别技术的发展尤为迅速。
作为人们日常生活中常见的智能设备,Android手机也开始支持这些功能,并提供了相应的开发接口,让开发者可以在应用中灵活应用。
一、图像识别技术的开发图像识别是一种能够从图片或视频中自动识别出对象、场景、文字等信息的技术。
在Android开发中,我们可以利用Google提供的开源库TensorFlow进行图像识别的开发。
首先,我们需要在Android项目中引入TensorFlow库。
可以通过Gradle依赖的方式进行导入。
接下来,我们可以使用TensorFlow提供的API进行图像识别模型的训练与导入。
训练模型是一个比较复杂的过程,可以使用TensorBoard等工具来辅助完成。
训练好的模型可以保存为文件,然后在Android应用中加载进来。
在Android应用中,我们可以通过调用TensorFlow库的API来进行图像识别。
首先,将需要识别的图像转化为张量(Tensor)的形式。
然后,通过调用TensorFlow的识别方法,传入图像张量进行识别。
最后,可以获取到识别结果,并进行相应的处理和展示。
图像识别技术在许多应用场景中都能发挥重要的作用。
比如,可以在手机相册中对照片进行自动分类,识别出人物、风景、动物等;在拍照应用中添加美化滤镜,根据图像内容自动选择合适的滤镜效果;在社交媒体应用中识别图片中的商品,提供购买链接等。
二、人脸识别技术的开发人脸识别技术是一种能够通过分析人脸图像来唯一地确定一个人身份的技术。
在Android开发中,我们可以利用Google提供的开源库Mobile Vision进行人脸识别的开发。
首先,我们需要在Android项目中引入Mobile Vision库。
可以通过Gradle依赖的方式进行导入。
接下来,我们可以使用Mobile Vision提供的API进行人脸检测与识别。
Android开发人脸识别统计人脸数
Android开发⼈脸识别统计⼈脸数本⽂实例为⼤家分享了Android开发⼈脸识别统计的具体代码,供⼤家参考,具体内容如下最近项⽬需求是统计当前摄像头中的⼈脸个数,安卓有提供现成的Api,最终实现效果如上图。
分析思路和步奏:主要使⽤到的类:SurfaceView、CameraManager、CameraDevice.StateCallback、CameraCaptureSession.StateCallback。
1.通过SurfaceView展⽰预览区。
2.在SurfaceView创建成功后通过CameraManager获取当前设备可⽤的摄像头。
3.检测摄像头权限。
4.通过CameraManager打开摄像头。
5.在打开成功的回调中通过CameraDevice创建会话。
6.在会话创建成功的回调⽅法中创建预览请求。
7.在预览请求的回调⽅法onCaptureCompleted()⽅法中获取预览界⾯中返回的⼈脸数。
以下是实现步骤:1.xml<LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><SurfaceViewandroid:id="@+id/sv"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" /></LinearLayout>javacameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);surfaceHolder = sv.getHolder();surface = surfaceHolder.getSurface();//获取可⽤的相机列表String[] cameraIdList = cameraManager.getCameraIdList();if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling// Activity#requestPermissions// here to request the missing permissions, and then overriding// public void onRequestPermissionsResult(int requestCode, String[] permissions,// int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for Activity#requestPermissions for more details.return;}//获取开启相机的相关参数CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraIdList[1]);//可⽤于判断是否⽀持⼈脸检测,以及⽀持到哪种程度faceDetectModes = characteristics.get(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);//⽀持的⼈脸检测模式cameraManager.openCamera(cameraIdList[1], mStateCallback, null);camera.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(@NonNull CameraCaptureSession session) {}@Overridepublic void onConfigureFailed(@NonNull CameraCaptureSession session) {}}, new Handler());CaptureRequest.Builder captureRequest = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);captureRequest.addTarget(surface);captureRequest.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);captureRequest.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, getFaceDetectMode());session.setRepeatingRequest(captureRequest.build(),captureCallback,new Handler());/*** 预览回调*/private CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() {@Overridepublic void onCaptureStarted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, long timestamp, long frameNumber) {super.onCaptureStarted(session, request, timestamp, frameNumber);}@Overridepublic void onCaptureProgressed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureResult partialResult) {super.onCaptureProgressed(session, request, partialResult);}@Overridepublic void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {super.onCaptureCompleted(session, request, result);Face faces[] = result.get(CaptureResult.STATISTICS_FACES);if (faces.length != face) {Log.e("lee", faces.length + "张脸");}}@Overridepublic void onCaptureFailed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureFailure failure) {super.onCaptureFailed(session, request, failure);}@Overridepublic void onCaptureSequenceCompleted(@NonNull CameraCaptureSession session, int sequenceId, long frameNumber) {super.onCaptureSequenceCompleted(session, sequenceId, frameNumber);}@Overridepublic void onCaptureSequenceAborted(@NonNull CameraCaptureSession session, int sequenceId) {super.onCaptureSequenceAborted(session, sequenceId);}@Overridepublic void onCaptureBufferLost(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull Surface target, long frameNumber) { super.onCaptureBufferLost(session, request, target, frameNumber);}};以下就是所有代码:MainActivity.javapackage com.zg.lcddemo;import android.Manifest;import android.content.ContentValues;import android.content.Context;import android.content.pm.PackageManager;import android.content.res.Configuration;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.ImageFormat;import android.graphics.Rect;import android.graphics.SurfaceTexture;import android.hardware.Camera;import android.hardware.camera2.CameraAccessException;import android.hardware.camera2.CameraCaptureSession;import android.hardware.camera2.CameraCharacteristics;import android.hardware.camera2.CameraDevice;import android.hardware.camera2.CameraManager;import android.hardware.camera2.CameraMetadata;import android.hardware.camera2.CaptureFailure;import android.hardware.camera2.CaptureRequest;import android.hardware.camera2.CaptureResult;import android.hardware.camera2.TotalCaptureResult;import android.hardware.camera2.params.Face;import android.hardware.camera2.params.SessionConfiguration;import android.hardware.camera2.params.StreamConfigurationMap;import android.media.FaceDetector;import android.media.ImageReader;import .Uri;import android.os.Build;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Message;import android.provider.MediaStore;import android.util.Log;import android.util.Size;import android.view.Surface;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;import androidx.annotation.NonNull;import androidx.annotation.RequiresApi;import androidx.appcompat.app.AppCompatActivity;import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.Arrays;import java.util.Iterator;import java.util.List;import java.util.concurrent.Semaphore;public class MainActivity extends AppCompatActivity {private SurfaceView sv;private SurfaceHolder surfaceHolder;private CameraManager cameraManager;private Surface surface;int[] faceDetectModes;int face;List<Bitmap> bitmaps = new ArrayList<>();/*** 获取⽀持的最⾼⼈脸检测级别** @return*/private int getFaceDetectMode() {if (faceDetectModes == null) {return CaptureRequest.STATISTICS_FACE_DETECT_MODE_FULL;} else {return faceDetectModes[faceDetectModes.length - 1];}}@RequiresApi(api = Build.VERSION_CODES.M)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);sv = findViewById(R.id.sv);cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);surfaceHolder = sv.getHolder();surface = surfaceHolder.getSurface();surfaceHolder.addCallback(new SurfaceHolder.Callback() {@RequiresApi(api = Build.VERSION_CODES.M)@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {//获取可⽤的相机列表String[] cameraIdList = cameraManager.getCameraIdList();if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling// Activity#requestPermissions// here to request the missing permissions, and then overriding// public void onRequestPermissionsResult(int requestCode, String[] permissions,// int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for Activity#requestPermissions for more details.return;}//获取开启相机的相关参数CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraIdList[1]);//可⽤于判断是否⽀持⼈脸检测,以及⽀持到哪种程度faceDetectModes = characteristics.get(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);//⽀持的⼈脸检测模式 cameraManager.openCamera(cameraIdList[1], mStateCallback, null);} catch (CameraAccessException e) {e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}});}/*** 相机状态回调*/private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {@Overridepublic void onOpened(@NonNull final CameraDevice camera) {//打开成功,可以获取CameraDevice对象try {camera.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(@NonNull CameraCaptureSession session) {try {CaptureRequest.Builder captureRequest = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);captureRequest.addTarget(surface);captureRequest.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);captureRequest.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, getFaceDetectMode());session.setRepeatingRequest(captureRequest.build(),captureCallback,new Handler());} catch (CameraAccessException e) {e.printStackTrace();}}@Overridepublic void onConfigureFailed(@NonNull CameraCaptureSession session) {}}, new Handler());} catch (CameraAccessException e) {e.printStackTrace();}}@Overridepublic void onDisconnected(@NonNull CameraDevice camera) {//断开连接Toast.makeText(MainActivity.this, "onDisconnected", Toast.LENGTH_SHORT).show();}@Overridepublic void onError(@NonNull CameraDevice camera, final int error) {//发⽣异常Toast.makeText(MainActivity.this, "onError", Toast.LENGTH_SHORT).show();}};/*** 预览回调*/private CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() {@Overridepublic void onCaptureStarted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, long timestamp, long frameNumber) {super.onCaptureStarted(session, request, timestamp, frameNumber);}@Overridepublic void onCaptureProgressed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureResult partialResult) {super.onCaptureProgressed(session, request, partialResult);}@Overridepublic void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {super.onCaptureCompleted(session, request, result);Face faces[] = result.get(CaptureResult.STATISTICS_FACES);if (faces.length != face) {Log.e("lee", faces.length + "张脸");face = faces.length;}}@Overridepublic void onCaptureFailed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureFailure failure) {super.onCaptureFailed(session, request, failure);}@Overridepublic void onCaptureSequenceCompleted(@NonNull CameraCaptureSession session, int sequenceId, long frameNumber) {super.onCaptureSequenceCompleted(session, sequenceId, frameNumber);}@Overridepublic void onCaptureSequenceAborted(@NonNull CameraCaptureSession session, int sequenceId) {super.onCaptureSequenceAborted(session, sequenceId);}@Overridepublic void onCaptureBufferLost(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull Surface target, long frameNumber) { super.onCaptureBufferLost(session, request, target, frameNumber);}};}xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><SurfaceViewandroid:id="@+id/sv"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" /></LinearLayout>以上就能实现统计当前摄像头下有多少个⼈脸。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:通过两个主要的API,Android提供了一个直接在位图上进行脸部检测的方法,这两个API分别是android.media.FaceDetector和android.media.FaceDetector.Face,已经包含在Android官方API中。
通过两个主要的API,Android提供了一个直接在位图上进行脸部检测的方法,这两个API分别是android.media.FaceDetector和android.media.FaceDetector.Face,已经包含在Android官方API中。
本教程来自Developer网站,向大家介绍了这些API,同时提供教程中实例代码下载。
图片来源:Wikipedia所谓人脸检测就是指从一副图片或者一帧视频中标定出所有人脸的位置和尺寸。
人脸检测是人脸识别系统中的一个重要环节,也可以独立应用于视频监控。
在数字媒体日益普及的今天,利用人脸检测技术还可以帮助我们从海量图片数据中快速筛选出包含人脸的图片。
在目前的数码相机中,人脸检测可以用来完成自动对焦,即“脸部对焦”。
“脸部对焦”是在自动曝光和自动对焦发明后,二十年来最重要的一次摄影技术革新。
家用数码相机,占绝大多数的照片是以人为拍摄主体的,这就要求相机的自动曝光和对焦以人物为基准。
via 构建一个人脸检测的Android Activity你可以构建一个通用的Android Activity,我们扩展了基类ImageView,成为MyImageView,而我们需要进行检测的包含人脸的位图文件必须是565格式,API才能正常工作。
被检测出来的人脸需要一个置信测度(confidence measure),这个措施定义在android.media.FaceDetector.Face.CONFIDENCE_THRESHOLD。
最重要的方法实现在setFace(),它将FaceDetector对象实例化,同时调用findFaces,结果存放在faces里,人脸的中点转移到MyImageView。
代码如下:1.public class TutorialOnFaceDetect1 extends Activity {2. private MyImageView mIV;3. private Bitmap mFaceBitmap;4. private int mFaceWidth = 200;5. private int mFaceHeight = 200;6. private static final int MAX_FACES = 1;7. private static String TAG = "TutorialOnFaceDetect";8.9.@Override10.public void onCreate(Bundle savedInstanceState) {11.super.onCreate(savedInstanceState);12.13.mIV = new MyImageView(this);14.setContentView(mIV, new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));15.16.// load the photo17.Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3);18.mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true);19.b.recycle();20.21.mFaceWidth = mFaceBitmap.getWidth();22.mFaceHeight = mFaceBitmap.getHeight();23.mIV.setImageBitmap(mFaceBitmap);24.25.// perform face detection and set the feature points setFace();26.27.mIV.invalidate();28.}29.30.public void setFace() {31.FaceDetector fd;32.FaceDetector.Face [] faces = new FaceDetector.Face[MAX_FACES];33.PointF midpoint = new PointF();34.int [] fpx = null;35.int [] fpy = null;36.int count = 0;37.38.try {39.fd = new FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES);40.count = fd.findFaces(mFaceBitmap, faces);41.} catch (Exception e) {42.Log.e(TAG, "setFace(): " + e.toString());43.return;44.}45.46.// check if we detect any faces47.if (count > 0) {48.fpx = new int[count];49.fpy = new int[count];50.51.for (int i = 0; i < count; i++) {52.try {53.faces[i].getMidPoint(midpoint);54.55.fpx[i] = (int)midpoint.x;56.fpy[i] = (int)midpoint.y;57.} catch (Exception e) {58.Log.e(TAG, "setFace(): face " + i + ": " + e.toString());59.}60.}61.}62.63.mIV.setDisplayPoints(fpx, fpy, count, 0);64.}65.}接下来的代码中,我们在MyImageView中添加setDisplayPoints() ,用来在被检测出的人脸上标记渲染。
图1展示了一个标记在被检测处的人脸上处于中心位置。
1.// set up detected face features for display2.public void setDisplayPoints(int [] xx, int [] yy, int total, int style) {3. mDisplayStyle = style;4. mPX = null;5. mPY = null;6.7.if (xx != null && yy != null && total > 0) {8.mPX = new int[total];9.mPY = new int[total];10.11.for (int i = 0; i < total; i++) {12.mPX[i] = xx[i];13.mPY[i] = yy[i];14.}15.}16.}图1:单一人脸检测多人脸检测通过FaceDetector可以设定检测到人脸数目的上限。
比如设置最多只检测10张脸:1.private static final int MAX_FACES = 10;图2展示检测到多张人脸的情况。
图2:多人人脸检测定位眼睛中心位置Android人脸检测返回其他有用的信息,例同时会返回如eyesDistance,pose,以及confidence。
我们可以通过eyesDistance来定位眼睛的中心位置。
下面的代码中,我们将setFace()放在doLengthyCalc()中。
同时图3展示了定位眼睛中心位置的效果。
1.public class TutorialOnFaceDetect extends Activity {2. private MyImageView mIV;3. private Bitmap mFaceBitmap;4. private int mFaceWidth = 200;5. private int mFaceHeight = 200;6. private static final int MAX_FACES = 10;7. private static String TAG = "TutorialOnFaceDetect";8.private static boolean DEBUG = false;9.10.protected static final int GUIUPDATE_SETFACE = 999;11.protected Handler mHandler = new Handler(){12.// @Override13.public void handleMessage(Message msg) {14.mIV.invalidate();15.16.super.handleMessage(msg);17.}18.};19.20.@Override21.public void onCreate(Bundle savedInstanceState) {22.super.onCreate(savedInstanceState);23.24.mIV = new MyImageView(this);25.setContentView(mIV, new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));26.27.// load the photo28.Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3);29.mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true);30.b.recycle();31.32.mFaceWidth = mFaceBitmap.getWidth();33.mFaceHeight = mFaceBitmap.getHeight();34.mIV.setImageBitmap(mFaceBitmap);35.mIV.invalidate();36.37.// perform face detection in setFace() in a background thread38.doLengthyCalc();39.}40.41.public void setFace() {42.FaceDetector fd;43.FaceDetector.Face [] faces = new FaceDetector.Face[MAX_FACES];44.PointF eyescenter = new PointF();45.float eyesdist = 0.0f;46.int [] fpx = null;47.int [] fpy = null;48.int count = 0;49.50.try {51.fd = new FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES);52.count = fd.findFaces(mFaceBitmap, faces);53.} catch (Exception e) {54.Log.e(TAG, "setFace(): " + e.toString());55.return;56.}57.58.// check if we detect any faces59.if (count > 0) {60.fpx = new int[count * 2];61.fpy = new int[count * 2];62.63.for (int i = 0; i < count; i++) {64.try {65.faces[i].getMidPoint(eyescenter);66.eyesdist = faces[i].eyesDistance();67.68.// set up left eye location69.fpx[2 * i] = (int)(eyescenter.x - eyesdist / 2);70.fpy[2 * i] = (int)eyescenter.y;71.72.// set up right eye location73.fpx[2 * i + 1] = (int)(eyescenter.x + eyesdist / 2);74.fpy[2 * i + 1] = (int)eyescenter.y;75.76.if (DEBUG) {77.Log.e(TAG, "setFace(): face " + i + ": confidence = " + faces[i].confidence()78.+ ", eyes distance = " + faces[i].eyesDistance()79.+ ", pose = ("+ faces[i].pose(FaceDetector.Face.EULER_X) + ","80.+ faces[i].pose(FaceDetector.Face.EULER_Y) + ","81.+ faces[i].pose(FaceDetector.Face.EULER_Z) + ")"82.+ ", eyes midpoint = (" + eyescenter.x + "," + eyescenter.y +")");83.}84.} catch (Exception e) {85.Log.e(TAG, "setFace(): face " + i + ": " + e.toString());86.}87.}88.}89.90.mIV.setDisplayPoints(fpx, fpy, count * 2, 1);91.}92.93.private void doLengthyCalc() {94.Thread t = new Thread() {95.Message m = new Message();96.97.public void run() {98.try {99.setFace();100.m.what = TutorialOnFaceDetect.GUIUPDATE_SETFACE;101.TutorialOnFaceDetect.this.mHandler.sendMessage(m);102.} catch (Exception e) {103.Log.e(TAG, "doLengthyCalc(): " + e.toString());104.}105.}106.};107.108.t.start();109.}110.}图3:定位眼睛中心位置色彩vs. 灰度通常来讲,人脸检测成功取决于搜索人脸高对比度区域,实际效果来看色彩和灰度的差距不会太远。