虹软人脸识别 - ArcFace Go应用套件接入说明

本文档介绍了如何接入和使用虹软ArcFace Go应用套件,包括获取源码、解决编译报错、实现Camera1Engine和ImageUtils类,以及安装和使用APK的详细步骤,旨在帮助开发者快速上手人脸识别应用的开发。
摘要由CSDN通过智能技术生成

运行虹软应用套件开源代码,发现报错。查看错误信息,说的是缺少类(详细说明看下方)
咨询了下虹软小助手,表示这两个类确实是需要自己实现的
晚上加班把这个做出来了,不得不说虹软开放了应用套件,确实省去了很多研发时间,当天晚上就跑通了
下面把类实现分享在这里,给有需要的人做个参考。。

导航:
– 获取ArcFaceGo包
– 运行ArcFaceGo工程
– 安装及使用

一、获取ArcFaceGo包
进入虹软ArcFaceGo官方页面https://ai.arcsoft.com.cn/product/arcfacego.html,按照步骤获取ArcFaceGo_Source_3.1.1.zip,其中包含ArcFaceGo源码及相关文档信息。

二、运行ArcFaceGo工程
2.1 获取工程
解压ArcFaceGo_Source_3.1.1.zip,解压后进入sourcecode目录,解压其中的ArcFaceGo.zip获取工程

2.2 编译工程
2.2.1 查看编译报错
使用Android Studio打开工程,并执行Build,会提示报错,有两个类里有类不存在,需要自己实现:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.2.2 实现Camera1Engine类

<font size="2">package com.arcsoft.arcfacesingle.libutil;

import android.graphics.ImageFormat;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.util.Pair;

import com.arcsoft.asg.libcommon.contract.ICameraEngine;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;

/**
* ICameraEngine的实现
*/
public class Camera1Engine extends ICameraEngine {

    private static final int COUNT_CAMERA_ONE = 1;
    private static final int COUNT_CAMERA_TWO = 2;
    private Camera camera;
    private boolean usePreAlloc;

    @Override
    public void setUsePreAlloc(boolean usePreAlloc) {
        this.usePreAlloc = usePreAlloc;
    }

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        super.onPreviewFrame(data, camera);
        if (usePreAlloc) {
            camera.addCallbackBuffer(data);
        }
    }

    @Override
    public void startCamera(SurfaceTexture surfaceTexture, int cameraId, int previewRotation, int previewWidth,
                            int previewHeight, int bufferCount, int bufferSize) throws IOException {
        camera = Camera.open(cameraId);
        camera.setDisplayOrientation(previewRotation);
        Camera.Parameters parameters = camera.getParameters();
        parameters.setPreviewFormat(ImageFormat.NV21);
        parameters.setPreviewSize(previewWidth, previewHeight);
        List<String> supportedFocusModes = parameters.getSupportedFocusModes();
        if (supportedFocusModes != null && supportedFocusModes.size() > 0) {
            if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
            } else if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
            } else if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
            }
        }
        camera.setParameters(parameters);
        camera.setPreviewTexture(surfaceTexture);
        if (usePreAlloc) {
            for (int i = 0; i < bufferCount; i++) {
                camera.addCallbackBuffer(new byte[bufferSize]);
            }
            camera.setPreviewCallbackWithBuffer(this);
        } else {
            camera.setPreviewCallback(this);
        }
        camera.startPreview();
    }

    @Override
    public void setPreviewTexture(SurfaceTexture surfaceTexture) {
        try {
            if (camera != null) {
                camera.setPreviewTexture(surfaceTexture);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void releaseCamera() {
        if (camera != null) {
            if (usePreAlloc) {
                camera.setPreviewCallbackWithBuffer(null);
            } else {
                camera.setPreviewCallback(null);
            }
            camera.stopPreview();
            camera.release();
            camera = null;
        }
    }

    @Override
    public List<Integer> getCameraPositionList() {
        List<Integer> cameraPosList = new ArrayList<>();
        int cameraPosBack = Camera.CameraInfo.CAMERA_FACING_BACK;
        int cameraPosFront = Camera.CameraInfo.CAMERA_FACING_FRONT;
        int cameraCount = Camera.getNumberOfCameras();
        if (cameraCount == COUNT_CAMERA_ONE) {
            cameraPosList.add(cameraPosBack);
        } else if (cameraCount >= COUNT_CAMERA_TWO) {
            cameraPosList.add(cameraPosBack);
            cameraPosList.add(cameraPosFront);
        }
        return cameraPosList;
    }

    @Override
    public List<Pair<Integer, Integer>> getCameraPreviewSizeList() {
        List<Camera.Size> commonSizeList = new ArrayList<>();
        int cameraPosBack = Camera.CameraInfo.CAMERA_FACING_BACK;
        int cameraPosFront = Camera.CameraInfo.CAMERA_FACING_FRONT;
        int cameraCount = Camera.getNumberOfCameras();
        if (cameraCount == COUNT_CAMERA_ONE) {
            try {
                Camera backCamera = Camera.open(cameraPosBack);
                commonSizeList = backCamera.getParameters().getSupportedPreviewSizes();
                backCamera.release();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (cameraCount >= COUNT_CAMERA_TWO) {
            List<Camera.Size> backSizeList;
            try {
                Camera.CameraInfo cameraInfo2 = new Camera.CameraInfo();
                Camera.getCameraInfo(cameraPosBack, cameraInfo2);
                Camera backCamera = Camera.open(cameraPosBack);
                backSizeList = backCamera.getParameters().getSupportedPreviewSizes();
                backCamera.release();
            } catch (Exception e) {
                backSizeList = new ArrayList<>();
 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值