一.安装cmake

安装cmake相对简单。可以使用如下命令直接安装cmake。不过这样安装的cmake版本可能比较低,如果是想用在混合编程上不建议这样做。因为版本比较低可能会不支持,比如想用在Android上,cmake版本要求好像最低是3.6.0如果没有记错的话,而下面的命令安装的是3.4.0。建议先大致浏览一遍整个博客再进行安装。同时建议先看这篇博客,编译opencv碰到的问题。

sudo apt-get install cmake

手动安装cmake顺序:下载最新版本,或者这里下载指定版本(或者这里)。在Ubuntu中下载如下图所示版本。

解压下载的文件,在解压的文件中打开终端。然后执行如下命令:

./bootstrap
make
sudo make install

cmake安装与gcc的版本有关系,目前我的gcc版本为5.4.0尝试安装cmake-3.17.0版本失败。所以我就尝试安装cmake-3.15.0版本,但是在make install时出现file cannot create directory: /usr/local/doc/cmake-3.14。具体如下图:

出现安装失败,我没仔细看,还以为是cmake版本过高。所以又下载了cmake-3.14.0版本,再执行make install时还是出现上述问题。我就不得不仔细看了。其实上面都提示了需要sudo权限。所以需要使用sudo make install。

查看cmake是否安装成功(有输出版本号表示安装成功):

cmake --version

CMakeList.txt一个样例和注释:

# 大小写不严格区分
# cmake verson,指定cmake版本 
cmake_minimum_required(VERSION 3.0.0)

# set():用来显式的定义变量 
set(CMAKE_POSITION_INDEPENDENT_CODE ON)                 # 添加-fPIC编译,即:装成一个动态库(Linux为.so扩展文件;windows为.dll扩展文件)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") # CMAKE_CXX_FLAGS:设置 C++ 编译选项。后面即为编译的添加的内容
set(CUDA_TOOLKIT_ROOT_DIR /usr/local/cuda)              # 定义cuda路径变量

# project name,指定项目的名称,一般和项目的文件夹名称对应
project(smart)
add_definitions(-std=c++11)                             # 添加支持c++11特征


# find_package(CUDA)
find_package(OpenCV REQUIRED)                           # 添加opencv依赖库

if (NOT OpenCV_FOUND)
    message(FATAL_ERROR "opencv not found")
endif (NOT OpenCV_FOUND)

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)


add_subdirectory(src)                                   # 指定的文件夹加到build任务列表中

二.opencv-gpu版本的编译

2.1添加依赖库(最好更换成国内源)

# cmake安装
sudo apt-get install build-essential
sudo apt-get install libgtk2.0-dev  # 2.0以上的版本
sudo apt-get install pkg-config
sudo apt-get install python-dev python-numpy
sudo apt-get install libavformat-dev libavcodec-dev libswscale-dev libtbb2 libtbb-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libdc1394-22-dev

如果在cmake的时候添加了如下选项:

-DWITH_OPENGL=ON

请添加如下依赖库:

sudo apt-get install mesa-common-dev
sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev

如果在上述安装过程碰到“无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系”问题,可以参考这里

2.2编译opencv时参数的意义

编译opencv的难点、重点就是编译时参数的选择了。不同的参数最后编译的版本就不一样。

参数说明,注意不同版本有的参数可能没有或者名字更改了(参数有很多,更多参数可看这里):

