From 66a0c399ec2675f7fdf109f165251a63f42db401 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Thu, 2 Apr 2026 19:11:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(face):=20=E6=B7=BB=E5=8A=A0=E4=BA=BA?= =?UTF-8?q?=E8=84=B8=E8=AF=86=E5=88=AB=E8=B7=9D=E7=A6=BB=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E5=92=8C=E7=8E=AF=E5=A2=83=E5=88=87=E6=8D=A2=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E4=BA=BA=E8=84=B8=E6=95=B0=E6=8D=AE=E9=87=8D=E7=BD=AE=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在FaceHelper中添加人脸宽度小于200像素时的过滤逻辑,避免远距离识别人脸 - 注释掉LoginByFaceActivity中的重复识别状态判断逻辑 - 在PlcSettingActivity中添加协程支持用于异步处理人脸数据清除操作 - 实现环境切换时清空所有人脸数据并重新获取用户人脸缓存的功能 - 修改UserViewModel中回调逻辑,当第一页无数据时返回false而非true --- .../activity/LoginByFaceActivity.kt | 32 +++++++++---------- .../activity/PlcSettingActivity.kt | 22 ++++++++++++- .../platecabinet/viewmodel/UserViewModel.kt | 2 +- .../plate/utils/arcface/face/FaceHelper.java | 8 +++++ 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt index 66abbe0..cbb745a 100644 --- a/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt +++ b/app/src/main/java/com/sw/platecabinet/activity/LoginByFaceActivity.kt @@ -772,13 +772,13 @@ class LoginByFaceActivity : BaseActivity(), lifecycleScope = lifecycleScope, onTick = { remaining -> loadLogInfo("resetRecognizeState剩余时间:$remaining 秒") - if (judgeRecognizeState()) return@startCountDown +// if (judgeRecognizeState()) return@startCountDown loadLogInfo("initCountTime onTick = $remaining") binding.tvToInit.text = "$remaining" }, onFinish = { loadLogInfo("resetRecognizeState倒计时结束") - if (judgeRecognizeState()) return@startCountDown +// if (judgeRecognizeState()) return@startCountDown if (facePreviewInfoList.isNullOrEmpty()) { goInitActivity() } else { @@ -802,20 +802,20 @@ class LoginByFaceActivity : BaseActivity(), // recognizeViewModel.onPreviewFrame(emptyFrame, true) } - private fun judgeRecognizeState(): Boolean { - val rectColor = binding.dualCameraFaceRectView.rectColor - if (rectColor == RecognizeColor.COLOR_SUCCESS && currentUserId.isNullOrBlank() - .not() && facePreviewInfoList.isNullOrEmpty().not() - ) { - //人未离开,再次识别 - loadLogInfo("userId=$currentUserId") - openPlateDebouncer.debounce { - openPlate(currentUserId) - } - return true - } - return false - } +// private fun judgeRecognizeState(): Boolean { +// val rectColor = binding.dualCameraFaceRectView.rectColor +// if (rectColor == RecognizeColor.COLOR_SUCCESS && currentUserId.isNullOrBlank() +// .not() && facePreviewInfoList.isNullOrEmpty().not() +// ) { +// //人未离开,再次识别 +// loadLogInfo("userId=$currentUserId") +// openPlateDebouncer.debounce { +// openPlate(currentUserId) +// } +// return true +// } +// return false +// } fun goInitActivity() { val intent = Intent(context, InitActivity::class.java) diff --git a/app/src/main/java/com/sw/platecabinet/activity/PlcSettingActivity.kt b/app/src/main/java/com/sw/platecabinet/activity/PlcSettingActivity.kt index 3c20442..4b78118 100644 --- a/app/src/main/java/com/sw/platecabinet/activity/PlcSettingActivity.kt +++ b/app/src/main/java/com/sw/platecabinet/activity/PlcSettingActivity.kt @@ -3,7 +3,9 @@ package com.sw.platecabinet.activity import android.content.Context import android.content.Intent import android.view.inputmethod.InputMethodManager +import androidx.lifecycle.lifecycleScope import com.sw.plate.utils.ToastUtils +import com.sw.plate.utils.arcface.faceserver.FaceServer import com.sw.platecabinet.databinding.ActivityPlcSettingBinding import com.sw.platecabinet.databinding.ItemTitleTimeBinding import com.sw.platecabinet.dialog.EnvSwitchDialog @@ -11,6 +13,9 @@ import com.sw.platecabinet.ext.clickWithDebounce import com.sw.platecabinet.utils.mego.PlcCallback import com.sw.platecabinet.utils.mego.PlcHelper import com.sw.platecabinet.utils.mego.PlcStatus +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext /** * PLC 控制设置界面 @@ -43,7 +48,22 @@ class PlcSettingActivity : BaseActivity() { initParamButtons() initStatusButton() binding.btnSwitchEnv.setOnClickListener { - EnvSwitchDialog(this).show() + EnvSwitchDialog(context = this, onEnvChanged = { + showWaitingDialog("重置人脸数据中……") + lifecycleScope.launch { + withContext(Dispatchers.IO) { + FaceServer.getInstance().clearAllFaces() + } + } + userViewModel.getUserFaceCache(pageNo = 1, callback = { state, errMsg -> + hideWaitingDialog() + if (state) { + ToastUtils.showToast("人脸数据已更新") + } else { + ToastUtils.showToast(errMsg) + } + }) + }).show() } } diff --git a/app/src/main/java/com/sw/platecabinet/viewmodel/UserViewModel.kt b/app/src/main/java/com/sw/platecabinet/viewmodel/UserViewModel.kt index 1bab3ea..9616d9d 100644 --- a/app/src/main/java/com/sw/platecabinet/viewmodel/UserViewModel.kt +++ b/app/src/main/java/com/sw/platecabinet/viewmodel/UserViewModel.kt @@ -64,7 +64,7 @@ class UserViewModel : BaseViewModel() { SPUtil.getInstance().put(GlobalKey.KEY_FIRST_RUN, true) val list: List = response.data ?: emptyList() if (pageNo == 1 && list.isEmpty()) { - callback(true, "暂无数据") + callback(false, "暂无数据") return@launchWithLoading } val faceEntityList = list.map { diff --git a/lib_face/src/main/java/com/sw/plate/utils/arcface/face/FaceHelper.java b/lib_face/src/main/java/com/sw/plate/utils/arcface/face/FaceHelper.java index c8dcab1..812ef57 100644 --- a/lib_face/src/main/java/com/sw/plate/utils/arcface/face/FaceHelper.java +++ b/lib_face/src/main/java/com/sw/plate/utils/arcface/face/FaceHelper.java @@ -343,6 +343,14 @@ public class FaceHelper implements FaceListener { refreshTrackId(faceInfoList); if (faceInfoList.isEmpty()) { return facePreviewInfoList; + } else { + FaceInfo currentFaceInfo = faceInfoList.get(0); +// L.e("currentFaceInfo width=" + currentFaceInfo.getRect().width() + +// "---height" + currentFaceInfo.getRect().height()); + if (currentFaceInfo.getRect().width() < 200) {//距离远(人脸小),不识别 + clearLeftFace(facePreviewInfoList); + return facePreviewInfoList; + } } if (!onlyDetectLiveness) { code = ftEngine.process(rgbNv21, previewSize.width, previewSize.height, FaceEngine.CP_PAF_NV21, faceInfoList,