From 7ead6679c13bdd2a823fbaece2cd3204ba46c5ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E4=BF=8A=E6=89=8D?= <61060866@qq.com> Date: Wed, 24 Apr 2024 11:55:27 +0800 Subject: [PATCH] tengine2 --- .../tengine2/TEngine2FaceCheckManager.kt | 75 +++++++++++++------ 1 file changed, 54 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/aispeech/nativedemo/tengine2/TEngine2FaceCheckManager.kt b/app/src/main/java/com/aispeech/nativedemo/tengine2/TEngine2FaceCheckManager.kt index 4ad6f42..72f675a 100644 --- a/app/src/main/java/com/aispeech/nativedemo/tengine2/TEngine2FaceCheckManager.kt +++ b/app/src/main/java/com/aispeech/nativedemo/tengine2/TEngine2FaceCheckManager.kt @@ -1,10 +1,10 @@ package com.aispeech.nativedemo.tengine2 -import android.app.Activity import android.graphics.Bitmap import android.graphics.Rect import android.util.Log import com.aispeech.nativedemo.MainActivity +import com.aispeech.nativedemo.arcsoft.ArcSoftFaceCheckManager import com.aispeech.nativedemo.asr.observer.DuiMessageObserver import com.aispeech.nativedemo.entity.PersonInfo import com.aispeech.nativedemo.face.AngleInfo @@ -30,6 +30,10 @@ import java.util.concurrent.ConcurrentLinkedQueue class TEngine2FaceCheckManager : FaceCheckInterface { + var PITCH_MAX_ANGLE = 25f + var PITCH_DANGER_ANGLE = 18f + var YAW_MAX_ANGLE = 20f + var YAW_DANGER_ANGLE = 18f companion object { val instance by lazy (LazyThreadSafetyMode.SYNCHRONIZED){ TEngine2FaceCheckManager() @@ -433,7 +437,7 @@ class TEngine2FaceCheckManager : FaceCheckInterface { overAngleCount++ continue } - if (face.yaw > 0.3f || face.yaw < -0.3f) { + if (face.yaw > YAW_MAX_ANGLE || face.yaw < (-1*YAW_MAX_ANGLE)) { overAngleCount++ } else { LogUtils.e( @@ -460,53 +464,82 @@ class TEngine2FaceCheckManager : FaceCheckInterface { faceList: ConcurrentLinkedQueue ): Boolean { val start = System.currentTimeMillis() + val isCloseMan = "closeMan-" == logTag var isSpeak = false var mouthOpen = 0 var mouthClose = 0 var mouthOther = 0 - var overAngleCount = 0 + var pitchOverAngleCount = 0 var faceType = -1f var mouthChangeCount = 0 + var yawOverAngleCount = 0 val count = faceList.size for (face in faceList) { if (face == null) { continue } + if (face.pitch > ArcSoftFaceCheckManager.PITCH_DANGER_ANGLE || face.pitch < -1 * ArcSoftFaceCheckManager.PITCH_DANGER_ANGLE) { + mouthOther++ + } + if (face.yaw > ArcSoftFaceCheckManager.YAW_DANGER_ANGLE || face.yaw < -1 * ArcSoftFaceCheckManager.YAW_DANGER_ANGLE) { + yawOverAngleCount++ + } + if (face.pitch > ArcSoftFaceCheckManager.PITCH_MAX_ANGLE || face.pitch < -1 * ArcSoftFaceCheckManager.PITCH_MAX_ANGLE) { + pitchOverAngleCount++ + continue + } if (faceType >= 0 && (faceType - face.mouseClose) > 0.1f) { mouthChangeCount++ } faceType = face.mouseClose if (face.mouseClose < 0.9f) { mouthOpen++ - } else { + } else { mouthClose++ } - if (face.pitch > 0.3f || face.pitch < -0.3f) { - overAngleCount++ - } - } - if (faceList.size <= 8) { - isSpeak = mouthChangeCount > 0 || overAngleCount > 0 - } else if (overAngleCount > 0) { - isSpeak = mouthChangeCount > 0 || overAngleCount * 16 >= count - } else if (mouthOpen > 0 && mouthClose > 0 || mouthOpen > 0 && mouthOther > 0) { - // || (mouthClose > 0 && mouthOther > 0) - isSpeak = true } - if (!isSpeak) { - if (mouthChangeCount * 2 >= count) { + var result = "一直闭嘴" + if (pitchOverAngleCount * 3 > count) { + isSpeak = false + result = "pitchOverAngleCount > 0.33" + } else { + if (faceList.size <= 9) { + isSpeak = mouthChangeCount > 0 || mouthOther >= 0 + result = "faceList.size() <= 9" + } else if (mouthOpen > 0 && mouthClose > 0) { isSpeak = true - } else if (mouthOpen == 0 && count <= 20) { - if (Math.abs(mouthClose - mouthOther) < 3 || mouthChangeCount > mouthClose || mouthChangeCount > mouthOther) { + result = "mouthOpen > 0 && mouthClose > 0" + } + if (!isSpeak) { + if (mouthChangeCount * 2 >= count) { + isSpeak = true + result = "mouthChangeCount * 2 >= count" + } else if (mouthOpen == count && count > 4) { + isSpeak = true + result = "mouthOpen == count && count > 4" + } else if (count - mouthOther <= 1 && count < 20 && yawOverAngleCount < 1) { isSpeak = true + result = "(count - mouthOther) <= 1 && count < 20 && yawOverAngleCount < 1" } } } - Logger.e("djASR-嘴型检测: " + logTag + name + " is speak " + isSpeak + " mouthOpen " + mouthOpen + " mouthClose " + mouthClose + " mouthOther " + mouthOther + " mouthChangeCount " + mouthChangeCount + " leftFaceSize " + faceCount + " overAngleCount " + overAngleCount + " time " + DuiMessageObserver.mTime) + Logger.e("djASR-嘴型检测: " + logTag + name + " is speak " + isSpeak + " mouthOpen " + mouthOpen + " mouthClose " + mouthClose + " yawOverAngleCount " + yawOverAngleCount + " mouthChangeCount " + mouthChangeCount + " leftFaceSize " + ArcSoftFaceCheckManager.faceCount + " overAngleCount " + pitchOverAngleCount + " mouthOther " + mouthOther + " time " + DuiMessageObserver.mTime) + Log.e( + "testface", + logTag + name + " is speak " + isSpeak + " mouthOpen " + mouthOpen + " mouthClose " + mouthClose + " yawOverAngleCount " + yawOverAngleCount + " mouthChangeCount " + mouthChangeCount + " leftFaceSize " + ArcSoftFaceCheckManager.faceCount + " overAngleCount " + pitchOverAngleCount + " mouthOther " + mouthOther + " time " + DuiMessageObserver.mTime + " duration " + (System.currentTimeMillis() - start) + ) + Logger.e("djASR-嘴型检测: " + logTag + name + " time " + DuiMessageObserver.mTime + " is speak " + isSpeak + " result " + result) Log.e( "testface", - logTag + name + " is speak " + isSpeak + " mouthOpen " + mouthOpen + " mouthClose " + mouthClose + " mouthOther " + mouthOther + " mouthChangeCount " + mouthChangeCount + " leftFaceSize " + faceCount + " overAngleCount " + overAngleCount + " time " + DuiMessageObserver.mTime + " duration " + (System.currentTimeMillis() - start) + logTag + name + " time " + DuiMessageObserver.mTime + " is speak " + isSpeak + " result " + result ) + if (MainActivity.instance != null) { + if (isCloseMan) { + MainActivity.instance.setSettingResultClose(logTag + name + " time " + DuiMessageObserver.mTime + " is speak " + isSpeak + " result " + result) + } else { + MainActivity.instance.setSettingResult(logTag + name + " time " + DuiMessageObserver.mTime + " is speak " + isSpeak + " result " + result) + } + } return isSpeak }