目录
3.修改 cv_bridge中的cmakelists.txt
序言
在TX2开发板上编译VINS-Fusion的时候,开始报了很多错误,比如:
error: ‘CV_RGB2GRAY’ was not declared in this scope
搜索之后发现原来是我的系统安装的OpenCV版本为4.1.0,而Vins-Fusion代码依赖的是OpenCV版本需要3.x.x版本,其实如果只是想编译成功源码,我们只需要将opencv3的关键字改成opencv4的格式,可以参考这篇文章。但是这种方法并不是我追求的一劳永逸,而且后患不穷,于是我翻遍了百度和CSDN,终于成功切换了版本。
一、删除原来的OpenCV4
找到安装包:
cd build
sudo make uninstall
cd ..
sudo rm -r build
可以在/usr/local文件夹下手动删除相关文件,保证卸载干净,使用
pkg-config --modversion opencv
如果显示找不到包或者是ros自带的3.2版本,就说明卸载成功。
二、安装理想版本的OpenCV
1.下载安装包
wget https://github.com/opencv/opencv/archive/3.3.1.zip
2.安装依赖库
sudo apt-get upgrade
sudo apt-get install build-essential cmake pkg-config
sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libgtk-3-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install python3.5-dev
sudo apt-get install ffmpeg
3.编译安装
cd opencv-3.3.1
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make -j4
sudo make install
4.配置环境
sudo gedit /etc/ld.so.conf.d/opencv.conf
在打开的(空白)文件中加入:“/usr/local/lib”
更新共享连接库
sudo ldconfig
sudo gedit /etc/bash.bashrc
在结尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
刷新配置生效
source /etc/bash.bashrc
sudo updatedb
然后再使用
pkg-config --modversion opencv
检查版本号是否为3.3.1。
三、更新cv_bridge(最重要的一步)
因为ROS自带一个3.2.0版本的OpenCV,需要cv_bridge将自己安装的版本与ros系统进行链接。
一种方法是直接修改,网上大多数经验都是让你找到cv_bridge的cmake文件,修改opencv新版本的路径,这种方法治标不治本,编译的时候还会有警告:“加载共享库时出错:libopencv_imgcodecs.so.3.2:无法打开共享对象文件:没有这样的文件或目录”,导致编译成功但是无法正常运行。究其原因,是因为在安装ROS时,cv_bridge默认连接了ros自带版本的opencv进行编译。只修改cvbridgeConfig.cmake中opencv的路径,编译可能没问题,但在代码执行时如果引用到libcv_bridge.so,还是会链接到opencv原来的版本。
正确的做法是删除旧的cv_bridge,重新安装编译新的cv_bridge。
1.卸载旧版本cv_bridge
sudo apt-get remove ros-melodic-cv-bridge
2.下载ros版本对应的新的cv_bridge安装包
新建一个工作空间,在src目录下使用命令下载安装包
git clone https://github.com/ros-perception/vision_opencv/tree/melodic
或者在浏览器进入Github网站下载源码的压缩包,解压下来。
3.修改 cv_bridge中的cmakelists.txt
find_package(OpenCV 3.3.1 REQUIRED) //改成你安装的opencv的版本
4.编译
在cv_bridge文件夹下
mkdir build
cd build
cmake ..
make
sudo make install
5.修改开源代码
在开源代码需要的cmaklist.txt中添加cv_bridge的cmake路径
set(cv_bridge_DIR /usr/local/share/cv_bridge/cmake) //在find_package前面
比如,在vinsfusion开源SLAM代码中,只需要在loop_fusion和vins_estimator两个子模块的cmakelist.txt开头添加set,即可完美编译通过。
四.总结
总之,在更换OpenCV版本的时候,不要忘记要更新cv_bridge的版本,重新链接起来,否则虽然显示版本号为新安装的版本,但是编译项目时,cmake会自动选择ros自带的版本,导致编译失败。