macOS和Linux上手动编译OpenCV并作为依赖添加到Python/C++/Java

本文最后更新于:2021年11月15日 上午

嘿嘿,封面嗷

OpenCV

OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。
OpenCV也广泛运用于图片识别、图片处理等场景,被称为“计算机视觉”,本次教程,就教大家多种方法部署OpenCV嗷。

使用场景

OpenCV的使用场景很多,包括但不限于:

  • 增强现实
  • 人脸识别
  • 手势识别
  • 人机交互
  • 动作识别
  • 运动跟踪
  • 物体识别
  • 图像分割

具体使用

OpenCV其实就是一个C++的库,但是Python和Java也是有接口可以进行调用。本次教程,就交大家编译安装openCV的C++库,大家也可以根据自己需求,选择是否编译Python和Java的接口。

Python内,其实可以用pip直接安装的嗷。本文就不介绍了,主要讲解手动编译配置

本次演示

本次演示,是在macOS和Linux上编译并安装OpenCV,Windows不在本教程范围内

Linux上,使用腾讯云轻量应用服务器,不管是CentOS还是Debian都可以安装,但是最好提前更新一次软件源:

1
2
3
4
5
6
# Debian/Ubuntu
apt update
apt upgrade
# CentOS
yum update
yum upgrade

环境依赖

编译OpenCV需要添加一些依赖,否则无法编译或Cmkae自动配置。这里我初略分为必要依赖和模块依赖:

  • 必要依赖:编译OpenCV时一定需要的依赖。
  • 模块依赖:编译OpenCV时候,选择的依赖;如:需要对Java提供支持,需要安装ant

一些可选支持,比如:libpng包、libjepg包等等,这里也不做详细说明嗷。

必要依赖

这里的必要依赖为GCC和Cmake,否则无法进行编译。在Linux上安装GCC和Cmake,根据发行版本的不同:

1
2
3
4
5
6
7
# Debian/Ubuntu版本
sudo apt-get install build-essential
sudo apt-get install cmake

# CentOS发行版本
sudo yum install gcc gcc-c++
sudo yum install cmake

如:使用腾讯云轻量应用服务器的CentOS镜像:

腾讯云的CentOS镜像

对于macOS,也很简单,给两种方法:

  • 【推荐】安装Homebrew的情况下,安装cmake即可。
  • 安装Xcode或XcodeXcode Command Line Tools(这样就有GCC),之后安装cmake GUI,并配置cmake GUI的cmake进环境变量。

安装了GCC和Cmake

模块依赖

(本来想一个小目录里写完的。写了之后,还是觉得这里简单说一下,下文详解……)

模块依赖,就是你需要把OpenCV作为依赖,添加到具体什么语言的开发环境。举例:

  • Python2&Python3:需要指定Python的安装路径,并在系统变量内,指明lib地址。
  • Java:需要指明JAVA_HOME,需要ANT的支持。

对其功能,一些特定依赖不赘述。(比如:ffmpeg)

OpenCV源码

我们进入OpenCV的官网:https://opencv.org,找到Source Forge选项:

Source Forge

并下载源码。你也可以直接到GitHub上下载源码或历史版本、标签。

需要注意⚠️:如果你的腾讯云轻量应用服务器和我一样,下载GitHub上OpenCV很慢,你可以试试Gitee镜像,下面就演示,在腾讯云轻量应用服务器上下载4.5.3版本OpenCV源码:

1
git clone -b 4.5.3 https://gitee.com/mirrors/opencv

下载源码到/usr/local/src

Cmake预编译

下载好了OpenCV的源码,接下来我们使用Cmake进行预编译,进入OpenCV源码目录,输入:

1
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr/local/opencv

其中:

  • DCMAKE_INSTALL_PREFIX:OpenCV的安装地址,这里选择安装到/sur/local/opencv里。

之后,就会开始“跑码”预编译生成build文件夹和Markfile文件:

cmake预编译

但是这样,我们后续编译只能安装Python2(系统)和C++的支持,无法支援到Python3和java。

接下来,就教大家怎么添加Python3和java依赖。

重头戏来了嗷

添加依赖

要添加对Java或者Python的依赖,就需要重新预编译。所以,你需要删除刚刚预编译出来的build文件夹:

1
rm -rf build

Java

Java的配置很简单,首先是安装并配置JDK,尤其是是配置JAVA_HOME,如:

1
2
3
4
5
# Java11
JAVA_HOME="$HOME/myEnvironment/ZuluJDK11"
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin/
export PATH JAVA_HOME CLASSSPATH

我配置的JDK

如果你不知道怎么在Linux和macOS上配置JDK,可以参考我之前的视频教程:

需要特别注意⚠️,如果你的macOS或者Linux,配置了jenv,那么jenv的配置需要在JDK配置之前,比如我macOS本地就有配置jenv,需要这样编写环境变量:

jenv配置在JDK配置之前

之后,还需安装ANT,方法也很多,最简单的是用软件包管理器安装:

1
2
3
4
5
6
# macOS 
brew install ant
# Debian/Ubuntu
sudo apt-get install ant
# CentOS
sudo yum install ant

比如:我在腾讯云轻量应用服务器的Debian系统上安装ANT:

Debian上安装ANT

安装好后,我们还是需要设置ANT_HOME,否则OpenCV编译时候无法读取,软件包安装的ANT:

  • /usr/share/ant: Linux通过软件包安装ant地址(腾讯云轻量应用服务器)
  • /usr/local/Cellar/ant/{ant_version}:macOS通过Homebrew安装

配置ANT(Linux)

注:macOS上,通过Homebrew安装的ant,应该是不用配置ANT_HOME,Homebrew会自动配置。

