opencv_install - yuhannah/skills_map GitHub Wiki
ubuntu 系统安装 OpenCV
ubuntu 系统版本 16.04,安装 OpenCV 和 opencv_contrib 版本为 3.4.11。
准备源码包
在 OpenCV 官网选择某个版本的源码包(sources)/或者 github 仓库进行下载。另外,如需opencv_contrib
模块也可以在对应的 github 仓库进行下载与源码对应的版本。
准备依赖库
需要的依赖库如下:
- GCC 4.4.x or later
- CMake 2.8.7 or higher
- Git
- GTK+2.x or higher, including headers (libgtk2.0-dev)
- pkg-config
- Python 2.6 or later and Numpy 1.5 or later with developer packages (python-dev, python-numpy)
- ffmpeg or libav development packages: libavcodec-dev, libavformat-dev, libswscale-dev
- [optional] libtbb2 libtbb-dev
- [optional] libdc1394 2.x
- [optional] libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev, libdc1394-22-dev
- [optional] CUDA Toolkit 6.5 or higher
通过以下命令进行安装:
# compiler
sudo apt-get install build-essential
# required
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
# optional
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
在ubuntu 系统添加/删除源(以 Git 为例)和ubuntu 下高版本 CMake 安装及软链接设置文档里已经完成了对 Git 和 CMake 进行安装和升级的过程。其他可选依赖库此处不进行安装。
用 CMake 安装 OpenCV
重要!!安装过程中出现的问题均可以在opencv_contrib/issues找到解决方案。
将 OpenCV 源码包放在某个目录下,下述均为 /home/user/sources/
。解压后创建一个build
目录,用于存放生成的Makefile,项目文件以及目标文件和输出二进制文件,将opencv_contrib
模块解压后放在某个目录下,下述均为opencv-3.4.11/
目录下:
cd ~/sources/opencv-3.4.11/
mkdir build
cd build
编译 cmake
在build
目录下执行以下 CMake 命令进行编译:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
PS:如果上述命令无效,去掉-D
后面的空格,重新执行命令。
实际执行的命令如下所示,添加了 opencv_contrib 模块的目录:
cmake -DCMAKE_BUILD_TYPE=Release \ # 构建类型
-DCMAKE_INSTALL_PREFIX=/usr/local \ # 安装路径前缀
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.4.11/modules \ # 使用 opencv_contrib 中的模块进行构建
-DBUILD_EXAMPLES=ON \ # 构建 examples
-DINSTALL_C_EXAMPLES=OFF \
-DINSTALL_PYTHON_EXAMPLES=OFF \
-DWITH_TBB=OFF \
-DWITH_V4L=OFF \
-DWITH_QT=OFF \
-DWITH_OPENGL=ON \
.. # 其余参数可以通过显示 cmake 参数查看
PS:如果 OpenCV 源码和 opencv_contrib 模块的版本不一致,会导致编译失败。
构建 build
成功后继续执行构建命令,等待较长时间:
# 查看cpu 核心数
nproc
# 1
make -j1 # runs 1 jobs in parallel
如果在编译 opencv_contrib 模块时报错:
~/opencv_contrib/modules/xfeatures2d/src/boostdesc.cpp:673:20: fatal error: boostdesc_bgm.i: No such file or directory
查看build
目录下的CMakeDownloadLog.txt
文件,搜索boostdesc_bgm.i
,文件里有它的下载地址,复制地址到网页可以得到文件的源码。在 opencv_contrib/modules/xfeatures2d/src/
路径下创建boostdesc_bgm.i
文件并拷贝对应源码即可。
总共缺了以下几个文件:
boostdesc_bgm.i
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm.i
boostdesc_bgm_bi.i
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm_hd.i
boostdesc_lbgm.i
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_lbgm.i
boostdesc_binboost_064.i
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_064.i
boostdesc_binboost_128.i
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_128.i
boostdesc_binboost_256.i
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_binboost_256.i
vgg_generated_120.i
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_120.i
vgg_generated_80.i
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_80.i
vgg_generated_64.i
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_64.i
vgg_generated_48.i
# https://raw.githubusercontent.com/opencv/opencv_3rdparty/fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d/vgg_generated_48.i
如果上述操作完成后重新构建,出现新的报错:
/home/hannah/sources/opencv-3.4.11/opencv_contrib-3.4.11/modules/xfeatures2d/src/vgg.cpp: In constructor ‘cv::xfeatures2d::VGG_Impl::VGG_Impl(int, float, bool, bool, float, bool)’:
/home/hannah/sources/opencv-3.4.11/opencv_contrib-3.4.11/modules/xfeatures2d/src/vgg.cpp:491:11: error: expected ‘}’ before ‘ini_params’
ini_params( PRrows, PRcols, PRidx, sizeof(PRidx)/sizeof(PRidx[0]), PR
^
查看上述拷贝的.i
文件确,保文件内容完整,并以};
结尾。
如果上述操作完成后重新构建,出现新的找不到文件的报错:
In file included from /home/hannah/sources/opencv-3.4.11/modules/stitching/include/opencv2/stitching.hpp:49:0,
from /home/hannah/sources/opencv-3.4.11/build/modules/python_bindings_generator/pyopencv_generated_include.h:130,
from /home/hannah/sources/opencv-3.4.11/modules/python/src2/cv2.cpp:37:
/home/hannah/sources/opencv-3.4.11/modules/stitching/include/opencv2/stitching/detail/matchers.hpp:52:42: fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory
compilation terminated.
modules/python2/CMakeFiles/opencv_python2.dir/build.make:81: 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 1
CMakeFiles/Makefile2:13726: recipe for target 'modules/python2/CMakeFiles/opencv_python2.dir/all' failed
make[1]: *** [modules/python2/CMakeFiles/opencv_python2.dir/all] Error 2
Makefile:181: recipe for target 'all' failed
make: *** [all] Error 2
解决方法一:将报错中提示的文件路径修改为绝对路径:
#ifdef HAVE_OPENCV_XFEATURES2D
//# include "opencv2/xfeatures2d/cuda.hpp"
# include "/home/hannah/sources/opencv-3.4.11/opencv_contrib-3.4.11/modules/xfeatures2d/include/opencv2/xfeatures2d/cuda.hpp"
#endif
解决方法二:根本原因是由 xfeatures2d 模块构建失败导致的找不到文件。
查看opencv_contrib-3.4.11/modules/xfeatures2d/CMakeLists.txt
文件,如下所示:
set(the_description "Contributed/Experimental Algorithms for Salient 2D Features Detection")
if(HAVE_CUDA)
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef)
endif()
ocv_define_module(xfeatures2d opencv_core opencv_imgproc opencv_features2d opencv_calib3d OPTIONAL opencv_shape opencv_ml opencv_cudaarithm WRAP python java)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/download_vgg.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/download_boostdesc.cmake)
set(DOWNLOAD_DIR "${OpenCV_BINARY_DIR}/downloads/xfeatures2d")
download_boost_descriptors("${DOWNLOAD_DIR}" boost_status) # 问题所在
download_vgg_descriptors("${DOWNLOAD_DIR}" vgg_status) # 问题所在
if(NOT boost_status OR NOT vgg_status) # 问题导致的判断失败
ocv_module_disable(xfeatures2d) # 问题导致的结果失败
endif()
ocv_module_include_directories("${DOWNLOAD_DIR}")
如上述代码注释的两行 download 语句,只有在下载boost_descriptors
和vgg_descriptors
成功后才会分别将boost_status
和vgg_status
标志置为true
。接下来判断两个标志有任一一个标志是false
,则将xfeatures2d
模块失效。
然而boost_descriptors
和vgg_descriptors
的相关文件实际上是在下载失败后手动添加的!!!导致这两句的boost_status
和vgg_status
标志始终为false
,从而满足接下来的判断条件,从而无法构建xfeatures2d
模块,从而出现找不到文件!!
解决方案,在该CMakeLists.txt
文件中的判断条件前,手动将boost_status
和vgg_status
标志置为true
。为了节省重复尝试下载boost_descriptors
和vgg_descriptors
的过程(前提是已经通过手动方式拷贝了相应的文件),下述将两行 download 语句也屏蔽了。
set(the_description "Contributed/Experimental Algorithms for Salient 2D Features Detection")
if(HAVE_CUDA)
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef)
endif()
ocv_define_module(xfeatures2d opencv_core opencv_imgproc opencv_features2d opencv_calib3d OPTIONAL opencv_shape opencv_ml opencv_cudaarithm WRAP python java)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/download_vgg.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/download_boostdesc.cmake)
set(DOWNLOAD_DIR "${OpenCV_BINARY_DIR}/downloads/xfeatures2d")
#download_boost_descriptors("${DOWNLOAD_DIR}" boost_status)
#download_vgg_descriptors("${DOWNLOAD_DIR}" vgg_status)
set(boost_status true) # 手动置位
set(vgg_status true) # 手动置位
if(NOT boost_status OR NOT vgg_status)
ocv_module_disable(xfeatures2d)
endif()
ocv_module_include_directories("${DOWNLOAD_DIR}")
构建成功。
安装 install
成功后继续执行安装命令:
sudo make install
测试安装情况
官方的测试例程:
# 编译命令中添加测试目录
cmake -DOPENCV_TEST_DATA_PATH=/home/user/sources/opencv_extra/testdata/ ..
# 构建
build
# 测试
/home/user/sources/opencv-3.4.11/build/bin/opencv_test_core
从已经构建的 example 中测试 OpenCV 的安装情况:
# 进入构建号的 example 可执行文件目录
cd /home/user/sources/opencv-3.4.11/build/bin
# 执行某个 example
./example_cpp_em
# 出现 EM 的分类结果
如果在编译和构建过程中并未对 example 进行构建,则需要在安装 OpenCV 后单独对 example 进行编译和构建。
# 转到 example_cmake 目录下
cd /home/user/sources/opencv-3.4.11/samples/cpp/example_cmake
# 编译并构建
cmake .
make
# 执行
./opencv_example
如果摄像头打开,左上角出现 Hello OpenCV 则证明安装成功。
配置环境(未实践)
这部分参考了 https://blog.csdn.net/sandalphon4869/article/details/94398876#3launchjson_144
首先将 OpenCV 的库添加到路径,从而可以让系统找到:
# 打开 opencv.conf,打开后很可能是空白
sudo gedit /etc/ld.so.conf.d/opencv.conf
# 在文末添加
/usr/local/lib
# 保存并退出
保存后,执行如下命令使得刚才的配置路径生效:
sudo ldconfig
接下来配置 bash:
sudo gedit /etc/bash.bashrc
# 在文件最末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
# 保存并退出
保存,执行如下命令使得配置生效:
source /etc/bash.bashrc
然后更新:
sudo updatedb
到这里配置就完成了。