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

最近闲来无事,研究研究在安卓上跑 Python,想起以前玩过的 kivy 技术,kivy 是一个跨平台的 UI 框架,当然对我们最有用的是,kivy 可以把 Python 代码打包成安卓应用。

但是由于安卓打包的工具链很长,包括 Android Sdk 打包 Java 代码、NDK 编译 Python、 编译各种 Python 依赖包,经常花一整天从入门到放弃。

这次使出认真研究的心态,终于找到一个解决方案,于是有了这篇文章。

只要会 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 效果了。

https://www.jianshu.com/p/f3b64d3456be

Python量化投资网携手4326手游为资深游戏玩家推荐:《无敌的椅子下载

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论