[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