Ubuntu16.04下opencv2与ROSkinetic中自带opencv3不兼容问题总结

1、背景:从ROSindigo换到ROSkinetic,ROSkinetic中自带的opencv3,与原来indigo中opencv2不一样,所以原来的涉及opencv的程序都出了问题,最近这两天就一直在改兼容性,清明节最后一天了,总结一下关于opencv的一些问题

2、代码从indigo移到kinetic后,立马运行了一下,果真不行,然后百度,知道是opencv兼容问题,查到文章一篇:

       ROS-Kinect cv_bridge的opencv版本兼容问题

按照文章修改了配置,后来发现有的程序ok了,有的程序还是不行

出现了

我就意识到现在问题不是兼容性了,根据以往调试经验,undefined reference to xxx CMakeLists.txt中缺少对应库,发现确实忘了加 opencv库,添加之后就ok了。然而奇怪的是,为什么会我之前在indigo中调试没有这个${OpenCV_LIBRARIES}库却没有问题呢?如有大神知道,麻烦留言告知!

target_link_libraries(main_interface ${QT_LIBRARIES} ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

3、关于opencv3.x的使用及迁移

相关网站: OpenCv3.3.1 Changes overview 

附上wiki介绍:    http://wiki.ros.org/opencv3

// old header
#include "opencv2/<module>/<module>.hpp"
// new header
#include "opencv2/<module>.hpp"
//for example:
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui.hpp>//opencv3 changed place

4、ros by example1 代码涉及cv2.cv在kinetic中的使用

(1)rbx1_系列代码是基于indigo的,opencv2,在rbx1_vision中有这么一句

扫描二维码关注公众号,回复: 2870334 查看本文章
import cv2.cv as cv

在ros kinetic中编译时会出现没有cv这个module的错误提示,因为子啊kinetic中它使用的是opencv3.x,所以你要使用rbx1的代码,必须要使用Ubuntu16.04中自带的opencv2,而不是ROS kinetic中的opencv3!

(2)使用命令查看系统opencv版本:如果不是opencv2.x,那你就要自己去下载opencv2然后自己编译了

sun@sun-pc:~$ pkg-config --modversion opencv  
2.4.9.1

据了解在,python中是通过cv2.so调用opencv的库的:参考链接

Python调用opencv的原理是:opencv编译出共享库文件,python把这个共享库文件作为一个模块加载并使用。通俗点就是,编译opencv的时候开启python接口选项,编译好了会产生cv2.so(linux下)或者cv2.pyd(windows下)这个共享库文件,python代码中import这个cv2就可以用了。为了能正确import它,往往需要把cv2.so放在python找包能找到的路径下,或者修改PYTHONPATH环境变量让它包含cv2.so所在路径。

(3)所以为了避免使用ROSkinetic中的opencv3的库,就需要将其cv2.so删掉,为了以防万一,可以先将cv2.so移到其他地方

sun@sun-pc:~$ cd /opt/ros/kinetic/lib/python2.7/dist-packages
sun@sun-pc:~$ sudo mv cv2.so /home/sun 

移除cv2.so文件后运行rbx1的cv_bridge_demo程序:完美!


猜你喜欢

转载自blog.csdn.net/qq_30460905/article/details/79845156
今日推荐