步骤
- 1 安装cmake
- 1-1 获取源码包
- 1-2 解压源码包
- 1-3 安装cmake
- 1-4 查看安装版本
- 2 安装opencv
- 2-1 下载opencv安装包并整理层次
- 2-2 添加依赖库
- 2-3 开始编译
- 3 配置环境
- 4 检查安装是否成功
- 5 使用CMakeLists.txt编译运行代码
- 5-1 在代码同目录下创建 CMakeLists.txt ,示例如下:
- 5-2
- 5-3
- 5-4
- 5-5 在cmake、make步骤遇到过的问题
本机配置:
Ubuntu16.04
gcc 5.4.0
cmake 3.5.1
安装 opencv 版本 4.5.3
一点啰嗦:因为linux上安装opencv需要自己对源码进行编译,所以,就像其他博客里写到的一样,整个过程中会遇上很多问题,如在 cmake 那一步会遇上文件缺失等问题导致语句运行失败,且在实操过程中发现不同版本遇到的问题还会不一样。所以安装过程很难受。总之最后爬出来了,记录一下成功的做法,希望能帮上大家 ( •̀ ω •́ )y
1 安装cmake
编译 opencv 源码的过程中需要执行 cmake 语句,且存在版本要求。
如果在尝试安装 opencv 过程中遇到提示,则安装相应版本 cmake 即可。
1-1 获取源码包
首先新建一个文件夹存放cmake
mkdir app
cd ./app
wget https://cmake.org/files/v3.5/cmake-3.5.1.tar.gz
1-2 解压源码包
tar xzvf cmake-3.5.1.tar.gz
1-3 安装cmake
进入camke目录
cd cmake-3.5.1
依次运行以下命令
./bootstrap
make
make install
1-4 查看安装版本
cmake --version
2 安装opencv
2-1 下载opencv安装包并整理层次
这里参考 这篇博客 提供的源文件下载地址:
git clone https://github.com/Itseez/opencv.git
git clone https://github.com/Itseez/opencv_contrib.git
(如果服务器上下载慢的话,建议本机下载完打包 scp 传输上去)
下载好两个文件夹后,将 opencv_contrib 文件夹移至 opencv 文件夹下。
2-2 添加依赖库
opencv 编译过程需要用到依赖库,所以这一步是必须的
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
# 可选安装
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
2-3 开始编译
1、进入 opencv 目录,创建一个 build 目录并进入目录
cd opencv
mkdir build
cd build
2、创建安装目录
并记住它,后文安装过程需要用到
mkdir /usr/local/opencv
或你也可以带上版本号
mkdir /usr/local/opencv-4.5.3
(当前你应该还在 ………/opencv/build 目录下)
3、进行 cmake 配置
对以下 cmake 语句进行修改,注意末尾的两个点不能省略,执行该语句:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv【这里改为上一步创建的安装目录】 -D WITH_TBB=ON -D WITH_CUDA=ON -D OPENCV_GENERATE_PKGCONFIG=YES -D BUILD_SHARED_LIBS=ON -D WITH_OPENMP=ON -D ENABLE_PRECOMPILED_HEADERS=OFF -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_EXTRA_MODULES_PATH=……/opencv/opencv_contrib/modules【这里改为前面瞎子啊的源码中的 /opencv/opencv_contrib/modules 位置】 ..
这一步执行时间可能比较长,等待就好
4、进行编译安装
sudo make -j8 # 这里是允许多少个cpu同时进行编译,可以自己选择 -j4、-j8、…
这一步过程里如果出现如下提示:
error:cout’was not declared in this scope
则前往对应文件(ctrl+点击文件位置)在开头添加如下:
#include <iostream>
using namespace std;
5、完成后再执行
sudo make install
6、查看
完成后前往安装目录下的 lib 目录,会有类似下图的很多文件与 pkgconfig 目录:
3 配置环境
打开以下文件:
sudo vim /etc/ld.so.conf.d/opencv.conf
在文件中加上opencv的安装位置:
/usr/local/opencv/lib【改为前文安装位置下的lib目录位置】
然后执行语句:
sudo ldconfig
打开系统环境变量文件:
sudo vim /etc/bash.bashrc
在文件后添加:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv/lib/pkgconfig【这里改为前文安装目录下的/lib/pkgconfig位置】
export PKG_CONFIG_PATH
然后执行,使用环境变量生效:
source /etc/bash.bashrc
4 检查安装是否成功
前往 安装目录下的 lib/pkgconfig 目录,查看是否有一个 opencv4.pc 文件,将其改名为 opencv.pc 即可。
使用以下语句查看版本号:
pkg-config opencv --modversion
显示如下即成功:
5 使用CMakeLists.txt编译运行代码
5-1 在代码同目录下创建 CMakeLists.txt ,示例如下:
cmake_minimum_required(VERSION 2.8)
project(test) # 生成可执行程序名称
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(OpenCV_DIR "……/opencv/build") # 前文安装opencv时创建的build目录路径(不是以/usr开头的安装目录)
find_package(OpenCV REQUIRED)
# 打印 OpenCV 相关变量信息 可不用
message(STATUS "OpenCV library status:")
message(STATUS " config: ${OpenCV_DIR}")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
INCLUDE_DIRECTORIES(
${PROJECT_SOURCE_DIR}
${OpenCV_INCLUDE_DIRS}
) # 导入 opencv 库文件
add_executable(${PROJECT_NAME} "main.cpp") # 待编译的代码文件
target_link_libraries(
${PROJECT_NAME}
${OpenCV_LIBS}
) # 链接 opencv 库
5-2
在 CMakeLists.txt 所在目录下创建一个目录 build(名字任意),在该目录下执行
cmake ..
出现类似这样的结果
……(中间会列出库文件,省略)
则成功完成。
5-3
再执行
make
如图,则已成功生成可执行文件。
在目录下可以找到生成的可执行文件 如:test (名字同 CMakeLists 中设置的项目名称)
5-4
执行可执行文件即可。
./test
5-5 在cmake、make步骤遇到过的问题
1、部份是由于在编译opencv库时,cmake步骤参数遗漏的缘故。
如遇到过提示缺少 OPENCV_ENABLE_NONFREE 的错误,就需要返回编译opencv步骤,在cmake语句中加上 -D OPENCV_ENABLE_NONFREE=ON 。
(前文的语句中已经补上)
2、部份是opencv不同版本库中同一动作的语句不同。
如此处特征寻找器的定义,上下分别是3.x、4.x版本的定义方法:
其他语句也存在不同,可前往自行查找
opencv3.x版本使用示例指路:
https://docs.opencv.org/3.4.4/d9/dd8/samples_2cpp_2stitching_detailed_8cpp-example.html opencv4.x版本使用示例指路:
https://docs.opencv.org/4.0.0/d9/dd8/samples_2cpp_2stitching_detailed_8cpp-example.html