在20.04 ros noetic opencv4的环境下部署opencv3的功能包注意事项
这里以opencv3.3.1为例
环境需要单独安装opencv3.3.1和opencv_contrib3.3.1
3.4.1测试过也OK
新建一个文件夹opencv331来专门存放opencv3.3.1和opencv_contrib3.3.1
mkdir opencv331
cd opencv331
然后运行下面命令下载opencv3.3.1和opencv_contrib3.3.1
git clone -b 3.3.1 https://github.com/opencv/opencv.git
git clone -b 3.3.1 https://github.com/opencv/opencv_contrib
接着编译安装
下面camke命令中,CMAKE_INSTALL_PREFIX指定了安装路径,OPENCV_EXTRA_MODULES_PATH指定了opencv_contrib的路径,注意确保opencv_contrib和opencv处于同一个文件夹内,下面OPENCV_EXTRA_MODULES_PATH指定的相对路径才有效。
cd opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D WITH_CUDA=OFF -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
make -j8
sudo make install
此时ubuntu环境里面可以找到opencv4也可以找到opencv3
单纯地把功能包地cmakelists里面地find_package(OpenCV REQUIRED)改为find_package(OpenCV 3.4.1 REQUIRED)是不够的
改不改,编译功能包都会出现比如undefined reference to cv::mat::mat()的报错,出现这种undefined的报错一般是找到了头文件,但是链接库的时候没有链接库或者没有找到库,这里猜测是cv_bridge的原因,虽然找到了opencv3.3.1,但是链接库实际还是链接的opencv4的库,但是可能又不符合,所以实际没有找到opencv3的库,导致编译出现undefined。
可以cmakelists里面加上这些打印,会发现虽然找到的是opencv3,但是链接的库还是opencv4的
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
message(STATUS " catkin libraries: ${catkin_LIBRARIES}")
解决方法是自己再另外编码编译安装一个cv_bridge,之前系统二进制安装的cv_bridge不用卸载(之前为了保险连系统原本自动二进制安装的cv_bridge也卸载了,其实不用)
按照下面操作源码编译部署一个cv_bridge,使得这个cv_bridge是调用的opencv3,同时自己这个功能包是找到的这个源码编译的cv_bridge,而不是系统二进制安装的cv_bridge就饿可以了,实现这个的关键操作就是自己功能包的cmakelists里面加上set(cv_bridge_DIR "your-path/cv_bridge_ws/devel/share/cv_bridge/cmake")
cv_bridge: cv-bridge for melodic
还有一个方法也可以改变ROS功能包自动链接的opencv,也就是cv_bridge自动链接的功能包
编译promethues detection模块的时候,可能会出现和opencv相关的问题。因为官方的系统很可能默认装的opencv4,至少我用了nano是这样,普罗米修斯群里也不少人的系统是这样的。
可以按照下面这个解决,我在nano上编译普罗米修斯的detection模块的时候就出现了问题,按照下面这个解决了,编译通过了。里面很关键的一部是要把之前的build和devel文件夹删掉。
https://github.com/amov-lab/Prometheus/wiki/Q&A%E6%B1%87%E6%80%BB