在 Ubuntu 20.04 中,ROS Noetic 默认安装的 OpenCV 版本为 4.2.0。如果您需要确认系统中已安装的 OpenCV 版本,可以使用以下命令:
sudo find / -iname "*opencv*"
然而,许多开源算法都是基于 OpenCV 3 编写的,如果要修改代码就非常麻烦。另一方面,一些程序可能可能又依赖高版本的OpenCV,比如4.5版本。这时就需要在系统中安装多个版本的OpenCV。
为了实现多个版本的共存,我们希望在不删除自带的 OpenCV 4 的情况下,编译安装 OpenCV 3 及其 contrib 库,并使得 cv_bridge 能够支持多版本。
本教程将介绍在不影响ROS中自带的 OpenCV 和 cv_bridge 的情况下,如何实现多版本 OpenCV 和 cv_bridge 的共存,并且将说明如何修改 CMakeLists 文件来找到指定版本的OpenCV和cv_bridge。本教程理论上对Ubuntu版本与ROS版本没有限制,并且对安装的OpenCV大版本(3或4)也没有要求。只需要注意OpenCV 3 的cv_bridge对应为melodic,而OpenCV 4则为noetic,在下载源码时选择对应版本即可。
0. 安装OpenCV依赖项
首先,更新源以确保系统处于最新状态:
sudo apt update
接着,安装所需的依赖项:
sudo apt-get install build-essential cmake git pkg-config libavcodec-dev libavformat-dev libswscale-dev libatlas-base-dev gfortran zlib1g-dev ccache autoconf automake libtool checkinstall
为了解决依赖问题,需要添加新的源。然后,安装 libjasper:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
接下来,安装常用的图像工具包以及视频 I/O 包:
sudo apt-get install libjpeg-dev libjpeg8-dev libtiff5-dev libjasper-dev libpng-dev
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
1. 编译 OpenCV 3 及其 contrib 库的源代码:
接下来,需要下载并编译 OpenCV 3 的源代码。可以从官方GitHub下载源代码,并按照以下步骤进行编译安装:
首先,下载 OpenCV 3 的源代码并切换到对应版本:
git clone https://github.com/opencv/opencv.git -b 3.4.14
mv opencv opencv3.4.14
cd opencv3.4.14
接着,下载 OpenCV contrib 模块(请注意版本的对应):
git clone https://github.com/opencv/opencv_contrib.git -b 3.4.14
然后,返回到 opencv 目录,并创建并进入 build 目录:
cd ../
mkdir build
cd build
接下来,配置 OpenCV 的编译选项:
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
-DCMAKE_BUILD_TYPE=RELEASE \
-DWITH_TBB=ON \
-DWITH_V4L=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.14 \
-DBUILD_opencv_vtk=OFF \
-DWITH_VTK=OFF \
..
执行完毕后你大概率会看到编译出现错误:
-- Configuring incomplete, errors occurred!
See also "/home/user/libraries/opencv3.4.14/build/CMakeFiles/CMakeOutput.log".
See also "/home/user/libraries/opencv3.4.14/build/CMakeFiles/CMakeError.log".
这里的错误来自于各种各样的依赖项没有找到或者没有安装,需要翻看报错信息来确定具体问题。可以百度/谷歌相关关键词(比如Could not find xxx)查找解决办法,这里只列举我遇到的一些依赖项问题:
--- Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
...
No package 'gstreamer-base-1.0' found
...
looking for ccache --not found
...
-- Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH)
解决方法是安装 Python 相关的开发库、gstreamer 相关库、ccache、OpenBLAS 或者 Atlas 、JNI(Java Native Interface)……:
sudo apt-get install python-dev
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install ccache
sudo apt-get install liblapack-dev liblapacke-dev libopenblas-dev
sudo apt install default-jdk
最后,可能会遇到关于 vtkParseOGLExt 的错误,可以通过复制 vtk7 文件解决:
sudo cp ./vtk7 ./vtk
完成以上步骤并且确认没有任何依赖性的问题之后,可以继续进行编译并安装 OpenCV:
make -j12
sudo make install
最好不要满线程!!!可能会卡死。可以先用htop看自己电脑最高可以多线程,然后适当减少一些编译用的线程数
2. 安装cv_bridge
cv_bridge 是用于在ROS和OpenCV图像之间进行转换的重要工具。在ROS Noetic中,默认的 cv_bridge 链接到了 OpenCV 4。为了确保ROS的完整性,并且保持 OpenCV 4 的正常使用,我们不建议卸载默认的 cv_bridge。
为了额外安装适配于 OpenCV 3 的 cv_bridge,首先需要从 cv_bridge 的 GitHub 仓库下载 ros_melodic 版本的 cv_bridge:cv_bridge GitHub
下载后,进入 vision_opencv-melodic/cv_bridge 目录,并修改其中的 CMakeLists.txt 文件,有以下两个目的:
(1)将寻找 Boost 的方式改为不区分 Python 版本,防止编译时找不到 boost_python3
(2)添加对自己安装的 OpenCV 3 的路径的设置,防止找不到与 OpenCV 版本兼容的配置文件
具体修改方式如下,注意修改的是下载的cv_bridge中CMakeLists.txt。
在文件开头添加以下内容
cmake_minimum_required(VERSION 2.8)
project(cv_bridge)
# 添加下面的内容
set(OpenCV_DIR /usr/local/opencv3.4.14/share/OpenCV)
set(OpenCV_INCLUDE_DIRS "/usr/local/opencv3.4.14/include")
set(OpenCV_LIBRARIES "/usr/local/opencv3.4.14/lib")
在文件中找到以下代码:
if(NOT ANDROID)
find_package(PythonLibs)
if(PYTHONLIBS_VERSION_STRING VERSION_LESS 3)
find_package(Boost REQUIRED python)
else()
find_package(Boost REQUIRED python3)
endif()
else()
find_package(Boost REQUIRED)
endif()
修改为:
if(NOT ANDROID)
find_package(PythonLibs)
find_package(Boost REQUIRED python)
else()
find_package(Boost REQUIRED)
endif()
完成以上修改后,保存并退出 CMakeLists.txt 文件。
接下来,需要在 vision_opencv-melodic/cv_bridge 目录中编译 cv_bridge:
cd vision_opencv-melodic/cv_bridge
mkdir build
cd build
cmake ..
make -j12
最后,使用 make install 命令将 cv_bridge 安装到系统中:
sudo make install DESTDIR=/usr/local/cv_bridge_melodic
这样就完成了 cv_bridge 的安装。现在,您可以在您的 ROS 系统中同时使用适配于 OpenCV 3 的 cv_bridge 和系统自带的 cv_bridge(链接到 OpenCV 4)了。
3. 修改ROS包中的CMakeLists.txt来指定OpenCV和cv_bridge版本
最后,需要在 ROS 包的 CMakeLists.txt 文件中设置 OpenCV 和 cv_bridge 的链接路径。可以按照以下方式设置:
# 在 project(xxx) 后面添加以下两行
set(cv_bridge_DIR /usr/local/cv_bridge_melodic/usr/local/share/cv_bridge/cmake)
set(OpenCV_DIR /usr/local/opencv3.4.14/share/OpenCV)
需要注意的是,对所有使用了 OpenCV 或者 cv_bridge 的 CMakeLists 都需要进行相应的修改,以确保正确链接到指定版本的库。
本教程到此结束。如果在安装过程中遇到任何问题,欢迎在评论中提出。