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

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

parent 0ecbfa90
...@@ -15,8 +15,10 @@ import androidx.appcompat.app.AppCompatActivity ...@@ -15,8 +15,10 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.arcsoft.visdrive.sdk.ArcErrorInfo import com.arcsoft.visdrive.sdk.ArcErrorInfo
import com.arcsoft.visdrive.sdk.ArcVisDriveEngine 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.constant.common.ArcModType
import com.arcsoft.visdrive.sdk.model.common.ArcActiveEnvParam 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.LogUtils
import com.blankj.utilcode.util.TimeUtils import com.blankj.utilcode.util.TimeUtils
import com.intergration.test.databinding.ActivityMainBinding import com.intergration.test.databinding.ActivityMainBinding
...@@ -39,18 +41,22 @@ import com.intergration.test.dms.startDms ...@@ -39,18 +41,22 @@ import com.intergration.test.dms.startDms
import com.intergration.test.fr.COROUTINE_FR import com.intergration.test.fr.COROUTINE_FR
import com.intergration.test.fr.FrCoroutineContext import com.intergration.test.fr.FrCoroutineContext
import com.intergration.test.fr.FrCoroutineScope 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.compareFeatureWithScore
import com.intergration.test.fr.extractRegisterFeature import com.intergration.test.fr.extractRegisterFeature
import com.intergration.test.fr.extractRecognizeFeature import com.intergration.test.fr.extractRecognizeFeature
import com.intergration.test.fr.featureList import com.intergration.test.fr.featureList
import com.intergration.test.fr.initializeFr import com.intergration.test.fr.initializeFr
import com.intergration.test.fr.startFr 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_HEIGHT
import com.intergration.test.utils.DMS_PIC_WIDTH import com.intergration.test.utils.DMS_PIC_WIDTH
import com.intergration.test.utils.DOT_PREFACE_DURATION import com.intergration.test.utils.DOT_PREFACE_DURATION
import com.intergration.test.utils.TTS_ENGINE 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.VIDEO_FOLDER_ import com.intergration.test.utils.VIDEO_FOLDER_
import com.intergration.test.utils.toByteBuffer
import com.mediatek.smartplatform.PreviewSource import com.mediatek.smartplatform.PreviewSource
import com.mediatek.smartplatform.RecordConfiguration import com.mediatek.smartplatform.RecordConfiguration
import com.mediatek.smartplatform.RecordSource import com.mediatek.smartplatform.RecordSource
...@@ -290,7 +296,7 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba ...@@ -290,7 +296,7 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba
binding.startFr.setOnClickListener { binding.startFr.setOnClickListener {
LogUtils.file("点击开始人脸识别按钮") LogUtils.file("点击开始人脸识别按钮")
if (frCoroutineScope == null) { 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 -> frCameraDevice?.setErrorCallback { i, s, spmCameraDevice ->
LogUtils.file("error camera id:${spmCameraDevice.cameraId},event id:$i,content:$s") LogUtils.file("error camera id:${spmCameraDevice.cameraId},event id:$i,content:$s")
LogUtils.e("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 ...@@ -328,10 +334,30 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba
"fr/" "fr/"
).path ).path
) )
frCameraDevice?.startFr()?.sample(5000)?.collect {data-> // frCameraDevice?.startFr()?.sample(5000)?.collect {data->
LogUtils.d("received data from camera") // LogUtils.d("received data from camera")
ensureActive() // ensureActive()
val liveExtractResult = engine.extractRecognizeFeature(DMS_PIC_WIDTH, DMS_PIC_HEIGHT, data) // 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) val isRecognition = engine.compareFeatureWithScore(liveExtractResult)
if (isRecognition) { if (isRecognition) {
tts.speak("人脸识别成功", TextToSpeech.QUEUE_ADD, null, null) tts.speak("人脸识别成功", TextToSpeech.QUEUE_ADD, null, null)
...@@ -340,6 +366,7 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba ...@@ -340,6 +366,7 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba
tts.speak("人脸识别失败", TextToSpeech.QUEUE_ADD, null, null) tts.speak("人脸识别失败", TextToSpeech.QUEUE_ADD, null, null)
binding.detectResult.text = "人脸识别失败" binding.detectResult.text = "人脸识别失败"
} }
delay(INTERVAL_COMPLETED)
} }
} else { } else {
LogUtils.eTag("fr", "人脸算法初始化失败") LogUtils.eTag("fr", "人脸算法初始化失败")
......
...@@ -31,13 +31,19 @@ import kotlinx.coroutines.Job ...@@ -31,13 +31,19 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.suspendCancellableCoroutine
import java.io.Closeable import java.io.Closeable
import java.io.File import java.io.File
import kotlin.coroutines.AbstractCoroutineContextElement import kotlin.coroutines.AbstractCoroutineContextElement
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.resume
val COROUTINE_FR = CoroutineName("fr") val COROUTINE_FR = CoroutineName("fr")
val INTERVAL_COMPLETED = 60 * 1000L * 5
val INTERVAL_ERROR = 2 * 1000L
val frJob = Job() val frJob = Job()
val featureList by lazy { val featureList by lazy {
...@@ -138,6 +144,29 @@ fun SpmCameraDevice.startFr() = callbackFlow{ ...@@ -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 { val frCameraDevice: SpmCameraDevice by lazy {
SmartPlatformManager.get().openCameraDevice(CAMERA_ID_DMS) 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