Ubuntu下Opencv的编译、安装与调用

开发环境

  • Ubuntu 16.04 64位
  • Opencv 2.4.13(或者其他版本,同样适用于Opencv3)

准备

下载

此处下载源文件,这里要选择Sources,用于编译

添加opencv所需要的依赖库

1
2
3
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

创建build文件夹

1
2
mkdir build
cd build

编译

开始编译,执行(注意后面的两个点不能少):

1
cmake -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_BUILD_TYPE=Release -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ..

若不想编译cuda版本的opencv,则改为

1
cmake -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_BUILD_TYPE=Release -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules -D WITH_CUDA=OFF ..

编译结果为:

接下来,执行:

1
make -j8

得到的结果为:

到了这个时候,如果仅仅只需要在Python或者C中使用OpenCV,就可以直接执行下一步了,如果需要在java中使用OpenCV,需要修改一些源文件。编辑features2d_manual.hpp文件,目录文件在/modules/features2d/misc/java/src/cpp中。

具体修改:

在第8行,在#include "features2d_converters.hpp"添加#include "opencv2/xfeatures2d.hpp"

在第121行,将

1
2
3
4
5
6
//case SIFT:
// name = name + "SIFT";
// break;
//case SURF:
// name = name + "SURF";
// break;

改为

1
2
3
4
5
6
//case SIFT:
// fd=xfeatures2d::SIFT::create();
// break;
//case SURF:
// fd=xfeatures2d::SURF::create();
// break;

在第248行,将

1
2
3
4
5
6
//case SIFT:
// name = name + "SIFT";
// break;
//case SURF:
// name = name + "SURF";
// break;

改为

1
2
3
4
5
6
case SIFT:
de = xfeatures2d::SIFT::create();
break;
case SURF:
de = xfeatures2d::SURF::create();
break;

在第257行,将

1
2
3
//case BRIEF:
// name = name + "BRIEF";
// break;

改为

1
2
3
case BRIEF:
de = xfeatures2d::BriefDescriptorExtractor::create();
break;

在第263行,将

1
2
3
//case FREAK:
// name = name + "FREAK";
// break;

改为

1
2
3
case FREAK:
de = xfeatures2d::FREAK::create();
break;

修改完毕。

接下来,执行:

1
sudo make install

编译结果为:

这样,我们就可以在Ubuntu中使用Opencv了,适用于各种语言。

我们可以在/usr/local/lib下看见opencv编译的结果:

配置环境

对于C++调用C++的时候,出现了如下错误

1
./resize: error while loading shared libraries: libopencv_highgui.so.3.4: cannot open shared object file: No such file or directory

解决办法:
1)修改ld的配置文件

1
sudo gedit /etc/ld.so.conf

加入

1
include /usr/loacal/lib

注(/usr/loacal是opencv编译时设置的路径)

2) 再运行ldconfig

1
sudo ldconfig

3) 永久生效
修改bash.bashrc文件

1
sudo vim /etc/bash.bashrc

在文件末尾加入:

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

或者在/etc/ld.so.conf.d/下面新建一个opencv.conf,里面写入/usr/local/lib,最后执行下sudo ldconfig -v即可。

调用

Python

直接导入cv2的库就可以啦

1
import cv2

这里面编译的时候要注意Python2和Python3的区别,Python2编译的opencv在Python3中是不可以使用的。

C++

对于QT

pro文件中添加

1
2
3
4
5
6
7
INCLUDEPATH += \
/usr/local/include \
/usr/local/include/opencv \
/usr/local/include/opencv2 \

LIBS += \
/home/fanxuan/opencv/build/lib/libopencv_java331.so \

普通C++程序

首先简单说下pkg-config命令,pkg-config当你从源代码编译软件时,用来提供依赖库的信息的软件

终端输入

1
pkg-config opencv --libs --cflags

显示

就可以看到编译和链接所需要的头文件目录和库文件目录。
如果发现不正确,可以修改/usr/local/lib/pkgconfig/opencv.pc文件,这个文件就是opencv的目录配置,目录截图为:

这个文件就记录着opencv库的版本、编译参数、链接参数等信息

根目录下,具有几个文件,tcp_client.cpptcp_client.hmain.cpp

Makefile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CC = gcc
INCLUDE = $(shell pkg-config --cflags opencv)
LIBS = $(shell pkg-config --libs opencv)
OBJS = tcp_client.o main.o
TARGET = cacu
RM = rm -f

$(TARGET):$(OBJS)
$(CC) -o $(TARGET) $(OBJS) -lstdc++ -I $(INCLUDE) $(LIBS)

$(OBJS):%.o:%.cpp
$(CC) -c $< -o $@ -lstdc++

clean:
$(RM) $(TARGET) $(OBJS)

Java

我说使用的是IDEA,将opencv/build/lib目录设置在IDEA设置位jvm的运行空间即可。

参考

OpenCV - Linux(Ubuntu 16.04)中安装OpenCV + OpenCV_Contrib
ubuntu 编译运行 opencv C++ 项目
Ubuntu下程序的编译和链接过程和openCV的makefile文件

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道