需要全部代码请点赞关注收藏后评论区留言私信~~~
人脸识别自古有之,每当官府要捉拿某人时,便在城墙贴出通缉告示并附上那人的肖像。只是该办法依赖人们的回忆与主观判断,指认结果多有出入,算不上什么先进。 如今利用监控摄像头结合机器学习算法,大大提高了人脸识别的成功率,使得人脸识别真正应用到了日常生活中。 从住宅小区的刷脸开门,到工作单位的刷脸考勤,到超市里便捷的刷脸支付,到各城市地铁的刷脸乘车,再到张学友演唱会上警方连续抓获逃犯,人脸识别被广泛地应用于门禁、购物、交通、公安等诸多领域。
倘若利用人脸识别技术,寻找失散小孩的操作过程包含下列几个步骤:
(1)由家属提供小孩照片并上传给智慧天眼系统;
(2)智慧天眼迅速从各个监控摄像头实时匹配人脸;
(3)一旦发现高相似度的人脸,马上通知家属甄别画面确认是否找到;
功能主要通过摄像头实时识别人脸,用户只需录入待寻找人员信息,剩下就交给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:这是实时寻人的扫描界面。
开始界面添加待寻找的人员信息
成功找到后效果如下
部分代码如下 需要全部代码请点赞关注收藏后评论区留言~~~
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 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 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;
}
}
创作不易 觉得有帮助请点赞关注收藏~~~