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_descriptorsvgg_descriptors成功后才会分别将boost_statusvgg_status标志置为true。接下来判断两个标志有任一一个标志是false,则将xfeatures2d模块失效。

然而boost_descriptorsvgg_descriptors的相关文件实际上是在下载失败后手动添加的!!!导致这两句的boost_statusvgg_status标志始终为false,从而满足接下来的判断条件,从而无法构建xfeatures2d模块,从而出现找不到文件!!

解决方案,在该CMakeLists.txt文件中的判断条件前,手动将boost_statusvgg_status标志置为true。为了节省重复尝试下载boost_descriptorsvgg_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 

到这里配置就完成了。