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。
https://github.com/opencv/opencv/archive/2.4.12.zip
,比如我们下载到~/software
目录下,然后解压到当前目录,并在~/software/opencv-2.4.12
目录下新建一个sources
文件夹,将其他的文件和文件夹全部放在sources
文件夹下面。并在sources
文件的同级目录新建一个build
文件夹,如下图所示:sources文件夹目录如下:
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的源,如下图:
可以看到,这里只有两个版本,分别是9.3.0
和4.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
# 不会覆盖默认的编译器
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
启动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
掉的,我们需要修改一些键值对来让后续的过程顺利进行。
WITH_CUDA, WITH_FFMPEG
的值都为取消勾选。随后点击Configure
,再点击Generate,直到出现Generating done
,到这里就顺利的生成的makefile文件了。编译过程就很简单了,如下命令:
$ cd /path/to/software/opencv-2.4.12/build
$ make # 直到编译完成
# 注意千万不能使用`make install`
到这里,opencv2412的编译过程就完成了。