前言
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.com/opencv/opencv
https://github.com/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.net/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虚拟环境中,所以在虚拟环境中运行能看到打印结果如下,说明opencv在该虚拟环境中成功安装。注意这个虚拟环境中,是没有通过pip安装的opencv,我看有的博主说import cv2失败直接pip安装,是不正确的。python import cv2 print(cv2.__version__)
- 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; }