怎样做化妆品公司网站,网站建设的前途,柳州企业网站制作,站长网站优点最近闲来无事#xff0c;研究研究在安卓上跑Python。
想起以前玩过的kivy技术#xff0c;kivy[1]是一个跨平台的UI框架。当然对我们最有用的是#xff0c;kivy可以把python代码打包成安卓App。但是由于安卓打包的工具链很长#xff0c;包括android sdk打包java代码、ndk编译…最近闲来无事研究研究在安卓上跑Python。
想起以前玩过的kivy技术kivy[1]是一个跨平台的UI框架。当然对我们最有用的是kivy可以把python代码打包成安卓App。但是由于安卓打包的工具链很长包括android sdk打包java代码、ndk编译python、 编译各种python依赖包经常花一整天从入门到放弃。这次使出认真研究的心态终于找到一个解决方案于是有了这篇文章
•只要会python就能写安卓App无需安卓开发基础无需编译•手机上也有交互式python解释器直接调试python代码•可以使用各种python库包括numpy/opencv等机器学习包•可以与安卓接口交互使用手机硬件比如摄像头
那么我们就以人脸识别App为例看看如何简单几步搞定。先看看成品的效果第一步安装airport.apk
AirPort是我编译好的一个安卓App里面包含了python解释器和一些常用的python库。
airport.apk现在先放在我的微信公众号Meteorix回复apk即可下载
第二步连接手机的python解释器
启动手机上的AirPort应用就会运行python解释器。我内置了一个ssh服务器用于调试代码非常方便。应用启动时会显示手机的ip地址。在电脑上使用ssh命令就可以连接到手机。
注意确保你的手机和电脑在同一局域网中。
#在电脑上连接手机注意这里ip需要替换成AirPort显示的ipssh -p 8000 admin192.168.31.101#输入密码meteorix
然后你就可以在手机上尽情使用python了比如试试
import osos.getcwd()/data/data/org.airtest.airport/files/appimport requestsr requests.get(https://www.baidu.com)r.status_code200
第三步: 一个摄像头的App
在kivy的官方文档中我们可以找到这样一个摄像头的example[2]代码非常简单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: verticalCamera:id: cameraresolution: (640, 480)play: FalseToggleButton:text: Playon_press: camera.play not camera.playsize_hint_y: Noneheight: 48dpButton:text: Capturesize_hint_y: Noneheight: 48dpon_press: root.capture())class CameraClick(BoxLayout):def capture(self):Function to capture the images and give them the namesaccording 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的效果。
第四步推送代码到安卓手机
这一步需要做的就是把这个摄像头App推送到安卓手机上然后启动AirPort应用。
如果你对安卓手机有一丢丢的了解你应该用过adb工具。这里原理就是使用adb连接手机将kvmain.py推送到手机/sdcard/kv/kvmain.py路径。然后启动AirPort应用就会加载这个路径下的python代码。
1.可以从这里[3]下载对应操作系统的adb工具。2.用usb线将手机连接到电脑打开手机的开发者选项/usb调试开关然后检查adb连接。看到device就说明连接正常如果是其他状态需要稍微检查一下手机配置。
adb devices # 查看adb连接List of devices attachedABCDEFGHIJK device
3.将kvmain.py推送到手机/sdcard/kv/kvmain.py路径
adb shell mkdir -p /sdcard/kvadb push kvmain.py /sdcard/kv/kvmain.py
如果你不知道上面在说什么可以先google/baidu一下adb使用教程。
重新启动手机上的AirPort应用即可看到我们的摄像头App运行在手机上了。
第五步增加人脸识别功能
这一步我们主要用到了opencv的人脸识别接口详细原理参考opencv tutorial[4]
对我们来说这里只用了以下简单的代码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:
1.读取摄像头的图片调用opencv人脸识别接口2.将识别出来的人脸坐标画到手机屏幕的对应位置上
bbox BoundingBox(nameface_name, size_hint(None, None))...for loc in faces:# calculate position of the facex, y, w, h loct int(anchor_t - y*sh)b int(anchor_t - (yh)*sh)r int(anchor_l x*sw)l int(anchor_l (xw)*sw)# update bounding boxbbox.pos (int(l), int(b))bbox.size (int(r-l), int(t-b))...
当然我们还需要针对安卓手机进行一些调试。最终的代码我放在了github仓库airface[5]https://github.com/Meteorix/airface
再次我们推送代码到手机上
adb push src/* /sdcard/kv/
重启应用就可以看到文初展示的GIF效果了。
Whats Next?
Python本来就能做很多有趣的事情现在python开发者也能直接写安卓App啦。
我们稍微开点脑洞
•训练一个识别你家所有人脸的分类器甚至是猫脸对opencv内置了猫脸识别•用python写个语音助手的app私人定制的小爱同学
脑洞更大点
•在手机上用python跑TensorFlow•写一个真正的手机微信机器人
目前我在使用这种方式写写人工智能的安卓demo。也欢迎大家尝试用python写安卓app探索更多可能性有问题留言交流。
References
[1] kivy: https://github.com/kivy/kivy[2] 摄像头的example: https://kivy.org/doc/stable/examples/gen__camera__main__py.html[3] adb下载: https://github.com/AirtestProject/Airtest/tree/master/airtest/core/android/static/adb[4] opencv tutorial: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html[5] 源码仓库: https://github.com/Meteorix/airface