广告
返回顶部
首页 > 资讯 > 精选 >Android基于ArcSoft如何实现人脸识别
  • 132
分享到

Android基于ArcSoft如何实现人脸识别

2023-06-22 01:06:25 132人浏览 泡泡鱼
摘要

小编给大家分享一下Android基于ArcSoft如何实现人脸识别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在虹软的开发者中心创建一个自己的应用,将APP_I

小编给大家分享一下Android基于ArcSoft如何实现人脸识别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

在虹软的开发者中心创建一个自己的应用,将APP_ID与SDK_KEY记录下来,后面会用到。创建完后就可以下载SDK了。

Android基于ArcSoft如何实现人脸识别

下载完后,就可以根据SDK包里的开发说明文档和代码进行参考和学习。以下是开发说明文档中的SDK包结构的截图。

Android基于ArcSoft如何实现人脸识别

创建一个空项目,将SDK包里的.jar文件和.so文件复制到该项目的如下包下。接下来的配置十分重要,稍微没处理一个,就是一个头大的bug。

Android基于ArcSoft如何实现人脸识别

“在app里的build.gradle” 第一个红框原本是androidx的,与support是不兼容的,所以要改,因此,整个项目用到androidx的地方都需要改。第二个红框是ndk,加了这个才能找到刚才复制进去的.so文件。第三个红框也要改成如下。下面的dependencies要注意把androidx的改掉。

Android基于ArcSoft如何实现人脸识别

Android基于ArcSoft如何实现人脸识别

“在整个项目里的build.gradle” 记得加上jcenter()。

Android基于ArcSoft如何实现人脸识别

在gradle.properties里可能会有androidx的东西,也要删掉。

Android基于ArcSoft如何实现人脸识别

在AndroidManifest.xml中的中添加权限申请,在中添加。

manifest:

<uses-permission android:name="android.permission.CAMERA" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

provider:

<provider            android:name="android.support.v4.content.FileProvider"            android:authorities="${applicationId}.provider"            android:exported="false"            android:grantUriPermissions="true">            <meta-data                android:name="android.support.FILE_PROVIDER_PATHS"                android:resource="@xml/provider_paths" />        </provider>

在添加后要在res下创建一个xml包,里面添加一个provider_paths.xml文件,里面的代码如下:

<?xml version="1.0" encoding="utf-8"?><paths xmlns:android="Http://schemas.android.com/apk/res/android">    <external-path name="external_files" path="."/>    <root-path        name="root_path"        path="." /></paths>

从SDK包中引入如下功能包模块和BaseActivity,并将common包下的Constants中的APP_ID,SDK_KEY改成刚才所记录下来的内容。

Android基于ArcSoft如何实现人脸识别

创建3个acvitity,一个是主界面,一个是人脸库的管理界面,一个是人脸识别功能界面。

Android基于ArcSoft如何实现人脸识别

layout包下需要引入以下5个布局文件。

Android基于ArcSoft如何实现人脸识别

主界面主要的功能就是激活权限、连接动态库和激活引擎,我通过修改onCreate()和util包下的ConfigUtil.class的代码,让其能够自动激活和自动修改为全方向人脸检查(其他选择好像不能够实现人脸识别)。以下是激活引擎的代码。

