最近在学习开源的opencv视觉库(基于Python),突发奇想,要是能在手机上也能运行opencv-python库该多好,就可以随时随地的研究了。
光说不练是不行的,于是在网上索罗一圈后,发现了一个神器──Termux。Termux是一款Android下的模拟器,可以模拟一套Linux环境,Termux的使用这里不做过多介绍,想了解的同学可以去Termux官网( https://termux.com/)查看介绍并下载。此外再附一个Termux安装使用配置教程( https://www.sqlsec.com/2018/05/termux.html),此教程笔者感觉写的非常好,看完后可以对Termux有比较详细的了解。
安装好Termux后,按照上面的教程配置一下,遍可以安装opencv了。笔者先开始安装Python环境,安装后想通过pip install opencv-python安装opencv,但当执行命令后,却提示:
找不到满足的包,于是上网搜了下,发现opencv官网说不支持ARM平台,所以要在Termux上安装opencv需要自己编译,于是开始上网搜各种opencv在ARM上编译的方法,一开始找了几篇文章出现了各种错误,文章最后我会记录下我遇到的一些错误及解决办法(不知道解决方法对不对,反正是不在报错了)供大家参考,下面给出正确的安装方法。
正确的安装方法
此方法在小米和华为设备上实验成功,均在Android P下进行!安装及配置时请确保联网,需要下载工具!
此方法参考了以下文章,感谢作者!
- https://wiki.termux.com/wiki/Instructions_for_installing_python_packages#opencv
- https://blog.csdn.net/baby_moon/article/details/81070638
- https://blog.csdn.net/weixin_37619439/article/details/86726586
- https://docs.opencv.org/master/d0/d76/tutorial_arm_crosscompile_with_cmake.html
- https://blog.csdn.net/u014734886/article/details/96997097
1.安装必备工具
pkg install python python-dev
pkg install libjpeg-turbo-dev libpng-dev cmake pkg-config
很多教程中会要求也安装clang,但笔者安装clang后反而编译时会报错,具体原因未找到
2.获取opencv
使用git将opencv clone下来,并进入opencv文件夹
git clone https://github.com/opencv/opencv && cd opencv
3.创建build文件夹
mkdir build && cd build
4.管理员身份
在执行配置文件之前一定要获取管理员身份,否则可能make后无法正常使用
没有root的手机
没有root的手机可以使用Termux提供的工具proot模拟root环境
# 安装proot
pkg install proot
# 进入管理员环境,用exit退出
termux-chroot
已root的手机
已经root了的手机,可以使用Termux提供的工具tsu代替su命令
# 安装tsu
pkg install tsu
# 进入管理员环境,用exit退出
tsu
5.配置
使用以下命令进行配置
LDFLAGS=" -llog -lpython3" cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=$PREFIX/local -DBUILD_opencv_python3=on -DBUILD_opencv_python2=off -DOPENCV_EXTRA_MODULES=../modules -DPYTHON3_LIBRARIES=$PREFIX/lib/libpython3.so -DWITH_QT=OFF -DWITH_GTK=OFF ..
-DCMAKE_INSTALL_PREFIX 为opencv最终安装路径,一般为/usr/local,这里我使用$PREFIX/local,$PREFIX是Termux提供的系统变量对应的路径为/data/data/com.termux/files/usr
-DOPENCV_EXTRA_MODULES 是opencv的modules文件夹
-DPYTHON3_LIBRARIES 是Python的libpython3.so所在路径
-DWITH_QT 若需要QT支持,将此项设为ON
注意做后有两个“…”不要忘了,那个表示在上一级目录执行
6.编译&安装
编译命令
make -j4
注意这一步编译时间比较长,请耐心等待。
-j是表示启用的job数,我是启动了4个任务编译,如果你的设备CPU足够好可以用8个,若是性能不好建议仅使用make,不加任何参数以保证编译时不错出,但会增加时间。我用4job编译大约用了1小时,仅用make编译用了近2小时
编译后进行安装,然后退出管理员模式
make install
exit
7.测试
安装好后,进入Python
python
import cv2
如果导入cv2不报错,则表示安装成功,如果报错,可尝试指定下PYTHONPATH,这里的路径是文件cv2.XXX-XXX.so存在的目录,第一个XXX是编译Python连接库类型,第二个XXX是Python版本
export PYTHONPATH=/data/data/com.termux/files/usr/local/lib/python3.7/site-packages/cv2/python-3.7:$PYTHONPATH
遇到的问题总结
- 无法安装必备工具
问题:安好Termux后,我就开始安装必备工具,但发现python-dev libjpeg-turbo-dev libpng-dev总是安装不上
解决方法:更换Termux的软件下载源为清华的后,便可以成功安装
# 设置默认文本编辑器,vi的基本操作请自行百度
export EDITOR=vi
# 修改下载源
apt edit-sources
将原来的https://termux.net官方源替换为http://mirrors.tuna.tsinghua.edu.cn/termux (其他内容不要删除)
2. 配置命令报错
问题:在进行配置命令时总是报错,各种错误,常见找不到模块、未定义xxx的错误
解决方法:同样是应为必备工具没有安装好的原因
3. 编译报undefind “__android_log_print"错误
问题:编译时遇到undefind “__android_log_print"错误,然后仍然继续编译几行后,停止编译
解决方法:配置中需要添加LDFLAGS=” -llog -lpython3”
4. 安装报很对未知错误
问题:在安装中发现很多未知错误后警告
解决方法:没有安装Numpy,pip install numpy后重新安装即可
5. 安装后import cv2报错 missing configuration
问题:安装后进入python,import cv2时报丢失配置
解决方法:查找opencv的安装目录下是否有cv2.XXX-XXX.so文件,第一个XXX是编译Python连接库类型,第二个XXX是Python版本。若没有说明编译权限不够,或是其他未知原因,使用管理员重新编译下,然后找到该文件目录后添加到PYTHONPATH中,注意只需要添加文件所在目录即可,添加方法上面第7步中有写
6.关于安卓10的说明
以上命令在Android9系统上实测正常,在Android10系统上,termux-chroot命令会报错无法使用,这会导致后面配置生成的cv2.XXX-XXX.so无法生成,暂时没有找到解决办法,如需使用可root手机尝试,笔者没有root后的手机,因此没有尝试。 经测试,在Android10上可使用最新的termux版本(0.98版本)可正常运行termux-chroot命令,若直接升级仍无法使用,可重新安装proot尝试。另外,配置命令会报AndroidSDK的错误,需增加-DBUILD_JAVA=OFF -DBUILD_ANDROID_EXAMPLES=OFF这两个命令,最终完整的命令如下(此问题感谢 稚you 的评论才得以解决)
LDFLAGS=" -llog -lpython3" cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=$PREFIX/local -DBUILD_opencv_python3=on -DBUILD_opencv_python2=off -DOPENCV_EXTRA_MODULES=../modules -DPYTHON3_LIBRARIES=$PREFIX/lib/libpython3.so -DWITH_QT=OFF -DWITH_GTK=OFF -DBUILD_JAVA=OFF -DBUILD_ANDROID_EXAMPLES=OFF ..