cmake \
	-D CMAKE_BUILD_TYPE=RELEASE \  # 编译opencv的版本。这里是release版本
	-D CMAKE_INSTALL_PREFIX=/usr/local \  # 为opencv安装的目录,可按实际目录进行修改,一般放在/usr/local目录下
	-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.3.0/modules/ \  # 该选选项为opencv_contrib模块下module文件夹,按实际目录进行修改,若不编译opencv_contrib模块,该选项可以省略
	-D CUDA_CUDA_LIBRARY=/usr/local/cuda/lib64/stubs/libcuda.so \  # cuda的动态库文件地址
	-D CUDA_ARCH_BIN=7.5 \  # 显卡的算力
	-D CUDA_ARCH_PTX="" \   # 代表PTX代码(反正很高级的样子,具体可看:https://bbs.csdn.net/topics/390796227)
	-D WITH_CUDA=ON \  # 编译CUDA版本
	-D WITH_TBB=ON \  # 支持高性能并行的Intel tbb(AMD?)
	-D BUILD_NEW_PYTHON_SUPPORT=ON \ 支持Python 查找资料时发现有人说变成:BUILD_PYTHON_SUPPORT
	-D WITH_V4L=ON \  # 增加对V4L的支持。比如用在板子对摄像头的调用上
	-D INSTALL_C_EXAMPLES=ON \  # 安装c版本的例子(opencv3还是4已经放弃了c的维护了吧)
	-D INSTALL_PYTHON_EXAMPLES=ON \  # 安装Python版本的例子
	-D BUILD_EXAMPLES=ON \  # 安装例子
	-D WITH_QT=ON \  # 添加对qt的支持
	-D WITH_OPENGL=ON \  # 添加对opengl的支持
	-D ENABLE_FAST_MATH=1 \  # 支持math快速计算
	-D CUDA_FAST_MATH=1 \  # cuda的math快速计算
	-D WITH_CUBLAS=1 \  # 支持NVidia Cuda基本线性代数子程序(BLAS)库
	-D WITH_NVCUVID=ON \ # NVidia视频解码库支持
	-D BUILD_opencv_cudacodec=OFF ..  # cuda10已经被单独分出了,所以用off。后面两点是上一层目录的意思,不可少。

 下面是一套opencv440版本的命令:

cmake -DCMAKE_BUILD_TYPE=RELEASE \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
    -DWITH_CUDA=1 \
    -DENABLE_FAST_MATH=1 \
    -DCUDA_FAST_MATH=1 \
    -DWITH_CUBLAS=1 \
    -DOPENCV_GENERATE_PKGCONFIG=1 \
    -DCUDA_GENERATION=Pascal ..

2.3opencv编译过程

如果不想编译带上contrib和gpu的版本,可以参考如下博客:

  1. 第一篇,以第一篇为主。
  2. 第二篇。第一篇有的地方写的不是很明确可以参考第二篇。

现在要开始编译了。具体如下:

2.3.1准备opencv4.1.0和对应的contrib版本

解压两个文件,contrib文件和opencv-4.1.0同级。如下图所示:

2.3.2准备相应安装位置

终端进入opencv-4.1.0文件中,输入如下命令:

mkdir build
cd build

效果如下:

2.3.3cmake编译参数

根据自己的需求选择参数,我选择的参数如下。将它们输入刚刚打开的终端(cuda10以上-DBUILD_opencv_cudacodec=OFF一定要添加,要不然会报缺失nvcuvid.h文件的错,当然也可以去官网下载所需文件)。注意:我的添加“-DWITH_TBB=ON”选项,会出现“对‘__cxa_init_primary_exception@CXXABI_1.3.11’未定义的引用”和“对‘std::__exception_ptr::exception_ptr::exception_ptr(void*)@CXXABI_1.3.11’未定义的引用”的错误。

cmake -DCMAKE_BUILD_TYPE=RELEASE \
 -DCMAKE_INSTALL_PREFIX=/usr/local \
 -DINSTALL_PYTHON_EXAMPLES=ON \
 -DOPENCV_GENERATE_PKGCONFIG=ON \
 -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.0/modules \
 -DPYTHON3_EXECUTABLE=/usr/bin/python3 \
 -DPYTHON_EXECUTABLE=/usr/bin/python \
 -DWITH_V4L=ON \
 -DWITH_QT=ON \
 -DWITH_GTK=ON \
 -DWITH_OPENGL=ON \
 -DWITH_CUDA=ON \
 -DENABLE_FAST_MATH=ON \
 -DCUDA_FAST_MATH=ON \
 -DWITH_CUBLAS=ON \
 -DWITH_NVCUVID=ON \
 -DBUILD_opencv_cudacodec=OFF \
 -DBUILD_TIFF=ON ..

编译前效果如下图:

编译完成后,参数配置情况:

图一
图二
图三

