Ubuntu16.04安装cmake以及编译opencv带上contrib的gpu版本
CMakeList.txt内容和注释:# 大小写不严格区分# cmake verson,指定cmake版本cmake_minimum_required(VERSION 3.0.0)# set():用来显式的定义变量set(CMAKE_POSITION_INDEPENDENT_CODE ON)# 添加-fPIC编译,即:装成一个动态库(Linux...
一.安装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的版本,可以参考如下博客:
现在要开始编译了。具体如下:
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后,依赖库最好是重新安装一遍(最少检查一遍)。
更多推荐
所有评论(0)