前言
最近基於輕舟無人小車上在做車道線檢測和紅綠燈小車,但是其板子是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