Ubuntu 16.04 编译安装 opencv-3.4.4 & opencv_contrib-3.4.4

最近需要在 Linux 下 Python 和 C++ 混合编程,然后发现 C++ 没有安装  OpenCV 的库,然后出此安装教程。

推荐安装 3.4.4 版本(稳定),不推荐安装更高版本的 opencv。

opencv_contrib 是 opencv 的扩展模块,包含了有很多我们经常要用的算法,比如SIFT,SURF等(在xfeatures2d 模块里边),推荐安装。

Windows 系统编译安装 opencv 见:Win10 编译安装 opencv-3.4.4 & opencv_contrib-3.4.4

1. 准备过程

环境:Ubuntu 16.04
opencv-3.4.4 源码下载:https://github.com/opencv/opencv/archive/3.4.4.tar.gz
opencv_contrib-3.4.4 源码下载:https://github.com/opencv/opencv_contrib/archive/3.4.4.tar.gz

下载好后,放在同一目录下,分别解压

$ tar -zxvf opencv-3.4.4.tar.gz
$ tar -zxvf opencv_contrib-3.4.4.tar.gz

将 opencv_contrib-3.4.4 移动到 opencv-3.4.4

$ mv opencv_contrib-3.4.4 opencv-3.4.4

2.安装依赖

$ 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

3.cmake 过程

此过程生成Makefile文件,以便编译源码

创建并进入 build 文件夹

$ cd opencv-3.4.4
$ mkdir build
$ cd build

生成 opencv 或者 opencv_contrib 的 Makefile 文件(下面命令二选一)

# 若需同时安装 opencv 和 opencv_contrib,执行下面命令
$ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.4.4/modules/ ..

# 若只安装 opencv,执行下面命令
$ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
cmake 完成后显示图

4.make 过程

运用多线程编译,先查看 CPU 有多少线程

$ nproc
32 线程

在 build 目录下,编译源码

# 32 线程同时编译
$ sudo make -j32
等待一小会

5.安装过程

在 build 目录下直接执行 make 安装命令

$ sudo make install
安装过程

6.配置环境变量

opencv 配置文件目录

$ sudo vim /etc/ld.so.conf.d/opencv.conf

添加 /usr/local/lib

使配置生效

$ sudo ldconfig

环境变量设置

$ sudo vim /etc/bash.bashrc

最后一行添加

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

使配置生效

$ source /etc/bash.bashrc

7.检查是否安装成功

安装好后,我们查看一下 opencv 版本

$ pkg-config --modversion opencv
$ pkg-config --cflags opencv

8.卸载方法

建议保留 opencv 源码和 build 文件夹,方便以后需要卸载的情况,如需卸载,在 build 目录下执行

$ sudo make uninstall

9. 示例代码

我们编写一个角点检测的代码,并编译它

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;

int main()
{
	Mat srcImage = imread("1.jpg", 0);
	imshow("原始图", srcImage);

	Mat cornerStrength;
	cornerHarris(srcImage, cornerStrength, 2, 3, 0.01);

	Mat harrisCorner;
	threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY);

	imshow("角点二值图", harrisCorner);

	waitKey(0);
	return 0;
}

将代码命名为 mian.cpp,我们直接用 g++ 编译它

$ g++ -o main main.cpp `pkg-config opencv --cflags` `pkg-config opencv --libs`
main 就是编译生成的文件

我们随便拖一个图片到文件夹,并且命名为 1.jpg,因为代码里这样命名的,执行 ./main 运行测试程序

$ ./main
测试通过

再回过头来,我们分析一下 g++ 的编译命令

其中 pkg-config opencv –cflags 指定我们要包含的头文件目录,也就是

pkg-config opencv –libs 指定我们的 opencv 库文件目录,即

其实,它们都定义在 /usr/local/lib/pkgconfig/opencv.pc 中

发表评论

您的电子邮箱地址不会被公开。