Android相机预览,指定区域显示预览框,在区域内出现人脸进行人脸识别,并抓拍人脸照片存在本地,CameraX,虹软人脸识别

效果图:

第一种是使用camerax进行预览,android camerax预览官方文档,主要通过imageAnalysis,抓帧进行图片处理,然后通过android自带的图片人脸识别FaceDetector判断是否有人脸,有人脸保存当前抓拍的照片:

val file = File(filesDir, "head_tmp.png")
            val create = Observable.create<File> { emitter ->
                val intArray = IntArray(2)
                iv_scan.getLocationInWindow(intArray)
                val createBitmap = Bitmap.createBitmap(
                    bitmap, intArray[0], intArray[1], iv_scan.width, iv_scan.height
                )
                //必须是565才能识别
                val bitmap1: Bitmap = createBitmap.copy(Bitmap.Config.RGB_565, true)
                val faceDetector = FaceDetector(bitmap1.width, bitmap1.height, 1)
                val array = arrayOfNulls<FaceDetector.Face>(1)
                val faces = faceDetector.findFaces(bitmap1, array)
                if (faces > 0) {
                    Log.e(TAG, "检测到脸")
                    val fos = FileOutputStream(file.path)
                    createBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
                    fos.flush()
                    fos.close()
                    emitter.onNext(file)
                } else {
                    Log.e(TAG, "未检测到脸")
                    emitter.onError(Throwable("未检测到脸"))
                }

            }
            var disposable: Disposable? = null
            val observer = object : Observer<File> {
                override fun onNext(t: File) {
                    disposable?.dispose()
                    isOne = false
                    setResult(Activity.RESULT_OK)
                    finish()
                }

                override fun onError(e: Throwable) {
                    isOne = true
                }

                override fun onComplete() {

                }

                override fun onSubscribe(d: Disposable) {
                    disposable = d
                }
            }
            create.subscribeOn(Schedulers.computation())//指定被观察者线程
                .observeOn(AndroidSchedulers.mainThread())//指定观察者线程
                .subscribe(observer)

第二种使用了免费的虹软识别人脸识别,主要判断指定识别框的rect和虹软人脸识别框的rect,比较两个rect,是否在它的范围内,如果在抓拍人脸:

if (drawInfoList.size > 0) {
                    for (i in drawInfoList.indices) {
                        val rect: Rect = drawInfoList[i].rect
                        val rect1 = Rect()
                        iv_scan.getGlobalVisibleRect(rect1)
                        if (rect1.contains(rect)) {
                            //为了美观,扩大rect截取注册图
                            val cropRect: Rect =
                                CommUtils.getBestRect(
                                    previewSize!!.width, previewSize!!.height, faceInfoList[i].rect
                                )
                            cropRect.left = cropRect.left and 3.inv()
                            cropRect.top = cropRect.top and 3.inv()
                            cropRect.right = cropRect.right and 3.inv()
                            cropRect.bottom = cropRect.bottom and 3.inv()

                            headBmp = CommUtils.getHeadImage(
                                nv21,
                                previewSize!!.width,
                                previewSize!!.height,
                                faceInfoList[i].orient,
                                cropRect,
                                ArcSoftImageFormat.NV21
                            )
                            headBmp?.apply {
                                cropBitmap(this)
                            }
                            break
                        }
                    }
                }

demo:https://github.com/withyi9223/facesb

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android Studio中使用虹软人脸识别本地的人脸数据库并调用网络训练模型进行人脸识别的步骤如下: 1. 在项目的build.gradle文件中添加虹软人脸识别库的依赖: ``` implementation 'com.arcsoft:libarcsoft-face:2.1.1' ``` 2. 在代码中使用FaceEngine类的静态方法createHandle()创建人脸识别引擎的句柄: ``` FaceEngine faceEngine = new FaceEngine(); int faceEngineCode = faceEngine.createHandle(context, appId, sdkKey); ``` 其中,context为上下文对象,appId和sdkKey为在虹软官网申请的应用ID和SDKKey。 3. 加载训练好的人脸识别模型文件: ``` faceEngineCode = faceEngine.setFaceRecognizeModelPath("assets/model/recognition"); ``` 4. 初始化人脸识别引擎: ``` faceEngineCode = faceEngine.init(context, DetectMode.ASF_DETECT_MODE_IMAGE, DetectFaceOrientPriority.ASF_OP_0_ONLY, 16, 1, FaceEngine.ASF_FACE_RECOGNITION | FaceEngine.ASF_FACE_DETECT | FaceEngine.ASF_FACE_MODEL); faceEngineCode = faceEngine.setLivenessParam(0.5f, 0.7f); ``` 其中,setLivenessParam()方法用于设置活体检测的参数,0.5f和0.7f分别表示活体检测的阈值和活体检测的动作阈值。 5. 加载人脸数据库: ``` List<FaceDB.FaceRegist> faceList = new ArrayList<>(); faceList.addAll(mFaceDB.getRegisterData()); faceEngineCode = faceEngine.registeredFaceList(faceList); ``` 其中,mFaceDB为人脸数据库对象,getRegisterData()方法用于获取人脸数据库中的注册数据。 6. 调用人脸识别引擎的相关方法进行人脸识别。 需要注意的是,在使用虹软人脸识别本地的人脸数据库并调用网络训练模型进行人脸识别时,需要对人脸数据库进行充分的处理和优化,以提高识别的准确率和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值