你也可以进入ant的源码下载页面:https://ant.apache.org/bindownload.cgi,手动配置到环境变量:

1
2
3
4
# ANT
ANT_HOME=$HOME/myEnvironment/ant
PATH=$PATH:$ANT_HOME/bin
export ANT_HOME PATH

之后,再到OpenCV源码内,重新预编译即可:

重新编译

可以看到,这样的预编译,就有JDK支持了。

Python3

Python3的部署,会复杂一些。我建议不要动系统的Python3,macOS和Linux都安装Anaconda,用Anaconda的Python3比较好。macOS的Anaconda,还是和上文一样,可以用Homebrew安装:

1
2
# macOS
brew install anaconda

当然,也可以和Linux一样,使用Anaconda的脚本:

官网可能对大陆服务器不是很友好,可以用清华镜像下载源:

清华镜像源

安装方法很简单:下载脚本后,用默认的Shell运行即可;如:

安装anaconda

我的安装地址是/root/anaconda3,所以再配置一下环境变量:

anaconda配置

配置成功

之后,我们就来配/root/anaconda3/bin/python3这个Python3:

重新运行cmake:

1
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr/local/opencv -D BUILD_opencv_python3=ON -DPYTHON_DEFAULT_EXECUTABLE=/root/anaconda3/bin/python3

其中:

  • DCMAKE_INSTALL_PREFIX:OpenCV安装地址。
  • BUILD_opencv_python3:激活Python3
  • DPYTHON_DEFAULT_EXECUTABLE:指定Python3地址

cmake预编译

Make编译

现在,我们就可以正式开始编译了:

1
2
3
4
# 进入build目录
cd build
# make编译
make -j{N}

其中,{N}取决于你有几个CPU、几个线程,比如:我的MacBook Pro:

12线程编译

但是,我买的腾讯云轻量应用服务器,是2C 4G的;所以,这里使用:

2线程编译

等待编译好后,进行安装即可:

1
make install

安装

又是一段“跑码“,OpenCV就安装好了。

安装完成

这样编译好了,我们怎么在开发环境使用呢?下面看看怎么使用。

导入Python

首先我们看看怎么导入到Python,在未导入前,是这样的:

导入失败

主要是,我们的OpenCV对应编译的Python3库文件地址在:/usr/local/opencv/lib/python3.8/site-packages/cv2(也就是OpenCV安装目录下的lib文件夹):

库文件

而我们Python3的库文件在/root/anaconda3/lib/python3.8/site-packages

Python的库

所以,我们需要建立软链接:

1
2
3
4
5
6
# 复制so文件
cp /usr/local/opencv/lib/python3.8/site-packages/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so /usr/local/opencv/lib/python3.8/site-packages/cv2/python-3.8/cv2.so
# 软链接so文件
ln -s /usr/local/opencv/lib/python3.8/site-packages/cv2/python-3.8/cv2.so /root/anaconda3/lib/cv2.so
# 软链接cv2包
ln -s /usr/local/opencv/lib/python3.8/site-packages/cv2 /root/anaconda3/lib/python3.8/site-packages/cv2

之后,在Python内就可以使用了:

Python3中使用

当然,macOS也可以这样编译安装OpenCV。
但是如果是本地用PyCharm开发的,那么我们编译的OpenCV,没有data说明文件,PyChram是没有提示文件的哦~

导入C++

因为我并没有在腾讯云轻量应用服务器上进行过C++的项目开发,所以我就在macOS上演示,使用Clion,这里创建空项目:

HelloOpenCV

之后,进入项目,编辑CMakeLists文件,原本是这样:

还未添加OpenCV

之后添加:

添加依赖

方便大家复制和更改:

1
2
3
4
5
6
7
8
9
10
11
12
cmake_minimum_required(VERSION 3.19)
project(HelloOpenCV)
set(CMAKE_CXX_STANDARD 14)

add_executable(HelloOpenCV main.cpp)
find_package(OpenCV)

include_directories(${OpenCV_INCLUDE_DIRS})

set(CMAKE_CXX_STANDARD 11)

target_link_libraries(HelloOpenCV ${OpenCV_LIBS})

之后,我们写个测试文件看看效果:

测试代码

测试成功

导入Java

最后,我们看看怎么导入到Java,前置条件:

  • 预编译时,需要通过Java编译

前置条件

如果没有满足前置条件,需要删除卸载OpenCV并删除build文件夹重新配置并编译。

满足前置条件情况下,在OpenCV安装目录下,会出现share文件夹,其中的java文件夹就是我们需要用到的。

打开java文件夹:

文件夹内

提取里面的.jar和库文件,并导入到项目内,如:

导入maven

最后,点击项目结构,添加libopencv_java453.dylib这个文件作为lib库。

不过,比较奇怪的是,我这里报的信息有些奇怪,可能是我JDK版本的问题,建议大家用JDK8:

运行信息

卸载OpenCV

卸载OpenCV很简单,我们重新进入OpenCV源码目录内的build文件夹,运行:

1
make uninstall all

之后,OpenCV就会自动卸载完成:

卸载OpenCV

如果你已经删除源码文件夹,可以直接删除OpenCV编译安装目录,本文是:/usr/local/opencv

END

哈哈,居然被你滑到底部了?怎么样,OpenCV的安装是不是很简单?有问题可以评论区留言嗷~也欢迎进入我的博客了解更多Unix和GUN有关的内容~

嘿嘿,到底了嗷


若对文章很感兴趣,可以B站关注我ヾ(≧▽≦*)o

点击跳转“爱发电”页面(○` 3′○)