[OpenCV]基於arm64和Python2、Python3的opencv-python-contrib編譯


前言

  最近基於輕舟無人小車上在做車道線檢測和紅綠燈小車,但是其板子是ARM 64的,為了能夠在ubuntu18.04下的melodic版本的ROS1中使用opencv-contrib相關的函數,只能自己編譯,當然,編譯的版本是OpenCV4.5.0和3.4,但是高版本的失敗了,只能嘗試編譯3.4,最終成功了。使用的python版本是2.7.17和3.6.9。

過程

1、OpenCV3.4庫的下載

由於Github地址下載較慢,可以使用:

  1)使用碼雲直接導入Github的庫,直接下載,很快的;(推薦)

  2)使用外網服務器下載好(需要買國外的v*p*s),使用skicka上傳至Google雲盤,然后用v*p*n下載到本地;

Github地址:

https://github.com/opencv/opencv

https://github.com/opencv/opencv_contrib

碼雲地址:

https://gitee.com/shaominhao/opencv

https://gitee.com/shaominhao/opencv_contrib

兩種下載方式:

方法一:直接命令下載對應版本的OpenCV:

#github命令下載
git clone -b 3.4 https://github.com/opencv/opencv
git clone -b 3.4 https://github.com/opencv/opencv_contrib

#gitee命令下載
git clone -b 3.4 https://gitee.com/shaominhao/opencv
git clone -b 3.4 https://gitee.com/shaominhao/opencv_contrib

 以github為例,下載過程如下:

 方法二:在選擇對應的版本分支后,下載zip壓縮包。

         

PS:

  第一次使用git命令直接下載到本地,沒注意指定版本,結果OpenCV庫下載了500M+,第二次指定3.4版本直接下載zip包,只有80M+。

2、依賴包的安裝

  OpenCV的編譯安裝需要依賴其他的一些包和庫,看了很多博客,大致都是一樣,這里寫兩個常見的:

  方法一(博主使用該方法,推薦):

# Build tools:
sudo apt-get install -y build-essential cmake

# GUI (if you want to use GTK instead of Qt, replace 'qt5-default' with 'libgtkglext1-dev' and remove '-DWITH_QT=ON' option in CMake):
sudo apt-get install -y qt5-default libvtk6-dev

# Media I/O:
sudo apt-get install -y zlib1g-dev libjpeg-dev libwebp-dev libpng-dev libtiff5-dev libjasper-dev libopenexr-dev libgdal-dev

# Video I/O:
sudo apt-get install -y libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev yasm libopencore-amrnb-dev libopencore-amrwb-dev libv4l-dev libxine2-dev

# Parallelism and linear algebra libraries:
sudo apt-get install -y libtbb-dev libeigen3-dev

# Python:
sudo apt-get install -y python-dev python-tk python-numpy python3-dev python3-tk python3-numpy

  方法二(只適合ubuntu18.04的代碼,在參考文獻【2】中,按該方法安裝是分Ubuntu18.04和16.04的):

sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libgtk-3-dev libgtkglext1-dev libgstreamer1.0-dev libavresample-dev  libgphoto2-dev libopenblas-dev libatlas-base-dev doxygen libgstreamer-ocaml-dev libgstreamer-plugins-bad1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer1.0-dev libgstreamermm-1.0-dev libtesseract-dev liblept5 libleptonica-dev liblapacke-dev libgstreamer-opencv1.0-0 libgstreamer-plugins-bad1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libgstreamerd-3-dev libgstreamermm-1.0-dev libv4l-dev libprotobuf-dev libhdf5-dev libgflags-dev python3-numpy

  方法一中的問題記錄:

    在安裝libjasper-dev時,沒辦法找到對應的包,可能是原本的下載源里沒有這個包的資源:

#添加清華源
sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe"
#更新源 
sudo apt update

#下載libjasper-dev及其依賴包
sudo apt install libjasper1 libjasper-dev

3、編譯配置

1)如果是下載的zip壓縮包,將opencv和opencv-contrib解壓,同時opecv-contrib放到opencv目錄下;

2)在opencv目錄下新建一個build的目錄用於存放編譯后的文件;

3)在/usr/local下新建目錄opencv342用於最后安裝OpenCV(非root模式記得使用sudo執行);

步驟1)和2)的示例如下:

 PS:這里contrib包名有所不一樣,博主改過了,同時多了個toinstall目錄,里面存放之后臨時編譯需要下載的文件(如編譯所需的face_landmark_model.dat)。

 

4)在正式進入編譯OpenCV的流程之前,需要設置好編譯前的配置。

方法一:使用cmake的gui界面進行編譯選項配置。(博主使用該種方法進行配置,推薦)

(1)安裝cmake-gui界面: 

sudo apt-get install cmake-qt-gui

(2)使用cmake-gui命令打開界面:

  寫好編譯的地址(步驟1)中解壓opencv的目錄路徑)和編譯完以后存放的地址(步驟2)新建的build目錄路徑),點擊左下角的configure,就會出現如下很多紅色的選項。

PS:此處博主默認Unix MakeFiles下的Use default native compilers執行generate。

  參考部分博客中選項配置之后,博主選擇追加勾選上的選項有:

    CMAKE_BUILD_TYPE設置為Release;

    CMAKE_INSTALL_PREFIX設置為opencv342目錄所在的地址

    OPENCV_PYTHON3_VERSION打勾!!!!

    OPENCV_EXTRA_MODULES_PATH設置為contrib包里的modules目錄下的路徑,(博主的是/home/image/opencv-3.4/opencv/opencv_contrib-3.4/modules)

    WITH_LIBV4L(支持USB WebCam)、WITH_OPENGL、WITH_OPENMP打勾

