ubuntu20.04编译opencv-2.4.12

ubuntu20.04编译opencv-2.4.12,与opencv349共存

7月7日:由于需要对struck目标跟踪算法进行评估,而struck算法的官方实现需要用到两个指定版本的库,分别是Opencv 2.4.12以及Eigen3.2.6,所以需要在ubuntu20.04环境下额外编译opencv-2.4.12(以下简称opencv2412)。花了一天时间寻求解决办法,这个过程还是比较麻烦,现将自己踩过的坑记录如下。

首先,假设我们已经安装了一个opencv 3.4.9的版本。且ubuntu上面有cmake-gui工具。如果没有,可以利用sudo apt install cmake-qt-gui来安装cmake-gui。

准备工作

  1. 下载opencv2412 source code. 下载地址:https://github.com/opencv/opencv/archive/2.4.12.zip,比如我们下载到~/software目录下,然后解压到当前目录,并在~/software/opencv-2.4.12目录下新建一个sources文件夹,将其他的文件和文件夹全部放在sources文件夹下面。并在sources文件的同级目录新建一个build文件夹,如下图所示:

ubuntu20.04编译opencv-2.4.12_第1张图片

sources文件夹目录如下:

ubuntu20.04编译opencv-2.4.12_第2张图片

降级gcc为4.8版本

ubuntu20.04自带的gcc g++版本为9.3,对opencv2412的编译是不适用的。最开始我打算用mingw工具来额外安装gcc 4.8,但发现无效,没有对应的源。 这里介绍两个重要的命令,分别是
sudo apt-cache madison package_name,这是查看可安装的package_name的版本。以及sudo apt install package_name=verison_num这是安装指定版本的package_name。接下来我们会详细列举。

实际上我猜测Opencv2412最适合的编译器应该是gcc5 g++5,但通过apt-cache medison命令也没有gcc5的源,如下图:

ubuntu20.04编译opencv-2.4.12_第3张图片

可以看到,这里只有两个版本,分别是9.3.04.8.2,在这里我又想,可否直接install gcc5。命令如下:

$sudo apt install gcc-5
# 下列软件包有未满足的依赖关系:
# gcc-5 : 依赖: cpp-5 (= 5.4.0-6ubuntu1~16.04.12) 但是它将不会被安装
#         依赖: libisl15 (>= 0.15) 但无法安装它
#         依赖: libmpfr4 (>= 3.1.3) 但是 3.1.2-1 正要被安装
#E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

可以发现,直接安装gcc-5可能破坏软件包的依赖关系。于是我想能否利用gcc4.8对opencv2412进行编译。于是,我安装了gcc4.8.2和g++4.8.2,命令如下:

$ sudo apt install gcc=4:4.8.2-1ubuntu6
$ sudo apt install g++=4:4.8.2-1ubuntu6
$ cd /usr/bin
$ ll | grep gcc-4.8
# lrwxrwxrwx  1 root root           7 4月   8  2014 gcc -> gcc-4.8*
# -rwxr-xr-x  1 root root      775888 4月   5  2014 gcc-4.8*
# lrwxrwxrwx  1 root root           7 4月   8  2014 x86_64-linux-gnu-gcc -> gcc-4.8*
# lrwxrwxrwx  1 root root           7 4月   5  2014 x86_64-linux-gnu-gcc-4.8 -> gcc-4.8*
$ ll | grep g++-4.8
# lrwxrwxrwx  1 root root           7 4月   8  2014 g++ -> g++-4.8*
# -rwxr-xr-x  1 root root      775888 4月   5  2014 g++-4.8*
# lrwxrwxrwx  1 root root           7 4月   8  2014 x86_64-linux-gnu-g++ -> g++-4.8*
# lrwxrwxrwx  1 root root           7 4月   5  2014 x86_64-linux-gnu-g++-4.8 -> g++-4.8*

可以看到,此时的gcc和g++已经链接到了gcc-4.8和g++4.8版本了。此时读者不必担心一个问题,原来ubuntu上的g++9和gcc9都还在,如果没有可以利用以下两个命令安装:

$ sudo apt install gcc-9
$ sudo apt install g++-9
# 不会覆盖默认的编译器

编译opencv2412前的准备工作

3.1 确保计算机上安装了eigen库,用如下命令安装

$ sudo apt install libeigen3-dev
# 安装地址应该是在/user/include/eigen3 或者 /user/local/include/eigen3
$ sudo cp -r /usr/include/eigen3/Eigen /usr/include
# 将eigen3里面的Eigen文件夹复制到/usr/include文件夹

3.2 修改opencv2412的一个头文件内容:/path/to/opencv-2.4.12/sources/modules/contrib/src/rgbdodometry.cpp,将第65行的

# include 改为

# include

编译opencv2412

启动cmake-gui,更改source和build为/path/to/opencv-2.4.12/sources/path/to/opencv-2.4.12/build。然后点击Compile,指定本地编译器路径为/usr/bin/gcc-4.8/usr/bin/g++-4.8

在下面的信息中,我们可以找到类似于这样的一些信息:

...
Detected version of GNU GCC: 48 (408)
Looking for linux/videodev.h
Looking for linux/videodev.h - found
Looking for linux/videodev2.h
Looking for linux/videodev2.h - found
Looking for sys/videoio.h
Looking for sys/videoio.h - found
Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) 
...

注意,如果你的编译器是9.3,那么第一行将为Detected version of GNU GCC: 48 (Error)。说明高版本的gcc是无法兼容opencv2412的。另外如果上述信息中有些头文件没有找到,还请读者自行百度处理,这个比较简单。最后一行的JNI可以忽略。

第一次Configure是会直接Error掉的,我们需要修改一些键值对来让后续的过程顺利进行。

  1. 修改WITH_CUDA, WITH_FFMPEG的值都为取消勾选。

随后点击Configure,再点击Generate,直到出现Generating done,到这里就顺利的生成的makefile文件了。编译过程就很简单了,如下命令:

$ cd /path/to/software/opencv-2.4.12/build
$ make # 直到编译完成
# 注意千万不能使用`make install`

到这里,opencv2412的编译过程就完成了。

你可能感兴趣的:(杂项,opencv)