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

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

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