public void activeEngine(final View view) {        if (!libraryExists) {            Toast.makeText(this, "未找到库文件!", Toast.LENGTH_SHORT).show();            return;        }        if (!checkPermissions(NEEDED_PERMISSIONS)) {            ActivityCompat.requestPermissions(this, NEEDED_PERMISSIONS, ACTION_REQUEST_PERMISSIONS);            return;        }        if (view != null) {            view.setClickable(false);        }        Observable.create(new ObservableOnSubscribe<Integer>() {            @Override            public void subscribe(ObservableEmitter<Integer> emitter) {                int activeCode = FaceEngine.activeOnline(MainActivity.this, Constants.APP_ID, Constants.SDK_KEY);                emitter.onNext(activeCode);            }        })                .subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Observer<Integer>() {                    @Override                    public void onSubscribe(Disposable d) {                    }                    @Override                    public void onNext(Integer activeCode) {                        if (activeCode == ErrorInfo.MOK) {                            Toast.makeText(MainActivity.this, "激活成功!", Toast.LENGTH_SHORT).show();                        } else if (activeCode == ErrorInfo.MERR_ASF_ALREADY_ACTIVATED){                            Toast.makeText(MainActivity.this, "已激活!", Toast.LENGTH_SHORT).show();                        } else {                            Toast.makeText(MainActivity.this, "激活失败!", Toast.LENGTH_SHORT).show();                        }                        if (view != null) {                            view.setClickable(true);                        }                        ActiveFileInfo activeFileInfo = new ActiveFileInfo();                    }                    @Override                    public void onError(Throwable e) {                        Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();                        if (view != null) {                            view.setClickable(true);                        }                    }                    @Override                    public void onComplete() {                    }                });    }

人脸识别界面是最复杂的。其中不仅有人脸识别的功能,还有注册人脸和活体检测的功能。

通过手机自带的摄像头来实现人脸识别和活体检测的逻辑:

