立即注册 找回密码

0351太原网

    生活
    兴趣
    便民
    其它
查看: 1132|回复: 3
打印 上一主题 下一主题

Python 实现在 App 端的人脸识别!手机解锁人脸识别

[复制链接]

1210

主题

1917

帖子

4945

积分

论坛元老

Rank: 8Rank: 8

积分
4945
跳转到指定楼层
楼主
发表于 2020-5-1 17:08:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近闲来无事,研究研究在安卓上跑 Python,想起以前玩过的 kivy 技术,kivy 是一个跨平台的 UI 框架,当然对我们最有用的是,kivy 可以把 Python 代码打包成安卓应用。
但是由于安卓打包的工具链很长,包括 Android Sdk 打包 Java 代码、NDK 编译 Python、 编译各种 Python 依赖包,经常花一整天从入门到放弃。






私信小编01 领取全套教程!
这次使出认真研究的心态,终于找到一个解决方案,于是有了这篇文章。

  • 只要会 Python 就能写安卓 App,无需安卓开发基础,无需编译
  • 手机上也有交互式 Python 解释器,直接调试 Python 代码
  • 可以使用各种 Python 库,包括 numpy/opencv 等机器学习包
  • 可以与安卓接口交互,使用手机硬件,比如摄像头
那么我们就以人脸识别 App 为例,看看如何简单几步搞定,先看看成品的效果。




1、安装 airport.apk
AirPort 是我编译好的一个安卓 App,里面包含了 Python 解释器和一些常用的依赖库。
2、连接手机的 Python 解释器
启动手机上的 AirPort 应用,就会运行 Python 解释器,为了调试的方便,应用内置了一个 ssh 服务器,启动的时候会显示手机的 IP 地址。


在电脑上使用 ssh 命令,就可以连接到手机。
ps: 注意:确保你的手机和电脑在同一局域网中。


# 在电脑上连接手机,注意这里ip需要替换成AirPort显示的ip
ssh -p 8000 admin@192.168.31.101
# 输入密码,这里密码是固定为:meteorix
meteorix
然后你就可以在手机上尽情使用 Python 了。


3、摄像头的 App
在 kivy 的官方文档中,我们可以找到这样一个摄像头的 example


代码非常简单,Builder.load_string 函数加载了一段配置,这是 kivy 提供的 UI 定义语言 kivy language。
点击 UI 上创建的 Capture 按钮,回调 CameraClick.capture() 函数,用 Python 实现函数功能。


from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
import time
Builder.load_string('''
<CameraClick>:
orientation: 'vertical'
Camera:
id: camera
resolution: (640, 480)
play: False
ToggleButton:
text: 'Play'
on_press: camera.play = not camera.play
size_hint_y: None
height: '48dp'
Button:
text: 'Capture'
size_hint_y: None
height: '48dp'
on_press: root.capture()
''')
class CameraClick(BoxLayout):
def capture(self):
'''
Function to capture the images and give them the names
according to their captured time and date.
'''
camera = self.ids['camera']
timestr = time.strftime("%Y%m%d_%H%M%S")
camera.export_to_png("IMG_{}.png".format(timestr))
print("Captured")
class TestCamera(App):
def build(self):
return CameraClick()
TestCamera().run()
将这段代码保存为 kvmain.py 文件,我们可以直接在电脑上运行,如果你的电脑有摄像头,就可以看到摄像头 App 的效果。
4、推送代码到安卓手机
这一步需要做的就是,把这个摄像头 App 推送到安卓手机上,然后启动 AirPort 应用,将 kvmain.py 推送到手机 /sdcard/kv/kvmain.py 路径,然后启动 AirPort 应用,就会加载这个路径下的 Python 代码。




adb shell mkdir -p /sdcard/kvadb push kvmain.py /sdcard/kv/kvmain.py
重新启动手机上的 AirPort 应用,即可看到我们的摄像头 App 运行在手机上了。
5、增加人脸识别功能
这一步,我们主要用到了 opencv 的人脸识别接口。


import cv2
detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
img = cv2.imread('faces.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = detector.detectMultiScale(gray, 1.3, 5)
print(faces)
最后修改 App 代码,读取摄像头的图片,调用 opencv 人脸识别接口,将识别出来的人脸坐标,画到手机屏幕的对应位置上。




bbox = BoundingBox(name=face_name, size_hint=(None, None))
...
for loc in faces:
# calculate position of the face
x, y, w, h = loc
t = int(anchor_t - y*sh)
b = int(anchor_t - (y+h)*sh)
r = int(anchor_l + x*sw)
l = int(anchor_l + (x+w)*sw)
# update bounding box
bbox.pos = (int(l), int(b))
bbox.size = (int(r-l), int(t-b))
...
当然,我们还需要针对安卓手机进行一些调试,我们再次推送代码到手机上。


adb push src/* /sdcard/kv/
重启应用就可以看到上文展示的 GIF 效果了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

1177

主题

1933

帖子

4949

积分

论坛元老

Rank: 8Rank: 8

积分
4949
沙发
发表于 2020-5-1 17:28:32 | 只看该作者
求教程
回复 支持 反对

使用道具 举报

1155

主题

1866

帖子

4852

积分

论坛元老

Rank: 8Rank: 8

积分
4852
板凳
发表于 2020-5-1 17:48:58 | 只看该作者
转发了
回复 支持 反对

使用道具 举报

1253

主题

1965

帖子

5106

积分

论坛元老

Rank: 8Rank: 8

积分
5106
地板
发表于 2020-5-1 18:08:30 | 只看该作者
转发了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则





0351太原网X

0511.net镇江网 分享生活 温暖你我

0511.net镇江网|镇江大小事,尽在镇江网! 镇江网由镇江亿速网络科技有限公司组建。镇江网汇集了镇江本地新闻信息,视频专题、国内外新闻、民生资讯、社会新闻、镇江论坛等。镇江网是镇江地区最具影响力的综合性门户网站,是镇江人浏览本地新闻的首选网站。...

点击查看详情 
快速回复 返回顶部 返回列表
友情链接