Hello,欢迎来到我的博客
这篇博客是关于ROS下使用OpenCV遇到的问题的解决方法,而今天这个问题更为特殊,是在ROS下使用OpenCV的detect功能(如HOG-SVM)时会遇到的。
1 问题描述
本文的操作环境
系统:Ubuntu 18.04
ROS版本:melodic
OpenCV版本:3.4.3
Python版本:3.6
Issue
OpenCV Error: Bad argument (Unknown interpolation method) in resize, file /build/opencv-XDqSFW/opencv-3.2.0+dfsg/modules/imgproc/src/imgwarp.cpp, line 3367
terminate called after throwing an instance of 'cv::Exception'
what(): /build/opencv-XDqSFW/opencv-3.2.0+dfsg/modules/imgproc/src/imgwarp.cpp:3367: error: (-5) Unknown interpolation method in function resize
我遇到这个问题是在ROS中使用OpenCV的detectMultiScale函数时遇到的。代码在编译过程中没有问题,但是运行时会报错,这里可以参考一篇英文博客:
Unknown interpolation method in function resize
作者在博客中提到了,这个问题可能是由于运行中调用的库函数发生冲突导致的。由于ROS中图像数据的转换用到了cv_bridge包,这个包是默认安装的,它引用的OpenCV版本和我们工程中用到的很可能不一样,所以导致了冲突。于是,重新编译cv_bridge包就成了解决问题的关键。
2 编译cv_bridge
1、进入工程目录(就是你的项目工程,不要新建其他的工作空间):
cd catkin_ws/src
2、下载cv_bridge代码:
git clone https://github.com/ros-perception/vision_opencv.git
3、编译代码:
cd ..
catkin_make
如果到这一步,你直接编译通过了,那么恭喜你,你很幸运。
但是,一般你通过不了,你还会遇到一些错误
3 解决编译报错
3.1 Issue 1
Could not find the following Boost libraries:boost_python37
这个问题是说找不到boost_python37库,这个问题的解决方法是:
//建立软连接
cd /usr/lib/x86_64-linux-gnu/
sudo ln -s libboost_python-py36.so libboost_python37.so
sudo ln -s libboost_python-py36.a libboost_python37.a
参考链接:https://blog.csdn.net/qq_42138662/article/details/105677869
3.2 Issue 2
/usr/include/python2.7/numpy/__multiarray_api.h:1537:144: error: return-statement with no value, in function returning ‘void*’ [-fpermissive]
这个问题是由于cv_bridge用了python2来编译,我们需要把python版本改成python3
解决方法是:
# 打开cv_bridge包中的CMakeLists.txt,然后在find_package(PythonLibs)前面添加以下两句话
set(PYTHON_NUMPY_INCLUDE_DIR ~/.local/lib/python3.6/site-packages/numpy/core/include)
set(PYTHON_INCLUDE_DIR /usr/include/python3.6)
注意以上的两个地址都是改成你自己对应的地址
pip3 show numpy # 这一句可以显示python3 numpy的地址
参考链接:https://blog.csdn.net/qq_18276949/article/details/107014026