系统环境
ubuntu20安装了ros-noetic,所以系统默认装了opencv4.2.0,但是跑fastlivo推荐的是opencv3.2.0,而且海康相机别人写的ros驱动(海康相机ros驱动)也是需要opencv3.2.0,最终还是选择安装多版本的opencv。
opencv3.2.0安装过程
1、下载安装包
opencv的github链接
下载对应的3.2.0版本
2、安装依赖
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
libjasper-dev安装不了,可以参考问题解决:“E: 无法定位软件包 libjasper-dev,加一个apt源去安装
3、编译
为了管理多版本,一般需要单独创建opencv3.2.0目录,我就直接在/usr/local/opecv3.2.0
创建目录,并且最终安装在这里。
cd ~/Downloads/depedence/opencv-3.2.0
mkdir build # 创建build文件夹
cd build # 进入build文件夹
cmake -D CMAKE_BUILD_TYPE=Release
-D OPENCV_GENERATE_PKGCONFIG=ON
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.2.0
-D ENABLE_PRECOMPILED_HEADERS=OFF -D WITH_CUDA=OFF ..
注意上面设置好安装目录,选择生成pkgconfig文件(方便查看和调用)。最重要的注意WITH_CUDA=OFF
,没加这个之前,cmake的过程回报错没法进行后续编译,所以把cuda禁用(一般也用不到)。
make -j8
sudo make install
注意编译的过程中也会有报错,可以参考Ubuntu 20.04 安装opencv3.2.0 及报错解决方法,具体就是:
问题1:/usr/include/c++/9/cstdlib:75:15: fatal error: stdlib.h: 没有那个文件或目录 解决方法:cmake时加上参数-D ENABLE_PRECOMPILED_HEADERS=OFF问题2:error: 'CODEC_FLAG_GLOBAL_HEADER' was not declared in this scope 解决方法:在opencv/opencv-3.2.0/modules/videoio/src/cap_ffmpeg_impl.hpp 文件里添加:
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020问题3:make[2]: *** [modules/python3/CMakeFiles/opencv_python3.dir/build.make:56: modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o] Error 1make[1]: *** [CMakeFiles/Makefile2:21149: modules/python3/CMakeFiles/opencv_python3.dir/all] Error 2
解决方法:找到cv2.cpp,大约在730行,将
char* str = PyString_AsString(obj);
改为
char* str = (char *)PyString_AsString(obj);
漫长等待后就安装完了。
4、配置系统环境
打开系统环境文件
sudo gedit ~/.bashrc
然后把pkg-config和lib的路径加上
export LD_LIBRARY_PATH=/usr/local/opencv3.2.0/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/opencv3.2.0/lib/pkgconfig:$PKG_CONFIG_PATH
验证opencv版本
pkg-config --modversion opencv
最终的输出是
3.2.0
安装完成,后续就是安装cv_bridge
cv_bridge安装
参考:ROS学习:cv_bridge与opencv版本冲突三种解决方法
简单理解一个cv_bridge版本对应一个opencv,因为一开始ros安装的opencv版本为4.2.0,所以cv_bridge也是关于opencv4.2.0的。那么如果ros还需要用opencv3.2.0并且用cv_bridge那么就需要再编译一个cv_bridge对应opencv3.2.0。下面就是重新编译cv_bridge的过程。
1、下载cv_bridge
下载链接:vision_opencv,记得找到对应ros版本的进行下载,ubuntu20一般找的是noetic。
2、编译
直接把里面的cv_bridge复制到你自己的工作空间中。
然后改cmakelist,把opencv的版本和目录改成自己想要的。
# set(_opencv_version 4)
# find_package(OpenCV 4 QUIET)
# if(NOT OpenCV_FOUND)
# message(STATUS "Did not find OpenCV 4, trying OpenCV 3")
# set(_opencv_version 3)
# endif()set(OpenCV_DIR /usr/local/opencv3.2/share/Opencv)
find_package(OpenCV 3.2.0 REQUIREDCOMPONENTSopencv_coreopencv_imgprocopencv_imgcodecsCONFIG
)
上面注释的是改正前的,下面是改正后的,改成opencv3.2.0。然后就是编译。
catkin_make
3、编译海康相机驱动
接着就是把海康相机的驱动MVS_ROS拷贝到工作空间中。
先把工作空间中的cv_bridge包的目录更新到当前终端,查看更新情况
source devel/setup.bash
rospack find cv_bridge
如果输出的是工作空间中的cv_bridge就说明更新成功,接着就是一起编译。整个工作空间的结构是这样的:
4、启动海康相机驱动
source devel/setup.bash
roslaunch hikrobot_camera hikrobot_camera_rviz.launch
就能看到相机的话题发布的图像了:
后续就是调相机参数再跑算法了。
opencv的卸载
ubuntu20安装opencv4和opencv_contrib 多版本共存
openCV安装后的源码尽可能保留,因为可以直接从build文件夹下卸载已经安装的openCV。在ubuntu终端命令行输入以下命令进入安装opencv的build目录并进行卸载操作。
cd build
sudo make uninstall
cd ..
sudo rm -r build
最后删除/usr下关于opencv的文件(此步骤不需要?疑问一下)
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*
像我先前的安装路径为/usr/local/opencv3.2.0
, 该行指令可直接变为
sudo rm -r /usr/local/opencv3.2.0