如果不是CameraX不能使用,建议使用CameraX《基于CameraX实现人脸》

不推荐Camera2,适配难!还巨麻烦,要写的代码配置太多了!

一代我是直接新建的Class继承了Texture.SurfaceTextureListener,非Activity

一、初始化

public class FaceAnalyzeByOne implements TextureView.SurfaceTextureListener {private static final String TAG = "一代Camera";private Camera mCamera;private Camera.CameraInfo mCameraInfo=new Camera.CameraInfo();private int cameraID=0;private Activity that;private TextureView mTextureView;private FaceEngine faceObj;private SurfaceTexture mSurface;private int afCode = -1; // sdk状态public boolean needPreview=true; // 是否需要预览框?public int previewRotation=Surface.ROTATION_0; // 预览的旋转角度?private boolean isFrontCamera = true; // 用前置摄像头?private int lastFaceID = -1; // 上次识别到的人脸id,每次镜头里的同一人脸会是固定id,同一人离镜再入镜会是新IDpublic CameraCallback faceEmit;public Point screenPoint= new Point();public Point previewPoint; // 最终相机预览的的一个分辨率,不是预览容器的宽高// 同名方法直接初始化构造public FaceAnalyzeByOne(Activity context,CameraCallback callback){that = context;that.getWindowManager().getDefaultDisplay().getSize(screenPoint);initEngine();// 初始化SDKfaceEmit=callback;//动态创建预览的viewRelativeLayout layout=that.findViewById(R.id.camerax_preview);mTextureView =new TextureView(that);layout.addView(mTextureView);mTextureView.setSurfaceTextureListener(this);//监听这个viewOK等}
}

二、SDK相关

    //注销arcsoft 引擎public void unInitEngine() {if (afCode == 0) {afCode = faceObj.unInit();Log.i(TAG, "unInitEngine: " + afCode);}}//初始化arcsoft引擎public void initEngine(){faceObj = new FaceEngine();afCode = faceObj.init(that.getApplicationContext(), DetectMode.ASF_DETECT_MODE_VIDEO, DetectFaceOrientPriority.ASF_OP_ALL_OUT,// 全角度检测16, 3,faceObj.ASF_FACE_DETECT | faceObj.ASF_AGE | faceObj.ASF_FACE3DANGLE | faceObj.ASF_GENDER| faceObj.ASF_LIVENESS| faceObj.ASF_FACE_RECOGNITION);if (afCode != ErrorInfo.MOK) {if(afCode == ErrorInfo.MERR_ASF_NOT_ACTIVATED){Log.e(Tag,"设备SDK未激活");}else{Log.e(Tag,"初始化失败:"+afCode);}}}

三、因为引入了TextureView.SurfaceTextureListener所以有四个方法重写一下,第一个是关键

   // 监听view可用了@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
//        Log.i(TAG, "onSurfaceTextureAvailable: " + width + ", " + height);mSurface=surface;startCamera();}@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {closeCamera();return false;}@Overridepublic void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}@Overridepublic void onSurfaceTextureUpdated(SurfaceTexture surface) {}

四、预览的view初始化OK,初始化相机

    // 初始化相机public void startCamera(){mCamera = createCamera();setOrientation();try {mCamera.setPreviewTexture(mSurface);mCamera.setPreviewCallback(new Camera.PreviewCallback() {private long lastDrawTime = 0;private int timerSpace = 300; // 识别间隔@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {long start = System.currentTimeMillis();if (start - lastDrawTime < timerSpace) {return;}lastDrawTime = System.currentTimeMillis();getFaceInfo(data);// 获取到的直接是NV21数据,不需要像其他两代相机一样转换}});} catch (IOException e) {e.printStackTrace();}mCamera.startPreview();}   //创建相机的方法private Camera createCamera() {cameraID=isFrontCamera?Camera.CameraInfo.CAMERA_FACING_FRONT:Camera.CameraInfo.CAMERA_FACING_BACK;Camera camera = Camera.open(cameraID);Camera.Parameters mParameters = camera.getParameters();Camera.getCameraInfo(cameraID, mCameraInfo);List<String> supportedFocusModes = mParameters.getSupportedFocusModes();if (supportedFocusModes != null && supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {mParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); // 设置聚焦模式(自动)}mParameters.setPreviewFormat(ImageFormat.NV21); //预览格式mParameters.setExposureCompensation(0); // 设置曝光强度Camera.Size bestSize = getBestPreview(mParameters.getSupportedPreviewSizes(),screenPoint);Log.e(TAG, "最佳预览尺寸: " + bestSize.width + ", " + bestSize.height);previewPoint = new Point(bestSize.width,bestSize.height);mParameters.setPreviewSize(bestSize.width, bestSize.height); // 设置预览大小camera.setParameters(mParameters);return camera;}// 确认画面的方向public void setOrientation(){int rotation=that.getWindowManager().getDefaultDisplay().getRotation();int degrees = rotation * 90;switch (rotation) {case Surface.ROTATION_0: degrees = 0; break;case Surface.ROTATION_90: degrees = 90; break;case Surface.ROTATION_180: degrees = 180; break;case Surface.ROTATION_270: degrees = 270; break;}int result;if (isFrontCamera) {result = (mCameraInfo.orientation + degrees) % 360;result = (360 - result) % 360;} else {result = (mCameraInfo.orientation - degrees + 360) % 360;}mCamera.setDisplayOrientation(result);}

