最近需要在 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 ..
4.make 过程
运用多线程编译,先查看 CPU 有多少线程
$ nproc
在 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`
我们随便拖一个图片到文件夹,并且命名为 1.jpg,因为代码里这样命名的,执行 ./main 运行测试程序
$ ./main
再回过头来,我们分析一下 g++ 的编译命令
其中 pkg-config opencv –cflags 指定我们要包含的头文件目录,也就是
pkg-config opencv –libs 指定我们的 opencv 库文件目录,即
其实,它们都定义在 /usr/local/lib/pkgconfig/opencv.pc 中