Commit 76f1841e authored by 马乐's avatar 马乐

1.产品定义人脸使用场景

parent 0ecbfa90
......@@ -15,8 +15,10 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import com.arcsoft.visdrive.sdk.ArcErrorInfo
import com.arcsoft.visdrive.sdk.ArcVisDriveEngine
import com.arcsoft.visdrive.sdk.constant.common.ArcImageFormat
import com.arcsoft.visdrive.sdk.constant.common.ArcModType
import com.arcsoft.visdrive.sdk.model.common.ArcActiveEnvParam
import com.arcsoft.visdrive.sdk.model.fr.ArcFRExtractResult
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.TimeUtils
import com.intergration.test.databinding.ActivityMainBinding
......@@ -39,18 +41,22 @@ import com.intergration.test.dms.startDms
import com.intergration.test.fr.COROUTINE_FR
import com.intergration.test.fr.FrCoroutineContext
import com.intergration.test.fr.FrCoroutineScope
import com.intergration.test.fr.INTERVAL_COMPLETED
import com.intergration.test.fr.INTERVAL_ERROR
import com.intergration.test.fr.compareFeatureWithScore
import com.intergration.test.fr.extractRegisterFeature
import com.intergration.test.fr.extractRecognizeFeature
import com.intergration.test.fr.featureList
import com.intergration.test.fr.initializeFr
import com.intergration.test.fr.startFr
import com.intergration.test.fr.startFr1
import com.intergration.test.utils.DMS_PIC_HEIGHT
import com.intergration.test.utils.DMS_PIC_WIDTH
import com.intergration.test.utils.DOT_PREFACE_DURATION
import com.intergration.test.utils.TTS_ENGINE
import com.intergration.test.utils.VIDEO_FOLDER
import com.intergration.test.utils.VIDEO_FOLDER_
import com.intergration.test.utils.toByteBuffer
import com.mediatek.smartplatform.PreviewSource
import com.mediatek.smartplatform.RecordConfiguration
import com.mediatek.smartplatform.RecordSource
......@@ -290,7 +296,7 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba
binding.startFr.setOnClickListener {
LogUtils.file("点击开始人脸识别按钮")
if (frCoroutineScope == null) {
frCameraDevice = SmartPlatformManager.get().openCameraDevice(CAMERA_ID_DMS)
frCameraDevice = SmartPlatformManager.get().openCameraDevice(CAMERA_ID_DMS).also { it.parameters }
frCameraDevice?.setErrorCallback { i, s, spmCameraDevice ->
LogUtils.file("error camera id:${spmCameraDevice.cameraId},event id:$i,content:$s")
LogUtils.e("error camera id:${spmCameraDevice.cameraId},event id:$i,content:$s")
......@@ -328,10 +334,30 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba
"fr/"
).path
)
frCameraDevice?.startFr()?.sample(5000)?.collect {data->
LogUtils.d("received data from camera")
ensureActive()
val liveExtractResult = engine.extractRecognizeFeature(DMS_PIC_WIDTH, DMS_PIC_HEIGHT, data)
// frCameraDevice?.startFr()?.sample(5000)?.collect {data->
// LogUtils.d("received data from camera")
// ensureActive()
// val liveExtractResult = engine.extractRecognizeFeature(DMS_PIC_WIDTH, DMS_PIC_HEIGHT, data)
// val isRecognition = engine.compareFeatureWithScore(liveExtractResult)
// if (isRecognition) {
// tts.speak("人脸识别成功", TextToSpeech.QUEUE_ADD, null, null)
// binding.detectResult.text = "人脸识别成功"
// } else {
// tts.speak("人脸识别失败", TextToSpeech.QUEUE_ADD, null, null)
// binding.detectResult.text = "人脸识别失败"
// }
// }
while (isActive) {
val data = frCameraDevice?.startFr1()
val liveExtractResult = ArcFRExtractResult()
val extractRecognizeResult = engine.extractRecognizeFeature(DMS_PIC_WIDTH,DMS_PIC_HEIGHT,
ArcImageFormat.ARC_IMAGE_FORMAT_NV21,data?.toByteBuffer(),liveExtractResult
)
LogUtils.dTag("fr","extractRecognizeResult result:$extractRecognizeResult")
if (extractRecognizeResult != ArcErrorInfo.ARC_ERROR_OK) {
delay(INTERVAL_ERROR)
continue
}
val isRecognition = engine.compareFeatureWithScore(liveExtractResult)
if (isRecognition) {
tts.speak("人脸识别成功", TextToSpeech.QUEUE_ADD, null, null)
......@@ -340,6 +366,7 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba
tts.speak("人脸识别失败", TextToSpeech.QUEUE_ADD, null, null)
binding.detectResult.text = "人脸识别失败"
}
delay(INTERVAL_COMPLETED)
}
} else {
LogUtils.eTag("fr", "人脸算法初始化失败")
......
......@@ -31,13 +31,19 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.suspendCancellableCoroutine
import java.io.Closeable
import java.io.File
import kotlin.coroutines.AbstractCoroutineContextElement
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.resume
val COROUTINE_FR = CoroutineName("fr")
val INTERVAL_COMPLETED = 60 * 1000L * 5
val INTERVAL_ERROR = 2 * 1000L
val frJob = Job()
val featureList by lazy {
......@@ -138,6 +144,29 @@ fun SpmCameraDevice.startFr() = callbackFlow{
}
}
suspend fun SpmCameraDevice.startFr1() = suspendCancellableCoroutine<ByteArray>{continuation ->
val frDir = File(Environment.getExternalStorageDirectory(),"fr/")
if (!FileUtils.isFileExists(frDir)) {
FileUtils.createOrExistsDir(frDir)
}
val pictureName = File(frDir,"fr_tmp.jpg")
takePicture(
pictureName.absolutePath,
{ }, { status, _, fileName ->
if (status == SpmCameraDevice.CamPictureCallback.PICTURE_TAKEN_SUCCESS) {
val bitmap = ImageUtils.getBitmap(fileName)
val nv21Data = ArcSoftImageUtil.createImageData(
bitmap.width,
bitmap.height,
ArcSoftImageFormat.NV21
)
ArcSoftImageUtil.bitmapToImageData(bitmap, nv21Data, ArcSoftImageFormat.NV21)
continuation.resume(nv21Data)
}
}
)
}
val frCameraDevice: SpmCameraDevice by lazy {
SmartPlatformManager.get().openCameraDevice(CAMERA_ID_DMS)
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment