觉得USB摄像头拍照的效果太渣,特别是总有色差,也不会自动对焦等问题,
尝试研究运用手机摄像头拍照并传电脑,然后这几天接触了adb,最后顺利达成目标。
记录过程,代码在末尾:
1、安装 android studio
去 https://www.androiddevtools.cn/
下载对应版本,我这个是4.1pre版本,然后安装。
2、安装 Android SDK
打开android studio,在 SDK Manager里面下载,一个就够了,我下了一个1.0(Q)。
3、然后就有以下目录了,adb就在这个目录里面
~/Library/Android/sdk/platform-tools
4、加进环境变量
依次运行以下语句:
touch .bash_profile
open -e .bash_profile
在修改弹出的.bash_profile文件中增加以下语句:
export PATH=${PATH}:~/Library/Android/sdk/platform-tools
关掉命令行,重新启动命令行,输入adb就有了
5、手机打开“开发者模式”
我这个联想ZUK_Z2手机的方法是:在【关于本机】【ZUI版本】上连续点击多下,就可以打开开发者模式了。
然后在【高级设置】中可以看到【开发者选项】
另外还有一个旧的坚果手机,方法则是【关于本机】【系统版本】连续多次点击,即可开启开发者模式,之后在【全局高级设置】中最后会多出【开发者选项】
之后在【开发者选项】中要打开【USB授权调试】
6、拔掉手机与电脑的usb线,重新插上,弹出一个提示,点确定。
接着就可以试试通过abd点亮屏幕:
adb shell input keyevent 224
7、一些adb命令
# 启动相机
adb shell am start -a android.media.action.STILL_IMAGE_CAMERA
# camera键 拍照
adb shell input keyevent 27
# back键 暂退相机
adb shell input keyevent 4
#截图至手机内存
adb shell /system/bin/screencap -p /sdcard/screenshot.png
#将截图取至电脑
adb pull /sdcard/screenshot.png screenshot.png
#将单个文件传到电脑上
adb pull /storage/emulated/0/DCIM/Camera/IMG_20200413_190300.jpg aaaa.png
#将整个文件夹里的内容传到电脑上
联想手机是 adb pull /storage/emulated/0/DCIM/Camera/ ./Camera
坚果手机比较恶心,在手机上看照片的路径是 /Phone Storage/DCIM/Camera/ ,
但实际上并不是,通过adb shell 'ls /'
adb shell 'ls /storage/'
adb shell 'ls /storage/sdcard0/'
adb shell 'ls /storage/sdcard0/DCIM/'
adb shell 'ls /storage/sdcard0/DCIM/Camera'
一步步找到正确的路径
所以在坚果手机上是这样的:
adb pull /storage/sdcard0/DCIM/Camera ./Camera
8、想用手机摄像头拍摄照片,并把照片发到电脑上:
adb没有直接这样的命令,所以
(原本的傻瓜想法:把Camera文件夹清空,然后拍照后就把整个文件夹传到电脑上,在电脑上用逻辑查找出这唯一的一张照片,同时将手机中的照片删除……接着重复这一循环。)
删除命令 adb shell rm /sdcard/a.txt
但是以上想法太傻,可以用shell的方式:
adb shell ls -lt /storage/emulated/0/DCIM/Camera/ | grep '.jpg' | head -n 1 |awk '{print $9}'
shell逐条解释:
ls -lt /dirname/
列出此目录下的所有文件并按照时间先后排序
grep filename
过滤出包含关键字的文件
head -n 1
查看排名第一的文件
awk '{print $9}'
打印出第9个字段,此处为文件名
9、在python中运行adb脚本
import os
os.system('adb shell input keyevent 224');
10、最终用adb拍照的python代码:
就先运行获得文件名
再pull就可以把新拍的照片下载到电脑上了
# -*- coding: utf-8 -*-
import os
import time
# 点亮手机
os.system("adb shell input keyevent 224")
time.sleep(1)
# 解锁屏幕(前提需要在设置里面把手机登录的密码这些都关掉)
os.system("adb shell input keyevent 82")
time.sleep(1)
# 启动相机
os.system("adb shell am start -a android.media.action.STILL_IMAGE_CAMERA")
time.sleep(3) #多留点时间自动对焦
# camera键 拍照
os.system("adb shell input keyevent 27")
time.sleep(1) #留点时间存储照片 以免死机
# 获得最新的一张照片的文件名(-t指按照时间顺序排列,否则会按照文件字母顺序;head -n是从头部开始,反过来是tail -n的排列顺序)
# 这段代码有问题 myfilename = os.system("adb shell ls -t /storage/emulated/0/DCIM/Camera/ | grep '.jpg' | head -n 1 |awk '{print $9}'")
# os.system无法获得执行结果,得用这一段 os.popen('shell命令').read()
myfilename = os.popen("adb shell ls -t /storage/emulated/0/DCIM/Camera/ | head -n 1 | tr -d '\n' ").read()
#因为脚本输出文件名后面带了个换行符号 所以用 tr -d '\n' 来删掉换行符,有一些换行符是\r
print("--")
print(myfilename)
print("--") #debug看看前后是否有换行符
time.sleep(1)
# 将这个文件pull到本地电脑上
adbcode = "adb pull /storage/emulated/0/DCIM/Camera/"+str(myfilename)+" aaa.jpg"
os.system(adbcode)
time.sleep(1)
# back键 暂退相机
os.system("adb shell input keyevent 4")
time.sleep(1)
# Power键 黑屏
os.system("adb shell input keyevent 26")
11、以上是插上USB线的情况,后来发现在电脑与手机处于同一wifi的情况下,可以无线控制操作和传输文件:
运行命令:
adb tcpip 5555
adb connect 192.168.1.105:5555
(如果不知道局域网ip,用 adb shell ifconfig 查询)
接着若显示 connected to 192.168.1.105:5555 就是连接成功了,可以拔掉USB线,远程操控了!
测试OK,不但就地取材不用买USB摄像头了,而且可以给装置减少一根线,拍照的效果也大幅提升,方便后续更准确的识别,666!
12、换了个场所的wifi,发现碰到
error: more than one device and emulator
于是先
adb disconnected to 192.168.1.105:5555
再通过 adb devices 找到list
然后 adb -s 19.168.0.105:5555
接着再次adb tcpip 5555和连接就可以了
手机那边可能得重启一下