2.3.4make、安装和配置环境

执行完上面的命令后,输入如下命令(注意 -j8 表示使用8线程进行make。这一步比较耗时,多则一两天,少的也快,半个小时,看CPU的性能。尽量用CPU最大性能):

make -j8

 上面的步骤有百分比进度条,可能会出现很多的错误(我碰到的错误等下整理处理),解决了错误后(没有改变cmake参数的情况),可以不从cmake开始,可以直接执行make -j8继续执行。

没有错误后进行安装,如下:

sudo make install

配置c++,输入如下命令:

sudo gedit /etc/ld.so.conf.d/opencv4.conf

 在打开的文件的最后一行添加如下路径:

/usr/local/lib

更新系统库:

sudo ldconfig

添加环境变量:

sudo gedit /etc/profile

 加入如下内容:

export PATH="/usr/local/lib/pkgconfig:$PATH"

刷新一下刚刚更改的文件:

sudo source /etc/profile

三.测试是否安装成功

3.1测试程序一:常规测试

在一个没有中文的路径下新建一个test_opencv文件,在该文件下新建CMakeLists.txt文件和main.cpp。注意测试的opencv的版本是4.1.0,如果其他版本可能会有稍微的差别。如下:

CMakeLists.txt

# cmake needs this line
cmake_minimum_required(VERSION 2.8)
 
# Define project name
project(test)
# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)

set(CMAKE_CXX_STANDARD 14)
 
# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
 
if(CMAKE_VERSION VERSION_LESS "2.8.11")
  # Add OpenCV headers location to your include paths
  include_directories(${OpenCV_INCLUDE_DIRS})
endif()
 
# Declare the executable target built from your sources
add_executable(opencv_example main.cpp)
 
# Link your application with OpenCV libraries
target_link_libraries(opencv_example ${OpenCV_LIBS})

 main.cpp(早期的opencv调用gpu用的是:#include "opencv2/gpu/gpu.hpp")

using namespace std;
#include "opencv2/opencv.hpp"
#include "opencv2/core/cuda.hpp"

using namespace cv;
using namespace cv::cuda;

int main()
{
    int num_devices = cv::cuda::getCudaEnabledDeviceCount();
 
    cout<<num_devices<<endl;
}

 在test_opencv文件中打开终端,输入如下命令:

cmake .
make
./opencv_example

 如果opencv安装成功,代码编译成功:则会显示出1来(如果2块显卡就显示2),若为0表示安装不成功。我的测试结果:

3.2测试程序二:使用g++打包程序

目录如下:

 main.cpp

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
    
    Mat srcImage=imread("123.png");
    imshow("Origin",srcImage);
    waitKey(0);
    return 0;
}

 在所在文件的目录里打开终端,输入如下命令(如果不带“-DOPENCV_GENERATE_PKGCONFIG=ON”参数,下面的命令极大可能会报错):

g++ -std=c++11 main.cpp -o main `pkg-config --cflags --libs opencv4`

执行完上面的命令后会出现一个叫“mian”的斜的正方形,如下所示:

 双击该文件就会显示“123.png”这个图片,效果如下:

 3.3测试程序三:调用gpu

执行这个程序可能需要添加必要的依赖库或者其他操作,请移步这里的第五个问题,按照测试程序一的步骤执行,如果出现相同错误,可以采用博客所写方法尝试一下。

四.卸载opencv

首先要找到当初安装opencv的build目录,进入该build目录执行卸载操作(有的可能是release)。

sudo make uninstall
cd  ..
rm -rf build  # rm -rf release

如果这个目录被以前被误删了,那么需要重新建立build目录并安装对应版本,然后再执行上边卸载步骤。然后清理/usr中所有opencv相关项(注意,opencv4.0.0以后文件的名字是opencv4)。

sudo rm -rf /usr/local/include/opencv4 /usr/local/share/opencv4 /usr/local/lib/libopencv*
cd /usr
find . -name "*opencv*" | xargs sudo rm -rf

注意,如果卸载opencv后,依赖库最好是重新安装一遍(最少检查一遍)。

Logo

更多推荐