前言

opencv 基础模块可以满足大多数初学者的正常使用需求。
opencv_contrib 扩展模块中集成了很多使用的功能:人脸检测、生物识别、特征点提取等功能。
扩展模块是对基础模块的补充,由于某些算法具有专利保护,无法放到基础模块中,但又是学习图像处理常用的算法,如 SIFT特征点提取算法。

1 依赖库的安装

1 安装基础模块必须依赖的库

sudo apt-get install  cmake
sudo apt-get install build-essential libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev  libgtk-3-dev libavcodec-dev libavformat-dev  libswscale-dev libjasper-dev  

2 安装扩展模块必须依赖的库,否则安装过程会报错,错误后面有记录

sudo apt-get install libgtk-3-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev libavresample-dev libgphoto2-dev
sudo apt-get install libopenblas-dev doxygen libvtk6-dev libgoogle-glog-dev tesseract-ocr libtesseract-dev
sudo apt-get install libhdf5-dev libatlas-base-dev  openjdk-8-jdk libgflags-dev

3 安装python的库,【如果是 python-dev python-numpy,安装为2.7版本的库】。

sudo apt-get install python3-dev python3-numpy

注意,这里在安装了python的环境的同时也安装了numpy的包,numpy是python版的opencv-cuda加速必须的包。
python开发者会在意python-opencv-cuda的安装环境:如果是想要安装在系统环境中,就可以使用上面的命令;如果想要安装在虚拟环境中,需要创建个虚拟环境,然后安装numpy,否则会编译不成功。我这里使用的是在conda的虚拟环境中安装

2 安装包下载

  • 下载opencv、opencv_contrib安装包。链接分别为:
    https://github/opencv/opencv
    https://github/opencv/opencv_contrib/

    opencvy也可在 官网 下载【Sources】。注意这里一定要与opencv的版本对应!我这里下载的为 opencv4.4.0、opencv_contrib4.4.0。
  • 完成后对压缩包进行解压,我这里将opencv-4.4.0.zip 解压放在了路径【/home/ll/】下,将opencv_contrib-4.4.0.zip 解压放在路径【/home/ll/opencv-4.4.0】下

3 编译

首先需要在【opencv4.4.0】路径下创建并进入【build 文件夹】

mkdir build
cd build

这里编译情况分为:只编译C++的opencv基础模块、编译opencv和opencv_contrib时不需要cuda加速、编译opencv和opencv_contrib时要cuda加速 同时将cuda加速编译到python环境中。


3.1 c++/opencv 的编译

  • 如果只编译opencv基础模块,编译速度很快
    cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local ..
    sudo make -j4
    sudo make install
    
    需要说明:
    • OPENCV_GENERATE_PKGCONFIG=ON该选项开启生成opencv4.pc文件,支持 pkg-config 工程。默认的是False
      CMAKE_INSTALL_PREFIX 该选项是指定目录的安装目录。如上指定了【/usr/local】,则会安装在该路径下的【include、bin、lib】三个文件夹下。该项的设置,在安装多个版本设置不同路径变得很有必要。
    • -j4 指的的启用4个线程同时进行编译,电脑性能好可以设置更大,加快编译速度

3.2 c++/opencv_contrib 的编译

  • 在ubuntu 下安装扩展模块且不用cuda加速比较容易,只需要在前面编译opencv时的命令中添加一个扩展模块的路径即可,具体命令如下:
    cmake
    -D CMAKE_BUILD_TYPE=Release
    -D OPENCV_GENERATE_PKGCONFIG=ON
    -D CMAKE_INSTALL_PREFIX=/usr/local
    OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.4.0/modules # 注意这里路径匹配自己的路径名
    ..
    完整命令如下,实际编译时要一条一条命令运行,更好的查找错误,错误解决在下一节:
    cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local  OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.4.0/modules ..
    sudo make -j10
    sudo make install
    


3.3 c++/opencv_contrib/cuda 的编译

