[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

posted @ 2020-11-15 20:22  炮火覆盖  阅读(2252)  评论(0编辑  收藏  举报