博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于虹软人脸识别Demo android人脸识别
阅读量:4618 次
发布时间:2019-06-09

本文共 7148 字,大约阅读时间需要 23 分钟。

参加一个比赛,指定用虹软的人脸识别功能,奈何虹软人脸识别要自己建人脸库,不然就只能离线用,总不能装个样子,简单看了下虹软Demo,下面决定用这种简单方法实现在线人脸识别:

Android端(虹软Demo)取出人脸信息和姓名,人脸信息写入.data文件,存入手机本地------>取出文件上传至Python Djano后台,后台把文件保

存在工程下并把路径存入数据库------>Android端访问后台接口,遍历所有数据库中文件路径然后作为参数再次访问后台,得到所有人脸信息
文件和姓名,使用识别功能时,就可以开始和所有人脸信息比对,得到效果
Django 后台代码:

在工程下新建一个文件夹uploads,用来存放人脸数据.data文件

为简单实现,在setting.py中注释

#'django.middleware.csrf.CsrfViewMiddleware',

不然post请求被拦截,认真做工程不建议这样做
app.urls:

from django.conf.urls import url, includefrom . import viewsurlpatterns = [url(r'^posts',views.posttest),url(r'^getallface',views.getface),url(r'^filedown',views.file_download),]views.py#coding:utf-8import jsonfrom imp import reloadimport sysimport osfrom django.http import HttpResponse, HttpResponseRedirect, StreamingHttpResponsefrom django.shortcuts import render, render_to_responsefrom django.template import RequestContextfrom faceproject.settings import BASE_DIR, MEDIA_ROOTreload(sys)from faceapp.models import face, Faceinfos, FaceinfoFormdef getface(request):if request.method=='GET':WbAgreementModel = Faceinfos.objects.all()cflist = []cfdata = {}cfdata["coding"] = 1cfdata['message'] = 'success'for wam in WbAgreementModel:wlist = {}wlist['name'] = wam.usernamewlist['faceinfo']=wam.fileinfocflist.append(wlist)cfdata['data'] = cflistreturn HttpResponse(json.dumps(cfdata, ensure_ascii=False), content_type="application/json")def posttest(request):if request.method=='POST':files=request.FILES['fileinfo']if not files:return HttpResponse("no files for upload!")Faceinfos(username=request.POST['username'],fileinfo=MEDIA_ROOT+'/'+files.name).save()f = open(os.path.join('uploads', files.name), 'wb')for line in files.chunks():f.write(line)f.close()return HttpResponseRedirect('/face/')def file_download(request):global dirsif request.method=='GET':dirs=request.GET['dirs']def file_iterator(file_name, chunk_size=512):with open(file_name) as f:while True:c = f.read(chunk_size)if c:yield celse:breakthe_file_name = dirsresponse = StreamingHttpResponse(file_iterator(the_file_name))return response

  

Android代码,使用Okhttp进行网络连接

网络访问类:

public class HttpUtil {public static void sendOkHttpRequestPost(String address, RequestBody requestBody, okhttp3.Callback callback) {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(address).post(requestBody).build();client.newCall(request).enqueue(callback);}public static void sendOkHttpRequestGET(String address, okhttp3.Callback callback) {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(address).build();client.newCall(request).enqueue(callback);}}public class downloadf {private static downloadf downloadUtil;private final OkHttpClient okHttpClient;public static downloadf get() {if (downloadUtil == null) {downloadUtil = new downloadf();}return downloadUtil;}private downloadf() {okHttpClient = new OkHttpClient();}/*** @param url 下载连接* @param saveDir 储存下载文件的SDCard目录* @param listener 下载监听*/public void download(final String url, final String saveDir, final OnDownloadListener listener) {Request request = new Request.Builder().url(url).build();okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {// 下载失败listener.onDownloadFailed();}@Overridepublic void onResponse(Call call, Response response) throws IOException {InputStream is = null;byte[] buf = new byte[2048];int len = 0;FileOutputStream fos = null;// 储存下载文件的目录String savePath = isExistDir(saveDir);try {is = response.body().byteStream();long total = response.body().contentLength();File file = new File(savePath, getNameFromUrl(url));fos = new FileOutputStream(file);long sum = 0;while ((len = is.read(buf)) != -1) {fos.write(buf, 0, len);sum += len;int progress = (int) (sum * 1.0f / total * 100);// 下载中listener.onDownloading(progress);}fos.flush();// 下载完成listener.onDownloadSuccess();} catch (Exception e) {listener.onDownloadFailed();} finally {try {if (is != null)is.close();} catch (IOException e) {}try {if (fos != null)fos.close();} catch (IOException e) {}}}});}/*** @param saveDir* @return* @throws IOException* 判断下载目录是否存在*/private String isExistDir(String saveDir) throws IOException {// 下载位置File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir);if (!downloadFile.mkdirs()) {downloadFile.createNewFile();}String savePath = downloadFile.getAbsolutePath();return savePath;}/*** @param url* @return* 从下载连接中解析出文件名*/@NonNullprivate String getNameFromUrl(String url) {return url.substring(url.lastIndexOf("/") + 1);}public interface OnDownloadListener {/*** 下载成功*/void onDownloadSuccess();/*** @param progress* 下载进度*/void onDownloading(int progress);/*** 下载失败*/void onDownloadFailed();}}

  

使用:

MediaType type = MediaType.parse("application/octet-stream");//"text/xml;charset=utf-8"File file = new File(mDBPath +"/"+name+".data");File file1=new File(mDBPath+"/face.txt");RequestBody fileBody = RequestBody.create(type, file);RequestBody fileBody1 = RequestBody.create(type, file1);RequestBody requestBody1 = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("username",name).addFormDataPart("fileinfo",name+".data",fileBody).build();HttpUtil.sendOkHttpRequestPost("http://120.79.51.57:8000/face/posts", requestBody1, new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.v("oetrihgdf","失败");}@Overridepublic void onResponse(Call call, Response response) throws IOException {Log.v("oifdhdfg","成功");}});HttpUtil.sendOkHttpRequestGET("http://120.79.51.57:8000/face/getallface", new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {final String responsedata=response.body().string();runOnUiThread(new Runnable() {@Overridepublic void run() {Gson gson=new Gson();Facelist facelist= gson.fromJson(responsedata,new TypeToken
(){}.getType());faces.addAll(facelist.getData());Log.v("faceilist",faces.get(0).getFaceinfo());for (Face face:faces){Log.v("orihgdofg",face.getFaceinfo());downloadf.get().download("http://120.79.51.57:8000/face/filedown?"+"dir="+face.getFaceinfo(), getExternalCacheDir().getPath(), new downloadf.OnDownloadListener() {@Overridepublic void onDownloadSuccess() {Log.v("jmhfgh","下载完成");//Utils.showToast(MainActivity.this, "下载完成");}@Overridepublic void onDownloading(int progress) {// progressBar.setProgress(progress);}@Overridepublic void onDownloadFailed() {Log.v("jmhfgh","下载失败");// Utils.showToast(MainActivity.this, "下失败载失败");}});FileInputStream fs = null;try {fs = new FileInputStream(getExternalCacheDir().getPath()+"/"+face.getName()+".data");ExtInputStream bos = new ExtInputStream(fs);//load versionbyte[] version_saved = bos.readBytes();FaceDB.FaceRegist frface = new FaceDB.FaceRegist(face.getName());AFR_FSDKFace fsdkFace = new AFR_FSDKFace(version_saved);frface.mFaceList.add(fsdkFace);mResgist.add(frface);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}});}});

  

最后是SDK下载地址:https://ai.arcsoft.com.cn/ucenter/user/reg?utm_source=csdn1&utm_medium=referral

转载于:https://www.cnblogs.com/Zzz-/p/10899328.html

你可能感兴趣的文章
关于Altium Designer的BOM,元件清单
查看>>
使用MongoDB ruby驱动进行简单连接/CRUD/运行命令
查看>>
关于set和multiset的一些用法
查看>>
基础训练 芯片测试
查看>>
如何用命令将本地项目上传到git
查看>>
JavaScript 实现鼠标拖动元素
查看>>
js 模糊查询 (360接口)
查看>>
python+rabbitMQ实现生产者和消费者模式
查看>>
“模态”对话框和“后退”按钮
查看>>
关于javascript实现的网站页面侧边悬浮框"抖动"问题
查看>>
linux_命令格式和命令提示符
查看>>
Cocos2d-X-3.0之后的版本的环境搭建
查看>>
when case group by 的用法集合
查看>>
Python—列表(一个“打了激素”的数组)
查看>>
认识XmlReader
查看>>
JAVA学习Swing章节标签JLabel中图标的使用
查看>>
sqlserver,oracle,mysql等的driver驱动,url怎么写
查看>>
局部变量和static变量的区别
查看>>
说说excel
查看>>
七周七语言: Clojure Day 1
查看>>