五、分析图像获取特征

    private void getFaceInfo(byte[] nv21) {List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();//装获取到的人脸列表FaceFeature faceFeature = new FaceFeature(); //装特征数据//第一步是送数据给arcsoft sdk,检查是否有人脸信息。int code = faceObj.detectFaces(nv21, previewPoint.x,previewPoint.y,faceObj.CP_PAF_NV21, faceInfoList);
//        Log.e("人脸数据长度", nv21.length+"人脸"+code);//数据检查正常,并且含有人脸信息,则进行下一步的人脸识别。if (code == ErrorInfo.MOK && faceInfoList.size() > 0) {int newFaceID = faceInfoList.get(0).getFaceId();if (lastFaceID == newFaceID) { // 相同脸则returnLog.e("人脸ID相同", "旧" + lastFaceID);// + "、新" + newFaceIDreturn;}lastFaceID = newFaceID;code = faceObj.extractFaceFeature(nv21, previewPoint.x,previewPoint.y,faceObj.CP_PAF_NV21, faceInfoList.get(0), faceFeature);if (code != ErrorInfo.MOK) {return;}byte[] featureData=faceFeature.getFeatureData();//最终的特征数据!!!post(featureData); //把数据给后端去查信息}}

六、其他

    //销毁创建的相机public void closeCamera(){mCamera.setPreviewCallback(null);mCamera.stopPreview();mCamera.lock();mCamera.release();}/*** 回调接口定义*/public interface CameraCallback {void onFind(JSONObject response) throws JSONException;void onUnFind(JSONObject response) throws JSONException;}// 切换前后置摄像头public void switchCamera(){isFrontCamera=!isFrontCamera;closeCamera();startCamera();}/*** 获取最佳预览分辨率,解决预览拉伸问题** @param supportedSize    相机支持的预览分辨率* @param screenResolution 控件宽高或屏幕宽高* @return 与预览控件比例最接近预览分辨率*/public static Size getBestPreview(List<Size> supportedSize, Point screenResolution) {// 如果x<y,交换x,y的值if (screenResolution.x < screenResolution.y) {int temp = screenResolution.x;screenResolution.x = screenResolution.y;screenResolution.y = temp;}// 计算控件宽高比float referRatio = screenResolution.x * 1.0f / screenResolution.y;float lastDiff = 0.5f;Size lastSize = null;for (Size size : supportedSize) {
//            Log.e("可用尺寸", size.width+"*"+size.height);// 只找出预览高度>=720 分辨率if (size.height < 720) {continue;}// 计算分辨率宽高比float supportRatio = size.width * 1.0f / size.height;// 计算差值的绝对值float currentDiff = Math.abs(referRatio - supportRatio);// 循环取出差值最小的分辨率if (currentDiff < lastDiff) {lastDiff = currentDiff;lastSize = size;}}
//        return new Point(lastSize.getWidth(), lastSize.getHeight());return lastSize;}

七、其他页面使用

//在activity页面
FaceAnalyzeByOneObj = new FaceAnalyzeByOne(this,new FaceAnalyzeByOne.CameraCallback() {@Overridepublic void onFind(JSONObject response) throws JSONException {
//     Log.e("找到人脸", response.toString());}@Overridepublic void onUnFind(JSONObject response) throws JSONException {
//     Log.e("未找到", response.toString());}
});切换镜头
FaceAnalyzeByOneObj.switchCamera();

安卓Camera一代基于虹软人脸识别程序开发相关推荐

  1. 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)

    大家应该都知道几个很常见的例子,比如在张学友的演唱会,在安检通道检票时,通过人像识别系统成功识别捉了好多在逃人员,被称为逃犯克星:人行横道不遵守交通规则闯红灯的路人被人脸识别系统抓拍放在大屏上以示警告 ...

  2. 【javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码)】

    javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码) 文章目录 javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄 ...

  3. 基于虹软人脸识别Web私有化服务(快速人脸服务集成二次开发)

    基于虹软人脸识别微服务 生物智能识别服务开放接口(基于OAuth2.0) 完整文档 生物智能识别服务开放接口202000722v1.03.01.pdf 生物智能识别服务系统是一个将人脸识别.指纹识别. ...

  4. unity接入实现人脸识别应用-基于虹软人脸识别算法4.0

    一.准备工作 1.下载虹软人脸识别增值版SDK 4.0 1)注册并登录开发者中心 2)下载虹软人脸识别SDK 2.安装Unity3D及Visual Studio 2019开发环境 1)安装Unity ...

  5. android虹软人脸识别简书,基于虹软人脸识别API和Qt5的人脸识别

    测试和使用了虹软的人脸API在QT5环境下设计了一个简单的人脸识别软件,实现了对人脸的跟踪和人脸识别.摄像头的控制以及图像格式的转换使用了Opencv,图像显示使用的是QT5的Qimage控件.下面是 ...

  6. 基于虹软人脸识别API和Qt5的人脸识别

    2019独角兽企业重金招聘Python工程师标准>>> 测试和使用了虹软的人脸API在QT5环境下设计了一个简单的人脸识别软件,实现了对人脸的跟踪和人脸识别.摄像头的控制以及图像格式 ...

  7. 基于虹软人脸识别-iOS画框更改及前后摄像头的切换

    公司项目使用过程中,为了配合市场需要,需要增加人脸识别+活体检测的功能.并且要求人脸识别的样式接近于主流产品的样式.所以选择了方便快捷的虹软人脸识别SDK. 1.项目逻辑流程图 根据下面的逻辑梳理,可 ...

  8. 基于虹软人脸识别,实现超市人脸支付

    前言 随着计算机和网络技术的不断发达,人脸识别在我们的生活中也不断的被应用,而无人超市以及在超市中的人脸支付并没有普及,本文作为一个项目进行超市人脸支付的场景测试与探索. 实现功能 使用python语 ...

  9. 基于虹软人脸识别技术,实现新生实时身份认证和报到统计

    由于工作业务需要,笔者开发了一套新生入学身份核验系统,用于在新生入学时实时核验其身份(教育部要求新生入学时要进行人脸比对),同时实时统计新生的报到情况.核验流程如下:学生持身份证报到,通过身份证读卡器 ...

