python 3.8.5 打包_骚操作 | Python 实现在 App 端的人脸识别

0d6eff5a37b02ef5105ed648a345bca7.png

最近闲来无事,研究研究在安卓上跑 Python, 想起以前玩过的 kivy 技术,kivy 是一个跨平台的 UI 框架, 当然对我们最有用的是,kivy 可以把 Python 代码打包成安卓应用。 但是由于安卓打包的工具链很长,包括 Android Sdk 打包 Java 代码、NDK 编译 Python、 编译各种 Python 依赖包,经常花一整天从入门到放弃。

69faa168b5e55d798d70704ae79050c7.png

这次使出认真研究的心态,终于找到一个解决方案,于是有了这篇文章。
  • 只要会 Python 就能写安卓 App,无需安卓开发基础,无需编译

  • 手机上也有交互式 Python 解释器,直接调试 Python 代码

  • 可以使用各种 Python 库,包括 numpy/opencv 等机器学习包

  • 可以与安卓接口交互,使用手机硬件,比如摄像头

那么我们就以人脸识别 App 为例,看看如何简单几步搞定, 先看看成品的效果。 c281582548894994fb4b296dba2ce6e9.gif 1、 安装 airport.apk AirPort 是我编译好的一个安卓 App,里面包含了 Python 解释器和一些常用的依赖库。 2、 连接手机的 Python 解释器 启动手机上的 AirPort 应用,就会运行 Python 解释器,为了调试的方便,应用内置了一个 ssh 服务器,启动的时候会显示手机的 IP 地址。 242afa94b9645aa915949288d340183d.png 在电脑上使用 ssh 命令,就可以连接到手机。 ps: 注意:确保你的手机和电脑在同一局域网中。
# 在电脑上连接手机,注意这里ip需要替换成AirPort显示的ipssh -p 8000 admin@192.168.31.101# 输入密码,这里密码是固定为:meteorixmeteorix
然后你就可以在手机上尽情使用 Python 了。

3、摄像头的 App

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

47567c6bfced2eab6ef4f8a38f735468.png 代码非常简单,Builder.load_string 函数加载了一段配置,这是 kivy 提供的 UI 定义语言 kivy language。 点击 UI 上创建的 Capture 按钮,回调 CameraClick.capture() 函数,用 Python 实现函数功能。
from kivy.app import Appfrom kivy.lang import Builderfrom kivy.uix.boxlayout import BoxLayoutimport timeBuilder.load_string(''':    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 cv2detector = 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 效果了。

我已经将全部源码,包含文中使用的可执行文件一起上传到后台,关注公众号后回复「 人脸识别 」即可获得下载链接,另外原文的 APK 回复「 airport 」获取下载链接。

660be3e4585ce063dc6233abcdf71b6a.png

THANDKS

- End -

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值