源码编译OpenCV
1. 源码编译
-
下载源码
下载opencv与opencv-contrib的源码包,注意版本对应
opencv:https://github.com/opencv/opencv/releases opencv-contrib:https://github.com/opencv/opencv_contrib/releases
-
安装依赖
# to support gtk2: sudo apt-get install libgtk2.0-dev # to support gtk3: sudo apt-get install libgtk-3-dev
可选依赖
sudo apt-get install libpng-dev libjpeg-dev libtiff-dev libwebp-dev sudo apt-get install libopenexr-dev
-
编译安装
mkdir build && cd build && cmake .. # 编译选项 make -j4 sudo make install
-
验证
pkg-config --modversion opencv4
1.1. Jetson编译最新版本
由于Jetson自带的是4.1.1的老版本OpenCV(基于Ubuntu18.04),且apt包未提供CUDA支持。所以需要自己编译OpenCV,这里是基于4.5.1版本。
mv opencv_contrib opencv
cd opencv && madir build && cd build
cmake编译选项说明:
cmake -DCMAKE_BUILD_TYPE=RELEASE \ #表示编译发布版本
-DCMAKE_INSTALL_PREFIX=/usr/local \ #指定安装路径
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
-DCUDA_ARCH_BIN='7.2' \ #指定GPU算力,在NVIDIA官网查询,也可在jtop中查询
-DWITH_CUDA=ON \ #使用CUDA
-DWITH_V4L=ON \
-DWITH_QT=ON \ #使用QT支持
-DWITH_OPENGL=ON \
-DENABLE_FAST_MATH=1 \
-DCUDA_FAST_MATH=1 \
-DWITH_CUBLAS=1 \
-DOPENCV_GENERATE_PKGCONFIG=1 \ #用于生成opencv4.pc文件,支持pkg-config功能,没有这一项的话需要自己手动生成
-DCUDA_GENERATION=Pascal \
-DWITH_GTK_2_X=ON .. #解决Gtk-ERROR的关键
关于 CUDA_GENERATION
,对于常见的几个嵌入式设备的CUDA架构如下:
- Jetson Nano: Maxwell
- Jetson TX2: Pascal
- Xavier NX: Volta
- AGX Xavier: Volta
cmake配置中
-D ENABLE_FAST_MATH=1
会导致莫名的错误,建议去掉;
-D CUDA_GENERATION=Pascal
对于-D CUDA_ARCH_BIN='7.2'
来说是多余的,建议去掉;
make -j6
多核编译会出现莫名的错误,建议单核编译make VERBOSE=1
。
以下参数是针对jetson的优化
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
-D EIGEN_INCLUDE_PATH=/usr/include/eigen3 \
-D WITH_CUDA=ON \
-D CUDA_ARCH_BIN=5.3 \
-D CUDA_ARCH_PTX="" \
-D WITH_CUDNN=ON \
-D WITH_CUBLAS=ON \
-D ENABLE_FAST_MATH=OFF \
-D CUDA_FAST_MATH=ON \
-D OPENCV_DNN_CUDA=ON \
-D ENABLE_NEON=ON \
-D WITH_QT=OFF \
-D WITH_OPENMP=ON \
-D WITH_OPENGL=ON \
-D BUILD_TIFF=ON \
-D WITH_FFMPEG=ON \
-D WITH_GSTREAMER=ON \
# -D WITH_TBB=ON \
# -D BUILD_TBB=ON \
-D BUILD_TESTS=OFF \
-D WITH_EIGEN=ON \
-D WITH_V4L=ON \
-D WITH_LIBV4L=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D PYTHON_DEFAULT_EXECUTABLE=$(which python3) \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D BUILD_opencv_python3=TRUE \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D WITH_GTK_2_X=ON ..
编译时,注意添加 -j4
可以有效提升编译速度。
sudo make install -j4
额,经过测试,多核编译确实可以提速编译,但最后会莫名的卡死在100%的状态下,ps
的状态标识为 D
。此时重新编译,去除多核编译选项,即可完成编译。
1.2. 编译报错
1.2.1. xfeatures2d缺少boostdesc_lbgm.i等文件
cmake会自动下载配置文件,但由于网络问题,导致数据下载失败。
.cache
└───xfeatures2d
├───boostdesc
│ 0ae0675534aa318d9668f2a179c2a052-boostdesc_lbgm.i
│ 0ea90e7a8f3f7876d450e4149c97c74f-boostdesc_bgm.i
│ 202e1b3e9fec871b04da31f7f016679f-boostdesc_binboost_064.i
│ 232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i
│ 324426a24fa56ad9c5b8e3e0b3e5303e-boostdesc_bgm_hd.i
│ 98ea99d399965c03d555cef3ea502a0b-boostdesc_binboost_128.i
│ e6dcfa9f647779eb1ce446a8d759b6ea-boostdesc_binboost_256.i
└───vgg
151805e03568c9f490a5e3a872777b75-vgg_generated_120.i
7126a5d9a8884ebca5aea5d63d677225-vgg_generated_64.i
7cd47228edec52b6d82f46511af325c5-vgg_generated_80.i
e8d0dcd54d1bcfdc29203d011a797179-vgg_generated_48.i
可以从以下地址: github: opencv_contrib_files 下载,并解压到 build/.cache/xfeatures2d/
代替原有的boostdesc和vgg两个文件夹。
1.2.2. face_landmark_model.dat等文件缺失
csdn: 一次性解决opencv源码安装文件下载问题:ippicv_2017u3_lnx, face_landmark_model.dat, tiny-dnn
-
face_landmark_model.dat
下载地址:github: opencv_3rdparty-face_landmark_model.dat
gitee备份: gitee: opencv_3rdparty-face_landmark_model.dat
配置:
opencv_contrib/modules/face/CMakeLists.txt
,第19行,把网址改成下载路径"file://${path_dir}"
(注意,不用指定文件,dir即可)。 -
ippicv_2017u3_lnx_intel64_general_20170822.tgz
下载地址:github: opencv_3rdparty-ippcv
另提供gitee的备份: gitee: opencv_3rdparty-ippcv
配置:打开
opencv/3rdparty/ippicv/ippicv.cmake
,第47行"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"
,改成:"file://${path}"
-
tiny-dnn-1.0.0a3.tar.gz
下载地址:github: opencv_3rdparty-tinydnn
gitee备份: gitee: opencv_3rdparty-tinydnn
配置:
${opencv_contrib_folder}/modules/dnn_modern/CMakeLists.txt
,第23行,修改方法和前面一样
1.3. 编译opencv-python
安装依赖:
sudo apt-get install python3-dev python3-numpy
You should see these lines in your CMake output (they mean that Python is properly found):
-- Python 2:
-- Interpreter: /usr/bin/python2.7 (ver 2.7.6)
-- Libraries: /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.6)
-- numpy: /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.8.2)
-- packages path: lib/python2.7/dist-packages
--
-- Python 3:
-- Interpreter: /usr/bin/python3.4 (ver 3.4.3)
-- Libraries: /usr/lib/x86_64-linux-gnu/libpython3.4m.so (ver 3.4.3)
-- numpy: /usr/lib/python3/dist-packages/numpy/core/include (ver 1.8.2)
-- packages path: lib/python3.4/dist-packages
-- Python (for build): /usr/bin/python2.7
能够正常找到python环境,但默认选择了 python2.7
匹配?解决方法如下:
PYTHON_DEFAULT_EXECUTABLE=$(which python3)
决定了生成 cv2.so
对应的python版本。如果你需要自定义numpy和site_package(例如venv环境下的依赖包),可以使用以下选项
-D INSTALL_PYTHON_EXAMPLES=ON \
-D PYTHON_EXECUTABLE=/home/user/anaconda3/bin/python3.7m \
-D PYTHON_INCLUDE_DIR=/home/user/anaconda3/include/python3.7m \
-D PYTHON_LIBRARY=/home/user/anaconda3/lib/libpython3.7m.so \
-D PYTHON_PACKAGES_PATH=/home/user/anaconda3/lib/python3.7/site-packes
-D PYTHON_NUMPY_INCLUDE_DIR=/home/user/anaconda3/lib/site-packages/numpy/core/include \
-D PYTHON3_PACKAGES_PATH=/home/user/anaconda3/lib/python3.7/site-packages
注意:如果编译时使用了编译选项 -D BUILD_opencv_world=NO
那么完成后在 build/lib
文件夹下也找不到cv2.so的。
测试
python3 -c "import cv2; print(cv2.__version__)"
2. OpenCV-Python
2.1. 使用CUDA加速dnn
csdn: opencv-python dnn模块使用CUDA加速
How to use OpenCV’s “dnn” module with NVIDIA GPUs, CUDA, and cuDNN
net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
3. 编译cv代码
g++ main.cpp `pkg-config opencv4 --cflags --libs`