文章目錄
- 正确的安裝方法
-
- 1.安裝必備工具
- 2.擷取opencv
- 3.建立build檔案夾
- 4.管理者身份
-
- 沒有root的手機
- 已root的手機
- 5.配置
- 6.編譯&安裝
- 7.測試
- 遇到的問題總結
最近在學習開源的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 ..