[TOC]
OpenCV 简介
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法(最基本的滤波到高级的物体检测皆有涵盖)。
OpenCV 是跨平台的,可以在 Windows、Linux、Mac OS、Android、iOS 等操作系统上运行。
OpenCV 的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。
OpenCV 还提供了机器学习模块,你可以使用正态贝叶斯、K最近邻、支持向量机、决策树、随机森林、人工神经网络等机器学习算法。
更多 OpenCV 介绍请参考百度百科:https://baike.baidu.com/item/opencv/10320623
编译环境要求
本次编译安装基于
CentOS release 6.5 (Final)
. 建议开始之前查看各个依赖版本是否符合要求, 下列是主要的依赖:
- GCC 4.8.x or higher - GCC 升级
- CMake 3.5.x or higher - CMake 升级
- Python 2.7.x or higher - Python 升级
- 注意
JDK
版本要与运行的jar
包版本一致! - 设置临时JAVA环境变量
一. 下载 opencv 源码
1 | git clone https://github.com/opencv/opencv |
二. 编译及依赖安装
1. 安装依赖项目
1 | yum install cmake gcc gcc-c++ gtk+-devel gimp-devel gimp-devel-tools gimp-help-browser zlib-devel libtiff-devel libjpeg-devel libpng-devel gstreamer-devel libavc1394-devel libraw1394-devel libdc1394-devel jasper-devel jasper-utils swig python libtool nasm build-essential ant |
- 其中需要注意的是
build-essential
在centOS
通过下面的方式来安装yum groupinstall "Development Tools"
2. 配置 opencv
编译选项
1 | cd opencv |
cmake
完成后注意查看报告中的To be built:
行后有无java
支持, 没有的话排查报告中的排查python
与java
项目是否正常,ant
建议1.9.*
版本,python
必须2.7
或以上版本.
3. 编译 opencv
- 编译, 需要半小时左右
1
make -j2
- -j2 同时使用 2 个线程编译, 可以自己测试用几个线程, 单核服务器开两个刚好把
cpu
跑满. - 在
centos6
上编译,gcc
版本得在4.8.5
或以上. - 在
centos6
上编译opencv 3.4.4
以上版本时会出现opencv error: ‘V4L2_CID_ISO_SENSITIVITY’ was not declared in this scope
这类错误,在centos6
暂时上无法解决只能在cmake
时加入-D WITH_V4L=OFF
命令在编译时关掉v4l2
功能或者尝试编译3.4.3
版本,原因见 issue
- -j2 同时使用 2 个线程编译, 可以自己测试用几个线程, 单核服务器开两个刚好把
- 安装
1
sudo make install
- 依赖配置
1
2
3# 复制 `so` 文件, 一定要把 `so` 文件复制过去, 不然 `jar` 找不到依赖, 类似 `windows` 下的 `dll`, 也可以把该目录加到环境变量中
cd /usr/local/opencv/4.1.0/share/java/opencv4
cp libopencv_java410.so /usr/lib
三. 测试运行
1. 下载依赖 jar
至本地
- 将
/usr/local/opencv/4.1.0/share/java/opencv4
下的opencv-410.jar
下载到本地.
2. 将依赖 jar
安装至本地 maven
仓库:
1 | # 已添加到公司私有 Maven 仓库 |
3. 新建一个测试 demo
项目
- 添加依赖
1
2
3
4
5
6<!-- 添加 opencv 依赖 -->
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>opencv-linux</artifactId>
<version>4.1.0</version>
</dependency> jaca
测试代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public class OpenCvDemo {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) {
if ((1==args.length) && (0==args[0].compareTo("--build"))) {
System.out.println(Core.getBuildInformation());
} else
if ((1==args.length) && (0==args[0].compareTo("--help"))) {
System.out.println("\t--build\n\t\tprint complete build info");
System.out.println("\t--help\n\t\tprint this help");
} else {
System.out.println("Welcome to OpenCV " + Core.VERSION);
}
}
}- 打包时把依赖
jar
加进去1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.xweba.opencv.OpenCvDemo</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- 指定在打包节点执行jar包合并操作 -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>4. 将
demo
包上传至服务器运行测试:1
2
3
4
5[root@host opencv4]# cd ~/opencv/samples/java/
[root@host java]# java -jar opencv-demo-0.0.1-jar-with-dependencies.jar
Welcome to OpenCV 4.1.0-dev
// --buidl 查看OpenCV环境信息
[root@host java]#java -jar opencv-demo-0.0.1-jar-with-dependencies.jar --build
[注] 可能会遇到的报错及解决方法
1. cmake
相关
a. cmake
配置命令报错
- 错误信息:
1
2CMake Error: The source directory "/root/opencv/build/CMAKE_INSTALL_PREFIX=/usr/local/opencv/4.1.0" does not exist.
Specify --help for usage, or press the help button on the CMake GUI. - 解决方法:
1
2把`-D` 后的空格都去掉
cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local/opencv/4.1.0 ..b.
cmake
版本过低 - 错误信息:
1
2
3
4[root@host build]# cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local/opencv/4.1.0 ..
CMake Error at CMakeLists.txt:29 (cmake_minimum_required):
CMake 3.5.1 or higher is required. You are running version 2.8.12.2
-- Configuring incomplete, errors occurred! - 解决方法升级
cmake
: cmake 升级到 cmake-3.9.2 版本c.
cmake
时ant
启动报错 - 错误信息:
1
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/tools/ant/launch/Launcher
- 解决方法:
1
2
3
4
5#添加 ant 环境变量
vim /etc/profile
export ANT_HOME=/usr/share/ant/
export CLASSPATH=$CLASSPATH:$CLASSPATH:$ANT_HOME/lib
source /etc/profiled.
由于它资源是在cmake
时卡在download ippicv_2019_lnx_intel64_general_20180723.tgz
github
上的, 可能有点慢, 可以自行去 github 上下载至本地, 然后:1
2vim ~/opencv/opencv-master/3rdparty/ippicv/ippicv.cmake
"file:///root/opencv/" #47行修改为本地文件, 再次 cmake
2. make
相关
a. gcc
无法识别命令行
- 错误信息 :
1
2
3
4
5
6cc1plus: 警告:命令行选项“-Wmissing-prototypes”对 Ada/C/ObjC 是有效的,但对 C++ 无效
cc1plus: 警告:命令行选项“-Wstrict-prototypes”对 Ada/C/ObjC 是有效的,但对 C++ 无效
cc1: 警告:无法识别的命令行选项“-Wno-implicit-fallthrough”
cc1: 警告:无法识别的命令行选项“-Wno-maybe-uninitialized”
cc1: 警告:无法识别的命令行选项“-Wno-unnamed-type-template-args”
cc1: 警告:无法识别的命令行选项“-Wno-delete-non-virtual-dtor” - 解决办法 : gcc 版本过低, 至少 4.8.x 或以上:
- 升级
gcc
报错:原因是多个库不能共存1
2
3Error: Protected multilib versions: libgcc-4.8.2-8.el6.x86_64 != libgcc-4.4.7-23.el6.i686
You could try using --skip-broken to work around the problem
** Found 34 pre-existing rpmdb problem(s), 'yum check' output follows: - 解决方法:
- 来源: https://blog.csdn.net/chenxin2tj/article/details/79950904
1
yum install gcc gcc-g++ -y --setopt=protected_multilib=false
b. 编译
cpp
时错误
- 来源: https://blog.csdn.net/chenxin2tj/article/details/79950904
- error: ‘Z_FIXED’
- 解决方法: 在
grfmt_png.cpp
中添加#define Z_FIXED 4
. 来源: Python3 opencv3编译
- 解决方法: 在
- error: ‘tmsize_t’
- 解决方法一: 在
cmake
时添加-DBUILD_TIFF=ON
. 来源: Python3 opencv3编译 - 解决方法二:
yum remove libtiff-dev
把libtiff-dev依赖卸载,让opencv使用3rdparty内的libtiff去编译, 来源: CentOS 6.9 安装OpenCV 3.4.4
- 解决方法一: 在
- error: ‘V4L2_CID_ISO_SENSITIVITY’
- 解决方法: 在
cmake
时添加-DWITH_V4L=OFF
. 来源: CentOS 6.9 安装OpenCV 3.4.4
- 解决方法: 在
c. make
编译时内存不够
错误信息:
1
2
3
4
5
6c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
make[2]: *** [modules/CMakeFiles/ade.dir/__/3rdparty/ade/ade-0.1.1d/sources/ade/source/passes/communications.cpp.o] Error 4
make[2]: *** Waiting for unfinished jobs....解决方法开启
swap 交换空间
: linux 创建 swap 交换空间3.
make
后a. 无
java
模块检查
cmake
结果中python
与java
项是否正常1
2
3
4
5
6
7-- Python (for build): NO
--
-- Java:
-- ant: /usr/share/ant/bin/ant (ver 1.9.13)
-- JNI: /usr/local/jdk1.8/jdk1.8.0_91/include /usr/local/jdk1.8/jdk1.8.0_91/include/linux /usr/local/jdk1.8/jdk1.8.0_91/include
-- Java wrappers: NO
-- Java tests: NO检查
python
版本, 需要python2.7
及以上版本- 升级
python
: Linux Python 2.6 升级至 2.7
- 升级
4. 执行出错
OpenCV
的编译 JDK
版本与运行 jar
包的编译版本不一致会导致执行出错, 错误日志:
1 | java.lang.UnsatisfiedLinkError: org.opencv.imgcodecs.Imgcodecs.imread_1(Ljava/lang/String;)J |
1 | Exception in thread "main" java.lang.UnsupportedClassVersionError: org/opencv/core/Core : Unsupported major.minor version 52.0 |
此时需要更改环境变量后重新编译 OpenCV
.
将下列环境变量写入 /etc/profile
永久生效,直接在 shell
中执行临时生效 , 操作完后重新 make
:
1 | JAVA_HOME=/home/icampus3.0/jdk8 |
ps: windows
端启动配置指定 dll
位置 -Djava.library.path=D:\OpenOCR\4.1.0\build\java\x64
或将该路径加入环境变量