最新文章

  1. OpenVINO 部署 YOLOv5 转换IR文件
  2. linux的centos版本修改时间重启后无效的问题
  3. struts的国际化
  4. boost::gil::is_planar用法的测试程序
  5. 人脸检测算法_腾讯已开源高精度人脸检测算法DSFD
  6. 【DRP】【SQL】-悲观锁-防止多用户同时操作时出现脏数据
  7. cognos 样例 oracle,cognos10.2 sample(ORACLE学样例)
  8. 数据挖掘有哪些主要步骤
  9. 苹果和亚马逊因疑似侵犯云端同步功能专利而被提起美国337调查
  10. 企业的云服务选择:SaaS、PaaS、IaaS对比分析
  11. 中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
  12. python write函数输出字体有颜色_跪求response.write输出字体颜色解决方法
  13. 计算机能破坏光盘中的系统吗,Windows 10中的“光盘映像文件已损坏”怎么办?...
  14. [译]数据包在 Kubernetes 中的一生(2)
  15. Spark面试精选题(03)
  16. 优酷盗播引版权方围攻 视频大佬陷孤军奋战困局
  17. Linux系统中用命令行清空垃圾箱Trash
  18. python语言开发的软件有哪些-软件开发常用的五大编程语言有哪些
  19. 最齐全的形象墙样机模板素材,速来收藏
  20. Flask-Login使用详解

热门文章

  1. 狗东API接口,item_get - 获得JD商品详情
  2. cad2020卸载工具_2020年您应该拥有的12个自由职业者设计工具
  3. 解决删除chrome注册表残留问题
  4. MHD-S210W全向麦克风
  5. 小朋友把游戏藏在计算机里,如何设置孩子玩电脑游戏的时间
  6. 习惯七 不断更新---平衡的自我提升原则
  7. 网易云 -微信小程序-vue
  8. 推荐一款最好用的windows文件管理器
  9. 2018年区块链红黑榜-千氪
  10. 2.2.太极平台框架—组件的字段介绍与使用