PS由於博主暫時無CUDA使用需求,所以編譯時未選擇CUDA支持,如有需要使用OpenCV調用網絡模型在GPU中進行推理的需求,可以參考方法二的相關命令進行配置。

配置后的結果圖:

   

 

 

(3)點擊2-3次左右的configure來消除所有的紅色選項,如果全部變白,說明可以點擊旁邊的generate了。

最后生成的結果如下:

 

 

 

 

方法二:可以使用命令直接編譯時配置(此處參考文獻【2】)。

  (1)不使用CUDA支持的編譯命令:

cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local/opencv342 \ -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.4.2/modules \ -D WITH_LIBV4L=ON \ -D WITH_CUDA=OFF \ -D WITH_TBB=ON \ -D WITH_OPENMP=ON \ -D WITH_OPENGL=ON ..

  (2)使用CUDA支持的編譯命令:

cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local/opencv342 \ -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.4.2/modules \ -D WITH_LIBV4L=ON \ -D WITH_CUDA=ON \ -D ENABLE_FAST_MATH=ON \ -D CUDA_FAST_MATH=ON \ -D WITH_CUBLAS=ON \ -D WITH_NVCUVID=ON \ -D CUDA_GENERATION=Auto \ -D WITH_TBB=ON \ -D WITH_OPENMP=ON \ -D WITH_OPENGL=ON ..

問題記錄

  如果在generate過程中無法下載文件face_landmark_model.dat(此處參考文獻【3】):

data: Download: face_landmark_model.dat
Try 1 failed
CMake Warning at cmake/OpenCVDownload.cmake:202 (message):
  data: Download failed: 28;"Timeout was reached"

  For details please refer to the download log file:

  /home/xidian/opencv_3.4/build/CMakeDownloadLog.txt

Call Stack (most recent call first):
  opencv_contrib/modules/face/CMakeLists.txt:13 (ocv_download)


CMake Warning at opencv_contrib/modules/face/CMakeLists.txt:26 (message):
  Face: Can't get model file for face alignment.

  先單獨把這個文件下載下來:

https://raw.githubusercontent.com/opencv/opencv_3rdparty/8afa57abc8229d611c4937165d20e2a2d9fc5a12/face_landmark_model.dat

  方法一:翻一下牆,再下載;

  方法二:網盤鏈接: pan把.bai我du.co刪m/s/1LsM掉TDXi0ar0再wNEG9下MGQ載eGg          提*取*碼: qs1m

  然后把報錯的opencv_contrib/modules/face/CMakeLists.txt中的下載文件鏈接替換為本地地址,之后重新configure就行,如下示例是博主的存儲地址:

"file:///home/image/opencv-3.4/opencv/toinstall/"

 

 4、編譯及安裝

1)在build文件的目錄下,使用以下命令:

make -j3

此處的數字可以改,表示使用幾個線程進行編譯,我這里板子是4核的,就開了3個線程進行編譯。

這里時間很長,中間可以中斷,之后續借繼續編譯。

編譯得到結果:

問題記錄

我在編譯opencv4.5.0卡在了85%,這個問題找不出原因,后來就改為了低版本的opencv編譯。

[ 85%] Building CXX object modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o

c++: internal compiler error: Killed (program cc1plus)

Please submit a full bug report,

with preprocessed source if appropriate.

See <file:///usr/share/doc/gcc-7/README.Bugs> for instructions.

modules/python2/CMakeFiles/opencv_python2.dir/build.make:62: recipe for target 'modules/python2/CMakeFiles/opencv_python2.dir/__/src2/cv2.cpp.o' failed

make[2]: *** [modules/python2/CMakeFiles/opencv_python2.dir/__/src2/cv2.cpp.o] Error 4

CMakeFiles/Makefile2:21798: recipe for target 'modules/python2/CMakeFiles/opencv_python2.dir/all' failed

make[1]: *** [modules/python2/CMakeFiles/opencv_python2.dir/all] Error 2

make[1]: *** Waiting for unfinished jobs....

[ 85%] Linking CXX shared module ../../lib/python3/cv2.cpython-36m-aarch64-linux-gnu.so

[ 85%] Built target opencv_python3

Makefile:162: recipe for target 'all' failed

make: *** [all] Error 2

 5、安裝

編譯完成后進行安裝:

sudo make install

安裝很快完成.

我們需要把python2和python3的鏈接文件拷貝分別拷貝到python2和python3環境中(參考文獻【4】)。

其中python2的文件名叫cv2.so,在build/lib或者是build/lib/python2下,要將其拷貝到/usr/lib/python2.7/dist-packages下(具體路徑可以看cmake-gui中PYTHON2_PACKAGES_PATH確定);

python3的文件名叫cv2.cpython-36m-aarch64-linux-gnu.so,在build/lib/python3下,要將其拷貝到/usr/lib/python3.6/dist-packages下(參考PYTHON3_PACKAGES_PATH);

 之后就能正常使用opencv了。

結果圖

 

參考的博客:

[1]https://blog.csdn.net/weixin_41053564/article/details/81254410

[2]https://blog.csdn.net/DumpDoctorWang/article/details/82259357?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.pc_relevant_is_cache&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.pc_relevant_is_cache

[3]https://blog.csdn.net/qq_34806812/article/details/82501999

[4]https://blog.csdn.net/qq_36275734/article/details/81158966


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM