采集优化

This commit is contained in:
2026-01-21 14:27:16 +08:00
parent de4e5d57e2
commit 176c555860
3 changed files with 39 additions and 152 deletions
@@ -1,6 +1,7 @@
package com.sw.platecabinet.activity
import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Point
import android.hardware.Camera
@@ -157,7 +158,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
val permissionHelper =
PermissionHelper.with(this, REQUIRED_PERMISSIONS, CAMERA_PERMISSION_REQUEST_CODE)
.onGranted {
Timber.d("checkCameraPermission 权限已允许")
loadLogInfo("checkCameraPermission 权限已允许")
// 权限已授予
recognizeViewModel.init()
initRgbCamera()
@@ -189,7 +190,6 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
recognizeViewModel.setLiveType(livenessType)
recognizeViewModel.prepareRegister()
recognizeViewModel.setOnRegisterFinishedCallback { facePreviewInfo, userFaceInfo ->
//Log.d(TAG, "initArcViewModel: userFaceInfo == null : ${userFaceInfo == null}")
if (!isCollectFace) {
return@setOnRegisterFinishedCallback
}
@@ -197,6 +197,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
recognizeViewModel.updateRegisterStatus(RecognizeViewModel.REGISTER_STATUS_DONE)
this.userFaceInfo = userFaceInfo
getFaceDataBlock { faceData ->
isCollectFace = false
Thread {
saveFaceInfo(faceData)
}.start()
@@ -245,23 +246,8 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
recognizeViewModel.recognizeUserId.observe(this, Observer { result: CompareResult? ->
Timber.i("recognizeUserId observe userId = ${result?.faceEntity?.userName}")
// if (result?.faceEntity == null) {
// collectFace()
// return@Observer
// }
currentUserId = result?.faceEntity?.userName
plateEnable = true
// checkFaceJob?.cancel()
// getFaceJob?.cancel()
// viewModel.getUserInfoById(memberId = userId)
// ToastUtils.showToast(currentUserId)
// if (!currentUserId.isNullOrBlank()) {
//// ToastUtils.showToast("您已采集过人脸信息")
// return@Observer
// }
// if (currentPlateInfo?.faceId == currentUserId) {
// return@Observer
// }
openPlate(currentUserId)
})
@@ -270,8 +256,6 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
})
}
// private val settingViewModel by viewModels<SettingViewModel>()
/**
* 查询餐盘数据
*/
@@ -279,14 +263,9 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
MyApp.plateList?.let {
block(it)
}
// settingViewModel.getEquipmentList { items ->
// block(items)
// }
}
private var currentPlateInfo: EquipmentUserInfo? = null
// private var debouncer = Debouncer(5000)
private var plateEnable = true
/**
@@ -294,21 +273,20 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
*/
private fun openPlate(userId: String?) {
if (plateEnable.not()) return
// debouncer.debounce {
Log.d(TAG, "openPlate: userId=$userId")
loadLogInfo("collectFace,openPlate: userId=$userId")
getPlateData { items ->
Log.d(TAG, "openPlate: items:${Gson().toJson(items)}")
loadLogInfo("collectFace,openPlate: items:${Gson().toJson(items)}")
// 未查询到当前用户,查询第一个未绑定的餐盘
val item = items.firstOrNull { it.plateNumber.isNullOrEmpty().not() }
Log.d(TAG, "openPlate: item2:${item}")
loadLogInfo("collectFace,openPlate: item2:${item}")
if (item == null) {
//暂无餐盘
Log.d(TAG, "collectFace,openPlate: 暂无餐盘,请联系管理人员,isCollectFace=$isCollectFace")
loadLogInfo("collectFace,openPlate: 暂无餐盘,请联系管理人员,isCollectFace=$isCollectFace")
ToastUtils.showToast("暂无餐盘,请联系管理人员!")
goInitActivity()
return@getPlateData
}
Log.d(TAG, "openPlate: item3:${item}")
loadLogInfo("collectFace,openPlate: item3:${item}")
item.faceId = userId
item.updateTime = DateTimeUtils.getDateTimeString()
item.plateNumber = null
@@ -318,28 +296,9 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
currentPlateInfo = item
MyApp.plateList = items
SpTool.savePlateData(items)
// debouncer.reset()
}
// }
}
// /**
// * 绑定餐盘
// */
// private fun bindPlate(item: EquipmentUserInfo) {
// val bindParam = BindParam(
// equipmentId = item.equipmentId,
// equipmentCode = item.equipmentCode,
// equipmentBoxCode = item.equipmentBoxCode,
// faceId = item.faceId,
// plateNumber = item.plateNumber
// )
// settingViewModel.bindPlate(bindParam) { pair ->
// Log.d(TAG, "openPlate: state:${pair.first},msg:${pair.second.code},${pair.second.msg}")
// }
// }
private fun initArcView() {
//在布局结束后才做初始化操作
binding.dualCameraTexturePreviewRgb.getViewTreeObserver().addOnGlobalLayoutListener(this)
@@ -347,7 +306,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
}
override fun onDestroy() {
Timber.d("onDestroy")
loadLogInfo("onDestroy")
instance = null
if (rgbCameraHelper != null) {
rgbCameraHelper!!.release()
@@ -357,8 +316,6 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
recognizeViewModel.destroy()
EventBus.getDefault().unregister(this)
// countDownJob?.cancel()
// checkFaceJob?.cancel()
// getFaceScheduler?.shutdown()
checkFaceScheduler?.shutdown()
super.onDestroy()
@@ -434,7 +391,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
displayOrientation: Int,
isMirror: Boolean
) {
Timber.d("initRgbCamera Rgb onCameraOpened: cameraId = $cameraId, displayOrientation = $displayOrientation")
loadLogInfo("initRgbCamera Rgb onCameraOpened: cameraId = $cameraId, displayOrientation = $displayOrientation")
runOnUiThread({
val previewSizeRgb = camera.getParameters().getPreviewSize()
val layoutParams = adjustPreviewViewSize(
@@ -442,9 +399,9 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
binding.dualCameraTexturePreviewRgb, binding.dualCameraFaceRectView,
previewSizeRgb, displayOrientation, 0.6f
)
Timber.d("initRgbCamera previewSizeRgb = ${previewSizeRgb.width}-${previewSizeRgb.height}")
Timber.d("initRgbCamera layoutParams = ${layoutParams.width}-${layoutParams.height}")
Timber.d(
loadLogInfo("initRgbCamera previewSizeRgb = ${previewSizeRgb.width}-${previewSizeRgb.height}")
loadLogInfo("initRgbCamera layoutParams = ${layoutParams.width}-${layoutParams.height}")
loadLogInfo(
"initRgbCamera isMirror = ${isMirror}, isDrawRgbRectHorizontalMirror = ${
ConfigUtil.isDrawRgbRectHorizontalMirror(
context
@@ -486,8 +443,6 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
currentPlateInfo = null
currentUserId = null
userFaceInfo = null
// checkFaceJob?.cancel()
// getFaceJob?.cancel()
}
recognizeViewModel.clearLeftFace(facePreviewInfoList)
}
@@ -552,7 +507,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
override fun onGlobalLayout() {
Timber.d("onGlobalLayout")
loadLogInfo("onGlobalLayout")
binding.dualCameraTexturePreviewRgb.getViewTreeObserver().removeOnGlobalLayoutListener(this)
// 请求权限
checkCameraPermission()
@@ -561,7 +516,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
private fun resumeCamera() {
isRecognition = true
if (rgbCameraHelper != null && rgbCameraHelper!!.isStopped) {
Log.d(TAG, "collectFace,resumeCamera: ")
loadLogInfo("collectFace,resumeCamera: ")
rgbCameraHelper!!.start()
}
}
@@ -620,7 +575,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
fun initCountTime() {
countDownTimer = object : CountDownTimer(totalTimeInMillis, 1000) {
override fun onTick(millisUntilFinished: Long) {
Timber.d("initCountTime onTick = ${(millisUntilFinished / 1000).toInt()}")
loadLogInfo("initCountTime onTick = ${(millisUntilFinished / 1000).toInt()}")
binding.tvToInit.text = "${(millisUntilFinished / 1000).toInt() + 1}"
}
@@ -639,40 +594,15 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
loadLogInfo("collectFace: -----------1,开始采集人脸,开始时间:${DateTimeUtils.getDateTimeString()}----------")
if (isFirstOpen) return
loadLogInfo("collectFace: ----------2,isFirstOpen=false-----------")
// if (facePreviewInfoList.isNullOrEmpty()) {
// loadLogInfo("collectFace: ----------3,未检测到人脸信息-----------")
// return
// }
loadLogInfo("collectFace: ----------4,检测到人脸信息-----------")
currentUserId = null
userFaceInfo = null
recognizeViewModel.updateRegisterStatus(REGISTER_STATUS_READY)
loadLogInfo("collectFace: ----------5,人脸采集中-----------")
// getFaceData { faceData ->
// if (faceDataList.isNotEmpty()) {
// return@getFaceData
// }
// faceDataList.add(faceData)
//
// checkFaceScheduler?.shutdown()
// getFaceScheduler?.shutdown()
// recognizeViewModel.updateRegisterStatus(RecognizeViewModel.REGISTER_STATUS_DONE)
// Thread {
//// val faceDao = FaceDatabase.getInstance(App.getContext()).faceDao()
//// val entity = faceDao.queryByUserName(tempUserId)
//// if (entity != null) {
//// //已存在用户
//// loadLogInfo("collectFace,saveFaceInfo: ----------9,数据库已存在该人脸数据-----------")
//// return@Thread
//// }
// saveFaceInfo(faceData)
// }.start()
// }
}
private fun sendFaceData(faceData: String) {
loadLogInfo("collectFace,sendFaceData: ----------11,发人脸数据-----------")
Log.d(TAG, "collectFace,sendFaceData: ---------------------------")
loadLogInfo("collectFace,sendFaceData: ----------11,发人脸数据-----------")
// 给某个客户端发送
val jsonObject = JSONObject().also {
it.put("type", "faceFeature")
@@ -689,22 +619,6 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
checkFaceScheduler = Executors.newScheduledThreadPool(1)
}
private fun getFaceData(block: (String) -> Unit) {
// getFaceScheduler?.scheduleWithFixedDelay(
// {
// getFaceDataBlock(block)
// }, 5L, 5L, TimeUnit.MILLISECONDS
// )
// runBlocking {
// getFaceJob = executor.startIntervalTask(5) {
// getFaceJob?.cancel()
// checkFaceJob?.cancel()
// }
// }
}
private fun getFaceDataBlock(block: (String) -> Unit) {
if (userFaceInfo == null || userFaceInfo?.faceFeature?.featureData == null) {
return
@@ -713,49 +627,23 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
if (faceData.isNullOrBlank()) {
return
}
loadLogInfo("collectFace,getFaceData: ----------7,拿到人脸取特征数据-----------")
loadLogInfo("collectFace,getFaceData: ----------7,拿到人脸取特征数据-----------")
block(faceData)
}
private var faceDataList: MutableList<String> = mutableListOf()
private fun loadLogInfo(msg: String) {
Log.d(TAG, msg)
// logAdapter.addData(msg)
Timber.tag(TAG).d( msg)
}
private var facePreviewInfoList: MutableList<FacePreviewInfo>? = null
private var userFaceInfo: UserFaceInfo? = null
private var countDownJob: Job? = null
// private var getFaceJob: Job? = null
val executor = IntervalExecutor()
private var currentUserId: String? = null
private fun countDown() {
// countDownJob = countDownByFlow(
// total = 3,
// scope = lifecycleScope,
// onStart = {
// binding.tvCollectState.text = "采集完成(3s"
// },
// onTick = { seconds ->
// binding.tvCollectState.text = "采集完成(${seconds}s"
// },
// onFinish = {
// //binding.tvCollectState.text = "采集完成"
// currentUserId = null
// binding.layoutState.invisible()
//// binding.tvFaceTip.visible()
// binding.btnCollectFace.visible()
// }
// )
}
private fun saveFaceInfo(faceData: String) {
try {
// getFaceJob?.cancel()
// checkFaceJob?.cancel()
sendFaceData(faceData)
loadLogInfo("collectFace,saveFaceInfo: ----------12,人脸数据发送完成时间:${DateTimeUtils.getDateTimeString()}-----------")
@@ -782,12 +670,8 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
e.printStackTrace()
loadLogInfo("collectFace,saveFaceInfo: ----------13,人脸采集异常:${e.message}-----------")
collectCount++
// if (collectCount <= 5) {
// collectFace()
// } else {
loadLogInfo("collectFace,saveFaceInfo: ----------14,${collectCount}次人脸采集异常:${e.message}-----------")
ToastUtils.showToast("人脸采集异常:${e.message}")
// }
}
}
@@ -796,8 +680,8 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
private var tcpClient: TcpClient? = null
private fun addSocketListener() {
//val ipAddress = NetworkUtils.getIPAddress(true)
//Log.d(TAG, "addSocketListener,ipAddress: $ipAddress");
// val ipAddress = NetworkUtils.getIPAddress(true)
// loadLogInfo( "addSocketListener,ipAddress: $ipAddress");
tcpClient = TcpClient(
"192.168.1.95",
5000,
@@ -810,25 +694,25 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
tcpClient?.setListener(object : TcpClientListenerImpl() {
override fun onSendSuccess(json: JSONObject?) {
super.onSendSuccess(json)
loadLogInfo("TcpClientListener发送成功:$json")
loadLogInfo("collectFace,TcpClientListener发送成功:$json")
// toast("发送成功")
}
override fun onSendFailed(json: JSONObject?, e: java.lang.Exception?) {
super.onSendFailed(json, e)
ToastUtils.showToast("发送失败${e?.message}")
loadLogInfo("TcpClientListener人脸数据发送失败:${e?.message}")
loadLogInfo("collectFace,TcpClientListener人脸数据发送失败:${e?.message}")
}
override fun onMessage(json: JSONObject?) {
super.onMessage(json)
loadLogInfo("TcpClientListener收到消息:$json")
loadLogInfo("collectFace,TcpClientListener收到消息:$json")
val type = json?.getInt("type")
// 根据服务端消息类型处理删除新增临时用户人脸数据---------------------
when (type) {
LanServer.TYPE_ADD_FACE_DATA -> {
//采集设备id自己生成,不接收服务端的,在本地只判断是否存在同一人脸数据
loadLogInfo("TcpClientListener收到消息,新增用户:采集设备id自己生成,不接收服务端的,在本地只判断是否存在同一人脸数据")
loadLogInfo("collectFace,TcpClientListener收到消息,新增用户:采集设备id自己生成,不接收服务端的,在本地只判断是否存在同一人脸数据")
}
LanServer.TYPE_CLEAR_FACE_DATA -> {
@@ -839,7 +723,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
}
}
})
tcpClient?.start();
tcpClient?.start()
try {
LanServer.getInstance().let {
@@ -861,14 +745,13 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
val faceDao = FaceDatabase.getInstance(this).faceDao()
faceDao.deleteTempUserFaceData()
recognizeViewModel.refreshFaceList()
loadLogInfo("TcpClientListener收到消息,已删除并刷新人脸数据")
loadLogInfo("collectFace,TcpClientListener收到消息,已删除并刷新人脸数据")
}.start()
}
private val WAITING_TIME = 3 * 1000L
private var checkStartTime = 0L
// private var checkFaceJob: Job? = null
private fun checkFaceState() {
checkStartTime = System.currentTimeMillis()
@@ -877,16 +760,11 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
checkFaceBlock()
}, 5L, 5L, TimeUnit.MILLISECONDS
)
// checkFaceJob = executor.startIntervalTask(5) {
//
// }
}
private var isCollectFace = false
private fun checkFaceBlock() {
Log.d("Login", "collectFace,currentUserId=${currentUserId}")
loadLogInfo("collectFace,currentUserId=${currentUserId}")
if (currentUserId.isNullOrBlank().not()) {
// checkFaceJob?.cancel()
isCollectFace = false
checkFaceScheduler?.shutdown()
@@ -660,6 +660,7 @@ public class FaceHelper implements FaceListener {
}
compareResult.setTrackId(trackId);
boolean pass = compareResult.getSimilar() > recognizeConfiguration.getSimilarThreshold();
Log.d(TAG, "collectFace,searchFace: pass="+pass+",similar="+compareResult.getSimilar()+",threshold="+recognizeConfiguration.getSimilarThreshold());
recognizeCallback.onRecognized(compareResult, getRecognizeInfo(recognizeInfoMap, trackId).getLiveness(), pass);
if (pass) {
setName(trackId, "识别通过");
@@ -469,10 +469,18 @@ public class RecognizeViewModel extends ViewModel implements RecognizeCallback {
}
}
private String getUserId(CompareResult result){
if (result != null && result.getFaceEntity() != null) {
return result.getFaceEntity().getUserName();
}
return null;
}
@Override
public void onRecognized(CompareResult compareResult, Integer live, boolean similarPass) {
Disposable disposable = Observable.just(true).observeOn(AndroidSchedulers.mainThread()).subscribe(aBoolean -> {
Log.d(TAG, "onRecognized: similarPass="+similarPass);
// TODO: 2026/1/21 测试使用 Observable.just(similarPass)代替Observable.just(true)---
Observable.just(similarPass).observeOn(AndroidSchedulers.mainThread()).subscribe(aBoolean -> {
Log.d(TAG, "collectFace,onRecognized: similarPass="+similarPass+",live="+live+",userId="+getUserId(compareResult));
if (similarPass) {
recognizeUserId.postValue(compareResult);
boolean isAdded = false;