private void initCamera() {        DisplayMetrics metrics = new DisplayMetrics();        getWindowManager().getDefaultDisplay().getMetrics(metrics);        final FaceListener faceListener = new FaceListener() {            @Override            public void onFail(Exception e) {                Log.e(TAG, "onFail: " + e.getMessage());            }            //请求FR的回调            @Override            public void onFaceFeatureInfoGet(@Nullable final FaceFeature faceFeature, final Integer requestId, final Integer errorCode) {                //FR成功                if (faceFeature != null) {//                    Log.i(TAG, "onPreview: fr end = " + System.currentTimeMillis() + " trackId = " + requestId);                    Integer liveness = liveneSSMap.get(requestId);                    //不做活体检测的情况,直接搜索                    if (!livenessDetect) {                        searchFace(faceFeature, requestId);                    }                    //活体检测通过,搜索特征                    else if (liveness != null && liveness == LivenessInfo.ALIVE) {                        searchFace(faceFeature, requestId);                    }                    //活体检测未出结果,或者非活体,延迟执行该函数                    else {                        if (requestFeatureStatusMap.containsKey(requestId)) {                            Observable.timer(WAIT_LIVENESS_INTERVAL, TimeUnit.MILLISECONDS)                                    .subscribe(new Observer<Long>() {                                        Disposable disposable;                                        @Override                                        public void onSubscribe(Disposable d) {                                            disposable = d;                                            getFeatureDelayedDisposables.add(disposable);                                        }                                        @Override                                        public void onNext(Long aLong) {                                            onFaceFeatureInfoGet(faceFeature, requestId, errorCode);                                        }                                        @Override                                        public void onError(Throwable e) {                                        }                                        @Override                                        public void onComplete() {                                            getFeatureDelayedDisposables.remove(disposable);                                        }                                    });                        }                    }                }                //特征提取失败                else {                    if (increaseAndGetValue(extractErrorRetryMap, requestId) > MAX_RETRY_TIME) {                        extractErrorRetryMap.put(requestId, 0);                        String msg;                        // 传入的FaceInfo在指定的图像上无法解析人脸,此处使用的是RGB人脸数据,一般是人脸模糊                        if (errorCode != null && errorCode == ErrorInfo.MERR_FSDK_FACEFEATURE_LOW_CONFIDENCE_LEVEL) {                            msg = "人脸置信度低!";                        } else {                            msg = "ExtractCode:" + errorCode;                        }                        faceHelper.setName(requestId, "未通过!");                        // 在尝试最大次数后,特征提取仍然失败,则认为识别未通过                        requestFeatureStatusMap.put(requestId, RequestFeatureStatus.FAILED);                        retryRecognizeDelayed(requestId);                    } else {                        requestFeatureStatusMap.put(requestId, RequestFeatureStatus.TO_RETRY);                    }                }            }            @Override            public void onFaceLivenessInfoGet(@Nullable LivenessInfo livenessInfo, final Integer requestId, Integer errorCode) {                if (livenessInfo != null) {                    int liveness = livenessInfo.getLiveness();                    livenessMap.put(requestId, liveness);                    // 非活体,重试                    if (liveness == LivenessInfo.NOT_ALIVE) {                        faceHelper.setName(requestId, "未通过!非活体!");                        // 延迟 FAIL_RETRY_INTERVAL 后,将该人脸状态置为UNKNOWN,帧回调处理时会重新进行活体检测                        retryLivenessDetectDelayed(requestId);                    }                } else {                    if (increaseAndGetValue(livenessErrorRetryMap, requestId) > MAX_RETRY_TIME) {                        livenessErrorRetryMap.put(requestId, 0);                        String msg;                        // 传入的FaceInfo在指定的图像上无法解析人脸,此处使用的是RGB人脸数据,一般是人脸模糊                        if (errorCode != null && errorCode == ErrorInfo.MERR_FSDK_FACEFEATURE_LOW_CONFIDENCE_LEVEL) {                            msg = "人脸置信度低!";                        } else {                            msg = "ProcessCode:" + errorCode;                        }                        faceHelper.setName(requestId, "未通过!");                        retryLivenessDetectDelayed(requestId);                    } else {                        livenessMap.put(requestId, LivenessInfo.UNKNOWN);                    }                }            }        };        CameraListener cameraListener = new CameraListener() {            @Override            public void onCameraopened(Camera camera, int cameraId, int displayOrientation, boolean isMirror) {                Camera.Size lastPreviewSize = previewSize;                previewSize = camera.getParameters().getPreviewSize();                drawHelper = new DrawHelper(previewSize.width, previewSize.height, previewView.getWidth(), previewView.getHeight(), displayOrientation                        , cameraId, isMirror, false, false);                Log.i(TAG, "onCameraOpened: " + drawHelper.toString());                // 切换相机的时候可能会导致预览尺寸发生变化                if (faceHelper == null ||                        lastPreviewSize == null ||                        lastPreviewSize.width != previewSize.width || lastPreviewSize.height != previewSize.height) {                    Integer trackedFaceCount = null;                    // 记录切换时的人脸序号                    if (faceHelper != null) {                        trackedFaceCount = faceHelper.getTrackedFaceCount();                        faceHelper.release();                    }                    faceHelper = new FaceHelper.Builder()                            .ftEngine(ftEngine)                            .frEngine(frEngine)                            .flEngine(flEngine)                            .frQueueSize(MAX_DETECT_NUM)                            .flQueueSize(MAX_DETECT_NUM)                            .previewSize(previewSize)                            .faceListener(faceListener)                            .trackedFaceCount(trackedFaceCount == null ? ConfigUtil.getTrackedFaceCount(FaceReGISterAndRecognise.this.getApplicationContext()) : trackedFaceCount)                            .build();                }            }            @Override            public void onPreview(final byte[] nv21, Camera camera) {                if (faceRectView != null) {                    faceRectView.clearFaceInfo();                }                List<FacePreviewInfo> facePreviewInfoList = faceHelper.onPreviewFrame(nv21);                if (facePreviewInfoList != null && faceRectView != null && drawHelper != null) {                    drawPreviewInfo(facePreviewInfoList);                }                registerFace(nv21, facePreviewInfoList);                clearLeftFace(facePreviewInfoList);                if (facePreviewInfoList != null && facePreviewInfoList.size() > 0 && previewSize != null) {                    for (int i = 0; i < facePreviewInfoList.size(); i++) {                        Integer status = requestFeatureStatusMap.get(facePreviewInfoList.get(i).getTrackId());                                                if (livenessDetect && (status == null || status != RequestFeatureStatus.SUCCEED)) {                            Integer liveness = livenessMap.get(facePreviewInfoList.get(i).getTrackId());                            if (liveness == null                                    || (liveness != LivenessInfo.ALIVE && liveness != LivenessInfo.NOT_ALIVE && liveness != RequestLivenessStatus.ANALYZING)) {                                livenessMap.put(facePreviewInfoList.get(i).getTrackId(), RequestLivenessStatus.ANALYZING);                                faceHelper.requestFaceLiveness(nv21, facePreviewInfoList.get(i).getFaceInfo(), previewSize.width, previewSize.height, FaceEngine.CP_PAF_NV21, facePreviewInfoList.get(i).getTrackId(), LivenessType.RGB);                            }                        }                                                if (status == null                                || status == RequestFeatureStatus.TO_RETRY) {                            requestFeatureStatusMap.put(facePreviewInfoList.get(i).getTrackId(), RequestFeatureStatus.SEARCHING);                            faceHelper.requestFaceFeature(nv21, facePreviewInfoList.get(i).getFaceInfo(), previewSize.width, previewSize.height, FaceEngine.CP_PAF_NV21, facePreviewInfoList.get(i).getTrackId());//                            Log.i(TAG, "onPreview: fr start = " + System.currentTimeMillis() + " trackId = " + facePreviewInfoList.get(i).getTrackedFaceCount());                        }                    }                }            }            @Override            public void onCameraClosed() {                Log.i(TAG, "onCameraClosed: ");            }            @Override            public void onCameraError(Exception e) {                Log.i(TAG, "onCameraError: " + e.getMessage());            }            @Override            public void onCameraConfigurationChanged(int cameraID, int displayOrientation) {                if (drawHelper != null) {                    drawHelper.setCameraDisplayOrientation(displayOrientation);                }                Log.i(TAG, "onCameraConfigurationChanged: " + cameraID + "  " + displayOrientation);            }        };        cameraHelper = new CameraHelper.Builder()                .previewViewSize(new Point(previewView.getMeasuredWidth(), previewView.getMeasuredHeight()))                .rotation(getWindowManager().getDefaultDisplay().getRotation())                .specificCameraId(rgbCameraID != null ? rgbCameraID : Camera.CameraInfo.CAMERA_FACING_FRONT)                .isMirror(false)                .previewOn(previewView)                .cameraListener(cameraListener)                .build();        cameraHelper.init();        cameraHelper.start();    }

注册人脸的逻辑:

private void registerFace(final byte[] nv21, final List<FacePreviewInfo> facePreviewInfoList) {        if (registerStatus == REGISTER_STATUS_READY && facePreviewInfoList != null && facePreviewInfoList.size() > 0) {            registerStatus = REGISTER_STATUS_PROCESSING;            Observable.create(new ObservableOnSubscribe<Boolean>() {                @Override                public void subscribe(ObservableEmitter<Boolean> emitter) {                    boolean success = FaceServer.getInstance().registerNv21(FaceRegisterAndRecognise.this, nv21.clone(), previewSize.width, previewSize.height,                            facePreviewInfoList.get(0).getFaceInfo(), "registered " + faceHelper.getTrackedFaceCount());                    emitter.onNext(success);                }            })                    .subscribeOn(Schedulers.computation())                    .observeOn(AndroidSchedulers.mainThread())                    .subscribe(new Observer<Boolean>() {                        @Override                        public void onSubscribe(Disposable d) {                        }                        @Override                        public void onNext(Boolean success) {                            String result = success ? "register success!" : "register failed!";                            showToast(result);                            registerStatus = REGISTER_STATUS_DONE;                        }                        @Override                        public void onError(Throwable e) {                            e.printStackTrace();                            showToast("register failed!");                            registerStatus = REGISTER_STATUS_DONE;                        }                        @Override                        public void onComplete() {                        }                    });        }    }

人脸库的管理界面。

public class FaceLibs extends BaseActivity {    private ExecutorService executorService;    private TextView textView;    private TextView tvNotificationRegisterResult;    ProgressDialog progressDialog = null;    private static final int ACTION_REQUEST_PERMISSIONS = 0x001;    private static String[] NEEDED_PERMISSIONS = new String[]{            Manifest.permission.READ_EXTERNAL_STORAGE,            Manifest.permission.WRITE_EXTERNAL_STORAGE    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_face_libs);        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);        executorService = Executors.newSingleThreadExecutor();        tvNotificationRegisterResult = findViewById(R.id.notification_register_result);        progressDialog = new ProgressDialog(this);        int faceLibNum = FaceServer.getInstance().getFaceNumber(this);        textView = findViewById(R.id.number);        textView.setText(faceLibNum + "");        FaceServer.getInstance().init(this);    }    @Override    protected void onDestroy() {        if (executorService != null && !executorService.isshutdown()) {            executorService.shutdownNow();        }        if (progressDialog != null && progressDialog.isShowing()) {            progressDialog.dismiss();        }        FaceServer.getInstance().unInit();        super.onDestroy();    }    @Override    void afterRequestPermission(int requestCode, boolean isAllGranted) {    }    public void clearFaces(View view) {        int faceNum = FaceServer.getInstance().getFaceNumber(this);        if (faceNum == 0) {            showToast("人脸库已空!");        } else {            AlertDialog dialog = new AlertDialog.Builder(this)                    .setTitle("通知")                    .setMessage("确定要删除" + faceNum + "个人脸吗?")                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog, int which) {                            int deleteCount = FaceServer.getInstance().clearAllFaces(FaceLibs.this);                            showToast(deleteCount + "个人脸已删除!");                            textView.setText("0");                        }                    })                    .setNegativeButton("取消", null)                    .create();            dialog.show();        }    }}

