Commit 00e0b732 authored by 马乐's avatar 马乐

1.修复虹软图片数据工具报错问题

parent 02d1a237
......@@ -33,6 +33,14 @@ android {
}
}
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
buildTypes {
release {
minifyEnabled false
......
......@@ -6,7 +6,6 @@ import android.content.pm.PackageManager
import android.media.AudioManager
import android.media.CamcorderProfile
import android.os.Bundle
import android.os.CountDownTimer
import android.os.Environment
import android.speech.tts.TextToSpeech
import android.view.View
......@@ -41,10 +40,9 @@ import com.intergration.test.fr.COROUTINE_FR
import com.intergration.test.fr.FrCoroutineContext
import com.intergration.test.fr.FrCoroutineScope
import com.intergration.test.fr.compareFeatureWithScore
import com.intergration.test.fr.extractFeatureFromDir
import com.intergration.test.fr.extractRecognizeFeatureFromByteArray
import com.intergration.test.fr.extractRegisterFeature
import com.intergration.test.fr.extractRecognizeFeature
import com.intergration.test.fr.featureList
import com.intergration.test.fr.frCameraDevice
import com.intergration.test.fr.initializeFr
import com.intergration.test.fr.startFr
import com.intergration.test.utils.DMS_PIC_HEIGHT
......@@ -61,14 +59,13 @@ import com.mediatek.smartplatform.SpmCameraDevice.VideoCallback
import com.mediatek.smartplatform.VideoInfoMap
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.Job
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.flow.takeWhile
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
......@@ -118,6 +115,9 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba
private var dmsCameraDevice:SpmCameraDevice? = null
private var frCameraDevice:SpmCameraDevice? = null
@OptIn(FlowPreview::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
......@@ -256,7 +256,15 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba
binding.startFr.setOnClickListener {
LogUtils.file("点击开始人脸识别按钮")
if (frCoroutineScope == null) {
dmsCameraDevice = SmartPlatformManager.get().openCameraDevice(CAMERA_ID_DMS)
frCameraDevice = SmartPlatformManager.get().openCameraDevice(CAMERA_ID_DMS)
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")
}
// frCameraDevice?.takePicture(File(
// Environment.getExternalStorageDirectory(),
// "fr/male.jpg"
// ).path,null,null)
frCoroutineScope = FrCoroutineScope(FrCoroutineContext(engine = dmsEngine) + Dispatchers.Default + COROUTINE_FR)
}
frJob = frCoroutineScope?.launch {
......@@ -273,27 +281,23 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba
return@launch
}
val engine = coroutineContext[FrCoroutineContext]?.engine
frCameraDevice.setPreviewSurface(binding.dmsPreview.holder.surface,
frCameraDevice?.setPreviewSurface(binding.dmsPreview.holder.surface,
PreviewSource.GENERAL_CAMERA)
frCameraDevice.startPreview()
frCameraDevice?.startPreview()
val result = engine?.initializeFr()
LogUtils.eTag("fr","初始化结果:$result")
if (result == ArcErrorInfo.ARC_ERROR_OK) {
if (featureList.isNotEmpty()) {
engine.extractFeatureFromDir(
File(
Environment.getExternalStorageDirectory(),
"fr/"
).path
)
}
frCameraDevice.startFr().sample(5000).collect {
engine.extractRegisterFeature(
File(
Environment.getExternalStorageDirectory(),
"fr/"
).path
)
frCameraDevice?.startFr()?.sample(5000)?.collect {data->
LogUtils.d("received data from camera")
ensureActive()
val liveExtractResult = engine.extractRecognizeFeatureFromByteArray(
DMS_PIC_WIDTH,
DMS_PIC_HEIGHT,
it
)
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)
......@@ -308,7 +312,9 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba
}
} catch (e: CancellationException) {
LogUtils.eTag("fr","人脸识别error:${e.message}")
frCameraDevice?.stopPreview()
frCameraDevice?.stopRecord(RecordSource.GENERAL_CAMERA)
frCameraDevice?.let { smartPlatformManager.closeCameraDevice(it)}
} catch (e: Exception) {
e.printStackTrace()
}
......@@ -380,7 +386,8 @@ class MainActivity : AppCompatActivity(),TextToSpeech.OnInitListener,VideoCallba
override fun onDestroy() {
tts.stop()
tts.shutdown()
dmsJob?.cancel(CancellationException("退出MainActivity"))
dmsJob?.cancel(CancellationException("DMS-退出MainActivity"))
frJob?.cancel(CancellationException("DMS-退出MainActivity"))
super.onDestroy()
}
......
......@@ -68,32 +68,37 @@ fun ArcVisDriveEngine.initializeFr():Int{
return init(arcInfoParam)
}
fun ArcVisDriveEngine.extractFeatureFromDir(featureDir:String) {
fun ArcVisDriveEngine.extractRegisterFeature(featureDir:String) {
if (FileUtils.isFileExists(featureDir) && FileUtils.isDir(featureDir)) {
FileUtils.listFilesInDir(featureDir).forEach {
LogUtils.d("特征值:${it.path}")
val bitmap = ImageUtils.getBitmap(it)
val nv21Data = ArcSoftImageUtil.createImageData(bitmap.width, bitmap.height, ArcSoftImageFormat.NV21)
val nv21Data = ArcSoftImageUtil.createImageData(
bitmap.width,
bitmap.height,
ArcSoftImageFormat.NV21
)
ArcSoftImageUtil.bitmapToImageData(bitmap, nv21Data, ArcSoftImageFormat.NV21)
ArcFRExtractResult().also { result ->
extractRegisterFeature(
bitmap.width, bitmap.height, ArcImageFormat.ARC_IMAGE_FORMAT_NV21,
nv21Data.toByteBuffer(), result
)
LogUtils.dTag(
"fr",
"extract nv21 data for face recognize with file ${it.absoluteFile}"
)
featureList.add(result)
}
val arcFRExtractResult = ArcFRExtractResult()
val result = extractRegisterFeature(
bitmap.width, bitmap.height, ArcImageFormat.ARC_IMAGE_FORMAT_NV21,
nv21Data.toByteBuffer(), arcFRExtractResult
)
LogUtils.d("extractRegisterFeature result:$result,ArcFRExtractResult::${arcFRExtractResult.arcFaceInfo}")
featureList.add(arcFRExtractResult)
bitmap.recycle()
}
} else {
LogUtils.eTag("fr","待注册特征值集为空")
}
}
fun ArcVisDriveEngine.extractRecognizeFeatureFromByteArray(width:Int,Height:Int,data:ByteArray):ArcFRExtractResult{
fun ArcVisDriveEngine.extractRecognizeFeature(width:Int, Height:Int, data:ByteArray):ArcFRExtractResult{
val liveExtractResult = ArcFRExtractResult()
extractRecognizeFeature(width,Height,
val result = extractRecognizeFeature(width,Height,
ArcImageFormat.ARC_IMAGE_FORMAT_NV21,data.toByteBuffer(),liveExtractResult
)
LogUtils.d("extractRecognizeFeature result:$result,ArcFRExtractResult:${liveExtractResult.arcFaceInfo}")
return liveExtractResult
}
......@@ -105,6 +110,7 @@ fun ArcVisDriveEngine.compareFeatureWithScore(liveExtractResult:ArcFRExtractResu
liveExtractResult.arcFRFeature.featureData,
frSimilarity
)
LogUtils.d("frSimilarity:${frSimilarity.score},compareFeature result:${result}")
result == ArcErrorInfo.ARC_ERROR_OK && frSimilarity.score > 75
}
}
......
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