【Android App】实战项目之使用OpenCV人脸识别实现找人功能(附源码和演示 超详细)

需要全部代码请点赞关注收藏后评论区留言私信~~~

人脸识别自古有之,每当官府要捉拿某人时,便在城墙贴出通缉告示并附上那人的肖像。只是该办法依赖人们的回忆与主观判断,指认结果多有出入,算不上什么先进。 如今利用监控摄像头结合机器学习算法,大大提高了人脸识别的成功率,使得人脸识别真正应用到了日常生活中。 从住宅小区的刷脸开门,到工作单位的刷脸考勤,到超市里便捷的刷脸支付,到各城市地铁的刷脸乘车,再到张学友演唱会上警方连续抓获逃犯,人脸识别被广泛地应用于门禁、购物、交通、公安等诸多领域。

一、需求描述

倘若利用人脸识别技术,寻找失散小孩的操作过程包含下列几个步骤:

(1)由家属提供小孩照片并上传给智慧天眼系统;

(2)智慧天眼迅速从各个监控摄像头实时匹配人脸;

(3)一旦发现高相似度的人脸,马上通知家属甄别画面确认是否找到;

【Android App】实战项目之使用OpenCV人脸识别实现找人功能(附源码和演示 超详细)

 【Android App】实战项目之使用OpenCV人脸识别实现找人功能(附源码和演示 超详细)

 二、功能分析

功能主要通过摄像头实时识别人脸,用户只需录入待寻找人员信息,剩下就交给App自动匹配了,在准备寻人与寻人过程中,主要集成了以下App技术

(1)图像裁剪:待寻人员的头像要从原始图片中抠出来。

(2)数据库框架Room:待寻人员的信息要保存到数据库,更新人脸识别的结果也要修改数据库记录。

(3)计算机视觉库OpenCV:智慧天眼采用OpenCV实时寻人,同时通过OpenCV判定目标人员的相似程度。

(4)定位服务:找到相似人员后,要获取并保存当前所在位置,以便家属前来相认。

(5)网络通信框架:根据经纬度访问WEB服务查询详细地址。

下面介绍代码模块之间的关系

(1)WisdomEyeActivity.java:这是智慧天眼的寻人列表界面。

(2)PersonEditActivity.java:这是人员信息的添加页面,可在此上传待识别的人员头像。

(3)PersonCutActivity.java:这是人员头像的裁剪界面。

(4)PersonDetailActivity.java:这是待寻找人员的详情页面。

(5)PersonVerifyActivity.java:这是实时寻人的扫描界面。

三、效果展示

开始界面添加待寻找的人员信息

【Android App】实战项目之使用OpenCV人脸识别实现找人功能(附源码和演示 超详细)

 【Android App】实战项目之使用OpenCV人脸识别实现找人功能(附源码和演示 超详细)

 【Android App】实战项目之使用OpenCV人脸识别实现找人功能(附源码和演示 超详细)

成功找到后效果如下

【Android App】实战项目之使用OpenCV人脸识别实现找人功能(附源码和演示 超详细) 

四、代码 

部分代码如下 需要全部代码请点赞关注收藏后评论区留言~~~

package com.example.face;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;

import com.example.face.adapter.PersonListAdapter;
import com.example.face.dao.PersonDao;
import com.example.face.entity.PersonInfo;
import com.example.face.entity.PersonPortrait;

import java.util.ArrayList;
import java.util.List;

public class WisdomEyeActivity extends AppCompatActivity implements
        AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener {
    private final static String TAG = "WisdomEyeActivity";
    private ListView lv_person; // 声明一个列表视图对象
    private PersonDao personDao; // 声明一个人员的持久化对象
    private List<PersonInfo> mPersonList = new ArrayList<>(); // 人员信息列表

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wisdom_eye);
        findViewById(R.id.iv_back).setOnClickListener(v -> finish());
        TextView tv_title = findViewById(R.id.tv_title);
        tv_title.setText("智慧天眼");
        lv_person = findViewById(R.id.lv_person);
        findViewById(R.id.btn_add).setOnClickListener(v -> {
            Intent intent = new Intent(this, PersonEditActivity.class);
            startActivity(intent);
        });
        // 从App实例中获取唯一的人员持久化对象
        personDao = MainApplication.getInstance().getPersonDB().personDao();
    }

    @Override
    protected void onResume() {
        super.onResume();
        new Handler(Looper.myLooper()).post(() -> loadPersonList());
    }

    // 加载人员列表
    private void loadPersonList() {
        mPersonList = personDao.queryAllPerson(); // 加载所有人员信息
        for (int i=0; i<mPersonList.size(); i++) {
            PersonInfo person = mPersonList.get(i);
            // 根据人员名称查询该人员的样本头像列表
            List<PersonPortrait> portraitList = personDao.queryPersonPortrait(person.getName(), 0);
            person.setPortraitList(portraitList);
            mPersonList.set(i, person);
        }
        PersonListAdapter adapter = new PersonListAdapter(this, mPersonList);
        lv_person.setAdapter(adapter);
        // 注册列表项的点击监听器,点击时打开人员详情页面
        lv_person.setOnItemClickListener(this);
        // 注册列表项的长按监听器,长按时弹出是否删除对话框
        lv_person.setOnItemLongClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        PersonInfo person = mPersonList.get(position);
        Intent intent = new Intent(this, PersonDetailActivity.class);
        intent.putExtra("person_name", person.getName());
        startActivity(intent);
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        PersonInfo person = mPersonList.get(position);
        AlertDialog.Builder builder = new AlertDialog.Builder(this)
                .setTitle("请确认")
                .setMessage("你是否要删除"+person.getName()+"的寻人记录")
                .setPositiveButton("是", (dialog, which) -> {
                    // 确定删除,则删除人员信息及其头像信息
                    personDao.deletePerson(person);
                    personDao.deletePortraitByName(person.getName(), -1);
                    loadPersonList(); // 加载人员列表
                })
                .setNegativeButton("否", null);
        builder.create().show();
        return true;
    }
}

创作不易 觉得有帮助请点赞关注收藏~~~

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年2月26日 上午9:47
下一篇 2023年2月26日 上午9:48

相关推荐