以上就是大体的介绍,还有一些小的细枝末节需要同志们动手实操一下。下面就来看看实现的效果。

主界面:

Android基于ArcSoft如何实现人脸识别

注册成功并通过识别:

Android基于ArcSoft如何实现人脸识别

通过手机照片识别出不是活体:

Android基于ArcSoft如何实现人脸识别

清理人脸库:

Android基于ArcSoft如何实现人脸识别

以上是“Android基于ArcSoft如何实现人脸识别”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Android基于ArcSoft如何实现人脸识别

本文链接: https://www.lsjlt.com/news/301869.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android基于ArcSoft如何实现人脸识别
    小编给大家分享一下Android基于ArcSoft如何实现人脸识别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在虹软的开发者中心创建一个自己的应用,将APP_I...
    99+
    2023-06-22
  • Android基于虹软(ArcSoft)实现人脸识别
    1、在虹软的开发者中心创建一个自己的应用,将APP_ID与SDK_KEY记录下来,后面会用到。创建完后就可以下载SDK了。 2、下载完后,就可以根据SDK包里的开发说明文档和代码进...
    99+
    2022-11-12
  • Android 实例开发基于ArcSoft实现人脸识别
    目录效果图激活引擎第一步配置APP_ID和SDK_KEY第二步:判断是否添加动态链接库(so文件与jar包)第三步:判断是否申明所有权限人脸比对 1:N第一步:初始化本地人脸库第二步...
    99+
    2022-11-12
  • Android开发基于ArcSoft实现人脸识别的方法是什么
    本篇内容主要讲解“Android开发基于ArcSoft实现人脸识别的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android开发基于ArcSoft实现人脸识别的方法是什么”吧!效果...
    99+
    2023-06-25
  • Android基于opencv4.6.0实现人脸识别功能
    前言 步骤: 整合opencv 获取相机的SurfaceView传到native层去检测(亦或是不断的获取SurfaceView的Bitmap,传到native层) 检测人脸,在本地保存人脸特征信息 4.上传至后台(不实现) 人脸识别实现的...
    99+
    2023-09-30
    android android studio opencv
  • 基于face_recognition如何实现人脸识别
    这篇文章将为大家详细讲解有关基于face_recognition如何实现人脸识别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。准备工作我们的人脸识别基于face_recognition库。f...
    99+
    2023-06-17
  • 如何基于SpringBoot实现人脸识别功能
    目录前言需求分析一、人脸注册二、人脸登录具体实现一、人脸注册二、刷脸登录总结前言 去年在公司参与了一个某某机场建设智能机场的一个项目,人脸登机是其中的一个功能模块,当时只是写了后台的...
    99+
    2022-11-13
  • 基于python3+OpenCV实现人脸和眼睛识别
    基于python3+OpenCV的人脸和眼睛识别,供大家参考,具体内容如下 一、OpenCV人脸检测的xml文件下载 人脸检测和眼睛检测要用到haarcascade_eye.xml和...
    99+
    2022-11-12
  • Python中基于Opencv怎么实现人脸识别
    这篇文章主要讲解了“Python中基于Opencv怎么实现人脸识别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中基于Opencv怎么实现人脸识别”吧!检测人脸。这应该是最基本的...
    99+
    2023-06-02
  • 人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码)
    人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码) 目录 人脸识别4:Android InsightFace实现人脸识别Face Recognition(含源码) 1. 前言 2. 项目...
    99+
    2023-08-31
    android 人脸识别 人脸检测 android人脸识别
  • 基于Python的人脸识别功能怎么实现
    这篇文章主要介绍“基于Python的人脸识别功能怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python的人脸识别功能怎么实现”文章能帮助大家解决问题。一、 人脸检测人脸检测是指从图像...
    99+
    2023-07-05
  • 基于HTML5的人脸识别技术怎么实现
    今天小编给大家分享一下基于HTML5的人脸识别技术怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2022-10-19
  • 基于Python实现简单的人脸识别系统
    目录前言基本原理代码实现创建虚拟环境安装必要的库前言 最近又多了不少朋友关注,先在这里谢谢大家。关注我的朋友大多数都是大学生,而且我简单看了一下,低年级的大学生居多,大多数都是为了完...
    99+
    2022-11-12
  • Java基于虹软实现人脸识别、人脸比对、活性检测等
    目录虹软一、注册虹软开发者平台二、开始使用SDK虹软 免费,高级版本试用支持在线、离线有 Java SDK,C++ SDK 一、注册虹软开发者平台 点击注册 注册完成后可在&ldq...
    99+
    2022-11-13
  • 基于HTML5怎么实现人脸识别活体认证
    小编给大家分享一下基于HTML5怎么实现人脸识别活体认证,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 近几年,人脸识别技术在身份认证领域的应用已经有了很多应用,例如:支付宝,招行的取款...
    99+
    2022-10-19
  • 基于opencv和pillow实现人脸识别系统(附demo)
    目录一。人脸检测和数据收集二.训练识别器三.人脸识别和显示本文不涉及分类器、训练识别器等算法原理,仅包含对其应用(未来我也会写自己对机器学习算法原理的一些观点和了解) 首先我们需要知...
    99+
    2022-11-12
  • 基于opencv和pillow怎么实现人脸识别系统
    这篇文章主要讲解了“基于opencv和pillow怎么实现人脸识别系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于opencv和pillow怎么实现人脸识别系统”吧!本文不涉及分类器、...
    99+
    2023-06-21
  • 基于Python实现人脸识别和焦点人物检测功能
    写在前面的话 基于dlib库的模型,实现人脸识别和焦点人物的检测。最后呈现的效果为焦点人物的识别框颜色与其他人物框不一样。 准备工作 需要安装好python环境,安装好dlib、o...
    99+
    2022-11-12
  • Python基于opencv实现的人脸识别(适合初学者)
    目录一点背景知识一、人脸识别步骤 二、直接上代码(1)录入人脸.py(2)数据训练.py(3)进行识别.py三、运行过程及结果1、获取人脸照片于目标文件中2、进行数据训练,...
    99+
    2022-11-13
  • 基于OpenCV和Gradio实现简单的人脸识别详解
    目录环境配置实验原理程序设计1.上传图片2.人脸识别3.绘制方框4.保存预测结果5.最后运行gradio的lauch完整代码环境配置 gradio 安装 pip install gr...
    99+
    2023-05-14
    OpenCV Gradio实现人脸识别 OpenCV Gradio人脸识别 OpenCV Gradio
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作