如果要使用cuda加速,就要使用下面的命令编译,其中会将CUDA相关的设置开启。
cmake命令展示如下:
cmake
-D CMAKE_BUILD_TYPE=RELEASE
-D PYTHON_DEFAULT_EXECUTABLE=$(python -c "import sys; print(sys.executable)")
-D PYTHON3_EXECUTABLE=$(python -c "import sys; print(sys.executable)")
-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python -c "import numpy; print (numpy.get_include())")
-D PYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")
-D BUILD_opencv_python3=yes
-D BUILD_opencv_python2=no
-D CMAKE_INSTALL_PREFIX=/usr/local
-D WITH_TBB=ON
-D WITH_V4L=ON
-D WITH_OPENGL=ON
-D WITH_CUDA=ON
-D WITH_CUDNN=ON
-D ENABLE_FAST_MATH=1
-D CUDA_FAST_MATH=1
-D CUDA_NVCC_FLAGS="-D_FORCE_INLINES"
-D WITH_CUBLAS=1
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.4.0/modules # 注意这里的路径
..

需要注意:

  • 上面的编译命令中第3~6行,是在设置python版本的opencv的cuda加速的路径。这样写就不用每次修改自己的路径。但如果要安装在虚拟环境中,需要提前激活自己的虚拟环境,以便命令能够获取到相应的库的路径。当然也可以使用自己python的绝对路径,获取方式就是在终端运行 等号右边除去$ 的命令
  • 如果不关心python-opencv-cuda的安装,可以删去第3~8行。会默认配置到系统环境下的python中。

完整命令如下:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D PYTHON_DEFAULT_EXECUTABLE=$(python -c "import sys; print(sys.executable)") -D PYTHON3_EXECUTABLE=$(python -c "import sys; print(sys.executable)") -D PYTHON3_NUMPY_INCLUDE_DIRS=$(python -c "import numpy; print (numpy.get_include())") -D PYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_OPENGL=ON -DBUILD_opencv_python3=yes -DBUILD_opencv_python2=no -D WITH_CUDA=ON -D WITH_CUDNN=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" -DWITH_CUBLAS=1 -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.4.0/modules ..
sudo make -j10
sudo make install

在第一条命令运行结束后如下图,红框内的路径一定要是自己设置的环境。不关心python-opencv-cuda的安装,需要保证第二个红框的 “Configuring done…” 即可


3.4 可能出现的问题

我在编译了多次后成功,这里记录下可能出现的问题和解决方案

IPPICV: Download failed 等】

在编译过程中,会下载一些文件,需要fanqiang下载。包括:face_landmark_model.dat、boostdesc_bgm_hd.i、vgg_generated_64.i 等。 下载的文件会放在【./.cache】路径下。需要下载的文件 以及下载文件解压后存放路径,可以在【./build/CMakeDownloadLog.txt】中大致搜到。
这部分内容的下载受网络的限制,我把我安装opencv4.4.0的下载的内容放在我的资源里,是否适用别的版本测试下即可。https://download.csdn/download/magic_ll/72572819

【报错 Could NOT find ***】

如果没有安装上面的依赖库,编译过程就会报错如下。其实在安装依赖库时,就是我自己遇到下面的错误,一个个安装,为了方便起见,将这些库统一安装。

'''No package 'gtk+-3.0' found'''
sudo apt-get install libgtk-3-dev

'''No package 'gstreamer-base-1.0' found'''
sudo apt-get -y install libgstreamer-plugins-base1.0-dev
sudo apt-get -y install libgstreamer1.0-dev

