|
|
@@ -4,6 +4,7 @@ import android.Manifest
|
|
|
import android.content.Context
|
|
|
import android.content.pm.PackageManager
|
|
|
import android.graphics.*
|
|
|
+import android.os.Environment
|
|
|
import android.util.AttributeSet
|
|
|
import android.util.Log
|
|
|
import android.view.SurfaceHolder
|
|
|
@@ -13,16 +14,18 @@ import androidx.appcompat.app.AppCompatActivity
|
|
|
import androidx.camera.core.*
|
|
|
import androidx.camera.core.Camera
|
|
|
import androidx.camera.lifecycle.ProcessCameraProvider
|
|
|
+import androidx.camera.view.PreviewView
|
|
|
import androidx.core.app.ActivityCompat
|
|
|
import androidx.core.content.ContextCompat
|
|
|
-import cn.face.sdk.FaceDetTrack
|
|
|
import cn.face.sdk.FaceInterface
|
|
|
-import cn.face.sdk.FaceParam
|
|
|
+import cn.face.sdk.FaceRecog
|
|
|
+import java.io.File
|
|
|
import java.nio.ByteBuffer
|
|
|
import java.util.concurrent.ExecutorService
|
|
|
import java.util.concurrent.Executors
|
|
|
import kotlin.math.min
|
|
|
|
|
|
+
|
|
|
class CameraScanView(mContext: Context, attrs:AttributeSet?, defStyleAttr:Int) : SurfaceView(mContext,attrs,defStyleAttr) {
|
|
|
|
|
|
constructor(context: Context) : this(context, null)
|
|
|
@@ -30,14 +33,45 @@ class CameraScanView(mContext: Context, attrs:AttributeSet?, defStyleAttr:Int) :
|
|
|
|
|
|
private val mLogger: org.slf4j.Logger = org.slf4j.LoggerFactory.getLogger(this.javaClass)
|
|
|
|
|
|
- private lateinit var holder:SurfaceHolder
|
|
|
+ private var holder:SurfaceHolder
|
|
|
|
|
|
private var mSurfaceCallback= SurfaceCallback(mContext)
|
|
|
|
|
|
+ private lateinit var faceConfigFile:File
|
|
|
+
|
|
|
init {
|
|
|
holder=getHolder()
|
|
|
holder.addCallback(mSurfaceCallback)
|
|
|
|
|
|
+ Log.d("demo","访问外部文件权限"+Environment.getExternalStorageState())
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ val dir:File = File(Environment.getExternalStorageDirectory().absolutePath + File.separator ,"CWModels")
|
|
|
+
|
|
|
+ if(!dir.exists()) {
|
|
|
+ dir.mkdir()
|
|
|
+ }
|
|
|
+
|
|
|
+ faceConfigFile=File(dir,"CWR_Config_1_1.xml")
|
|
|
+ faceConfigFile.createNewFile()
|
|
|
+
|
|
|
+ mContext.assets.open("CWModels/CWR_Config_1_1.xml").use {
|
|
|
+ faceConfigFile.writeText(it.reader(charset = Charsets.UTF_8).readText())
|
|
|
+ }
|
|
|
+
|
|
|
+ val licence:String="MDQwNTE3NWQyNTkzNGM4MmQ3ZDk2MmQyM2UzODBhMmI1YjFjNjdjd2F1dGhvcml6Zd3n5+Xk5+fk/OXm5+fg5ef15efn5+Xk4Mfl4OXm5uvliObm6+Xm5uuR5ebm6+Xm5qLr5ebm6+Xmrubg5ufr5+v95+vn4OTk59Dk5ubr5+vn1uvn5+fm5Of+5g=="
|
|
|
+ Log.d("demo", "正在识别图像信息")
|
|
|
+ FaceRecog.getInstance();
|
|
|
+ val ret: Int = FaceRecog.cwCreateRecogHandle( faceConfigFile.path, licence,0)
|
|
|
+ if (ret >= FaceInterface.cw_errcode_t.CW_UNKNOWN_ERR) {
|
|
|
+ Log.d("demo", "启用识别程序SDK失败")
|
|
|
+ } else {
|
|
|
+ Log.d("demo", "启用识别程序SDK成功")
|
|
|
+ var iFeaLen:Int = FaceRecog.cwGetFeatureLength(ret)
|
|
|
+ Log.d("demo", "获取到人脸特征长度${iFeaLen}")
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
|
|
|
}
|
|
|
@@ -66,6 +100,8 @@ class CameraScanView(mContext: Context, attrs:AttributeSet?, defStyleAttr:Int) :
|
|
|
private var mCenterY:Float=0.0f
|
|
|
private var mCenterX:Float=0.0f
|
|
|
private var mRadius:Float=160f
|
|
|
+
|
|
|
+ lateinit var mPreview:PreviewView
|
|
|
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
|
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
|
|
mWidth = (measuredWidth - paddingLeft - paddingRight).toFloat()
|
|
|
@@ -79,9 +115,11 @@ class CameraScanView(mContext: Context, attrs:AttributeSet?, defStyleAttr:Int) :
|
|
|
}
|
|
|
|
|
|
|
|
|
- mSurfaceCallback.mCenterX=this@CameraScanView.mCenterX;
|
|
|
- mSurfaceCallback.mCenterY=this@CameraScanView.mCenterY;
|
|
|
- mSurfaceCallback.mRadius=this@CameraScanView.mRadius;
|
|
|
+ mSurfaceCallback.mCenterX=this@CameraScanView.mCenterX
|
|
|
+ mSurfaceCallback.mCenterY=this@CameraScanView.mCenterY
|
|
|
+ mSurfaceCallback.mRadius=this@CameraScanView.mRadius
|
|
|
+ mSurfaceCallback.mPreview=this@CameraScanView.mPreview
|
|
|
+ mSurfaceCallback.faceConfigFile=this@CameraScanView.faceConfigFile
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -118,6 +156,8 @@ class CameraScanView(mContext: Context, attrs:AttributeSet?, defStyleAttr:Int) :
|
|
|
var mCenterY:Float=0.0f
|
|
|
var mCenterX:Float=0.0f
|
|
|
var mRadius:Float=160f
|
|
|
+ lateinit var mPreview:PreviewView
|
|
|
+ var faceConfigFile:File?=null
|
|
|
|
|
|
|
|
|
override fun surfaceCreated(holder: SurfaceHolder) {
|
|
|
@@ -159,10 +199,13 @@ class CameraScanView(mContext: Context, attrs:AttributeSet?, defStyleAttr:Int) :
|
|
|
canvas.drawCircle(mCenterX, mCenterY, mRadius, mCirclePaint)
|
|
|
|
|
|
holder.unlockCanvasAndPost(canvas);
|
|
|
+
|
|
|
+
|
|
|
+ runCamera(tContext,holder,mPreview)
|
|
|
}
|
|
|
|
|
|
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
|
|
|
- runCamera(tContext,holder)
|
|
|
+
|
|
|
}
|
|
|
|
|
|
override fun surfaceDestroyed(holder: SurfaceHolder) {
|
|
|
@@ -173,7 +216,7 @@ class CameraScanView(mContext: Context, attrs:AttributeSet?, defStyleAttr:Int) :
|
|
|
|
|
|
|
|
|
|
|
|
- fun runCamera(context: Context,holder: SurfaceHolder){
|
|
|
+ fun runCamera(context: Context,holder: SurfaceHolder,previewView: PreviewView?){
|
|
|
|
|
|
if( PackageManager.PERMISSION_GRANTED!= ContextCompat.checkSelfPermission(context , Manifest.permission.CAMERA)){
|
|
|
ActivityCompat.requestPermissions(context as AppCompatActivity, arrayOf(Manifest.permission.CAMERA),1)
|
|
|
@@ -184,7 +227,7 @@ class CameraScanView(mContext: Context, attrs:AttributeSet?, defStyleAttr:Int) :
|
|
|
|
|
|
|
|
|
val cameraSelector: CameraSelector = CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
|
|
|
- // mBinding.btnDemoView.implementationMode= PreviewView.ImplementationMode.COMPATIBLE
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
@@ -222,22 +265,10 @@ class CameraScanView(mContext: Context, attrs:AttributeSet?, defStyleAttr:Int) :
|
|
|
buffer.rewind()
|
|
|
buffer.get(data)
|
|
|
|
|
|
+ faceConfigFile?.path
|
|
|
|
|
|
|
|
|
- Log.d("demo", "正在识别图像信息")
|
|
|
- FaceDetTrack.getInstance()
|
|
|
- val ret: Int = FaceDetTrack.cwCreateDetHandle("", licence)
|
|
|
- if (ret >= FaceInterface.cw_errcode_t.CW_UNKNOWN_ERR) {
|
|
|
- Log.d("demo", "启用识别程序SDK失败")
|
|
|
- } else {
|
|
|
- Log.d("demo", "启用识别程序SDK成功")
|
|
|
- val faceParam = FaceParam()
|
|
|
- FaceDetTrack.cwGetFaceParam(ret, faceParam)
|
|
|
- faceParam.minSize = 30
|
|
|
- faceParam.maxSize = 400;
|
|
|
- FaceDetTrack.cwSetFaceParam(ret, faceParam, "");
|
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
|
|
@@ -263,7 +294,7 @@ class CameraScanView(mContext: Context, attrs:AttributeSet?, defStyleAttr:Int) :
|
|
|
|
|
|
|
|
|
|
|
|
- //preview?.setSurfaceProvider()
|
|
|
+ preview?.setSurfaceProvider(previewView?.surfaceProvider)
|
|
|
|
|
|
|
|
|
|