'''No package 'libavresample' found
No package 'libgphoto2' found'''
sudo apt-get  install libavresample-dev
sudo apt-get  install libgphoto2-dev`

'''Could not find OpenBLAS include. Turning OpenBLAS_FOUND off'''
sudo apt-get install libopenblas-dev   # 没有作用,但这个错误不影响最终的编译

''' Could NOT find Doxygen (missing:  DOXYGEN_EXECUTABLE)'''
sudo apt-get install doxygen

'''VTK is not found'''
sudo apt install libvtk6-dev

''' Failed to find glog '''
sudo apt install libgoogle-glog-dev

'''No package 'tesseract' found'''
sudo apt install tesseract-ocr
sudo apt install libtesseract-dev

'''Could NOT find HDF5'''
sudo apt install libhdf5-dev

'''Could NOT find Atlas (missing:  Atlas_CLAPACK_INCLUDE_DIR)'''
sudo apt install libatlas-base-dev  # 没有作用,但这个错误不影响最终的编译

'''Could NOT find JNI (missing:  JAVA_INCLUDE_PATH'''
sudo apt install openjdk-8-jdk

'''Failed to find gflags'''
sudo apt install libgflags-dev

4 环境配置

  • sudo gedit /etc/ld.so.conf.d/opencv.conf
    
    无论该文件是否为空白,都在文件的末尾添加路径【/usr/local/lib】,保存好退出。
    注意:这里添加内容与之前编译时设置路径有关,如果安装路径变化,这里添加的内容也要随之变化。
  • 更新 pkg-config
    sudo ldconfig
    
  • 查看安装
    pkg-config --libs opencv4
    pkg-config --cflags opencv4
    

  • 添加到系统环境变量
    sudo gedit /etc/bash.bashrc
    # sudo gedit ~/.bashrc
    
    打开文件后将下面两行命令添加到文件最后,并保存关闭
    PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
    export PKG_CONFIG_PATH 
    
    source /etc/bash.bashrc
    # source ~/.bashrc
    

5 验证安装是否成功

  • C++的opencv基础模块
    cd ./opencv4.4.0/samples/cpp
    g++ `pkg-config --cflags opencv4` drawing.cpp `pkg-config --libs opencv4` -o drawing.out
    ./drawing.out
    
  • C++的opencv的扩展模块以及cuda加速
    需要相应的工程测试,这里暂时没提供
  • python的opencv
    我这里是将opencv-cuda加速安装到自己的conda虚拟环境中,所以在虚拟环境中运行
    python
    import cv2
    print(cv2.__version__)
    
    能看到打印结果如下,说明opencv在该虚拟环境中成功安装。注意这个虚拟环境中,是没有通过pip安装的opencv,我看有的博主说import cv2失败直接pip安装,是不正确的。
  • python的opencv-cuda加速
    我之前写的 【工程实现 || 基于opencv使用openpose完成人体姿态估计】,是基于python-opencv运行的,如果需要cuda加速,需要代码中设置下(图片为前面链接中的内容)

    加速后的图片测试速度(除去前两帧)如下约为0.35s。不使用cuda加速一张图片需要2.7s

6 opencv的卸载

cd /etc/ld.so.conf.d/
sudo rm opencv.conf
cd
cd ./opencv4.1/build
sudo make uninstall

7 ubuntu上编写第一个C++的opencv代码

创建一个路径,在该路径下打开终端;运行下面命令创建 CMakeLists.txt main.cpp两个文件,随便放置张图片命名为image.jpg

touch CMakeLists.txt main.cpp

打开CMakeLists.txt 文件,里面添加内容如下:

cmake_minimum_required(VERSION 2.6)
# 创建工程
project(testopencv)
# C++版本为11
set(CMAKE_CXX_FLAGS "-std=c++11")

find_package(OpenCV 4.4 REQUIRED)             # 找 OpenCV 4.4 安装路径
include_directories(${OpenCV_INCULDE_DIRS})   # 加载 OpenCV 4.1 的头文件
add_executable(testopencv main.cpp)           # 将程序生成可执行文件
target_link_libraries(testopencv ${OpenCV_LIBS})  # 链接lib文件到可执行文件

打开 main.cpp 文件,里面内容添加

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv; 

int main(int agrc, char** agrv){
   Mat img = imread("../image.jpg");
   imshow("test", img);
   waitKey(0);
   return 0;
}

更多推荐

【OpenCV之路】ubuntu下的安装C++的opencv4、opencv_contrib、python中opencv的cuda加速、ubuntu下openc