关于ros将opencv版本固定“写死”的一些想法
今天主要工作是将ros和zed结合起来,但是发现自己安装了opencv3.1,ros indigo安装的是opencv2.4.8,这就麻烦了,zed支持的是opencv3.1。一开始使用slam2时,报错:
编译出现错误,
CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: In function `String':
/usr/local/include/opencv2/core/cvstd.hpp:625: undefined reference to `cv::String::allocate(unsigned long)'
CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: In function `main':
/home/car/Desktop/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/ros_stereo.cc:86: undefined reference to `cv::FileStorage::FileStorage(cv::String const&, int, cv::String const&)'
CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: In function `main':
/usr/local/include/opencv2/core/cvstd.hpp:667: undefined reference to `cv::String::deallocate()'
CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: In function `~String':
/usr/local/include/opencv2/core/cvstd.hpp:667: undefined reference to `cv::String::deallocate()'
CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: In function `cv::FileNode::operator int() const':
/usr/local/include/opencv2/core/persistence.hpp:1180: undefined reference to `cv::read(cv::FileNode const&, int&, int)'
/usr/local/include/opencv2/core/persistence.hpp:1180: undefined reference to `cv::read(cv::FileNode const&, int&, int)'
/usr/local/include/opencv2/core/persistence.hpp:1180: undefined reference to `cv::read(cv::FileNode const&, int&, int)'
/usr/local/include/opencv2/core/persistence.hpp:1180: undefined reference to `cv::read(cv::FileNode const&, int&, int)'
CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: In function `main':
/usr/local/include/opencv2/core/cvstd.hpp:667: undefined reference to `cv::String::deallocate()'
/usr/local/include/opencv2/core/cvstd.hpp:667: undefined reference to `cv::String::deallocate()'
之后:
我将CMakeLists.txt 里面的
find_package(OpenCV 2.4.3 REQUIRED)
改成
find_package(OpenCV 3.1.0 REQUIRED COMPONENTS core highgui imgproc imgcodecs)
好像就可以了,但是,运行出错了
OpenCV Error: Bad argument (Invalid pointer to file storage) in cvGetFileNodeByName, file /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/persistence.cpp, line 740
terminate called after throwing an instance of 'cv::Exception'
what(): /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/persistence.cpp:740: error: (-5) Invalid pointer to file storage in function cvGetFileNodeByName
OpenCV Error: Bad argument in cvGetFileNodeByName,src/persistence.cpp, throwing 'cv::Exception'
what(): /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/persistence.cpp:740: error: (-5) Invalid pointer to file storage in function cvGetFileNodeByName
还是出错,改的心慌慌呀。
网上有个解决方案,转自http://m.blog.csdn.net/article/details?id=52842099
ROS-Kinect cv_bridge的opencv版本兼容问题
发表于2016/10/17 21:32:15 326人阅读
分类: 研究
转自我的博客(http://gongzheng92.net)
今天在编译自己的drone_sensor模块的时候(含stereo camera)出现了
/home/joey/pfl/ros/src/drone_sensor/src/stereo_camera/CameraThread.cpp: In member function ‘virtual void CameraThread::loop()’: /home/joey/pfl/ros/src/drone_sensor/src/stereo_camera/CameraThread.cpp:65:47: error: ‘cvDeInterlace’ was not declared in this scope
cvDeInterlace(img, evenImage, oddImage);
^
/home/joey/pfl/ros/src/drone_sensor/src/stereo_camera/CameraThread.cpp: In member function ‘void CameraThread::publishImage(image_transport::CameraPublisher&, IplImage*)’: /home/joey/pfl/ros/src/drone_sensor/src/stereo_camera/CameraThread.cpp:85:32: error: no matching function for call to ‘cv::Mat::Mat(IplImage*&)’
cv::Mat image = cv::Mat(img);
- 1
- 2
- 3
- 4
- 5
的错误(我的catkin_ws即为~/pfl/ros)
我的配置为:
- Ubuntu 16.04 虚拟机
- ROS版本为Kinect,路径为
/opt/ros/kinect
通过这条问题里中提到的命令查询opencv的路径与版本还有依赖库:
pkg-config --modversion opencv
2.4.9.1
pkg-config --cflags opencv
-I/usr/include/opencv
pkg-config --libs opencv
#这里有好多.so文件的路径,每个人都不尽一样,略去。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
从报错以及网上的资料可以发现造成错误的原因主要是由于ros在Kinect的版本中自带了opencv3(通过ros-kinect-opencv3安装),在目录/opt/ros/kinetic/include/opencv-3.1.0-dev下。cv3与cv2的不兼容造成了错误。具体造成本错误的原因是cvDeInterlace这个函数存在于cvaux.h所引用的opencv2/legacy/legacy.hpp文件中,而在cv3中cvaux并没有引用这个文件(那么在cv3中对应的函数应该如何调用?)
在这个问题中题主遇到了非常相似的情况,然而给出的解决方式:
将cmakelist中
find_package(OpenCV REQUIRED)
改为
find_package(OpenCV 2.4.8 EXACT REQUIRED)
(其中2.4.8为具体版本号,我的情况为2.4.9.1)
并没有用,make还是会去调用ros的cv3.
继续在网上翻找之后发现时cv_bridge的问题。ros kinect的cv_bridge会自动关联cv3。具体在/opt/ros/kinetic/share/cv_bridge/cmake中的cv_bridgeConfig.cmake里可以看到:
第94-96行:
if(NOT "include;/opt/ros/kinetic/include/opencv-3.1.0-dev/opencv;/opt/ros/kinetic/include/opencv-3.1.0-dev " STREQUAL " ")
set(cv_bridge_INCLUDE_DIRS "")
set(_include_dirs "include;/opt/ros/kinetic/include/opencv-3.1.0-dev/opencv;/opt/ros/kinetic/include/opencv-3.1.0-dev")
- 1
- 2
- 3
- 4
以及第112行的所有lib都是cv3的。
因此将所有的这些opencv的路径都改为系统的opencv路径即可解决问题。同时上述的find_package中的信息并没有必要修改。
附上我的修改方案:
#94-96行:
if(NOT "include;/usr/include/opencv;/usr/include " STREQUAL " ")
set(cv_bridge_INCLUDE_DIRS "")
set(_include_dirs "include;/usr/include/opencv;/usr/include")
#112行:
set(libraries "cv_bridge;/usr/lib/x86_64-linux-gnu/libopencv_calib3d.s
o;/usr/lib/x86_64-linux-gnu/libopencv_contrib.so;/usr/lib/x86_64-linux-
gnu/libopencv_core.so;/usr/lib/x86_64-linux-gnu/libopencv_features2d.so
;/usr/lib/x86_64-linux-gnu/libopencv_flann.so;/usr/lib/x86_64-linux-gnu
/libopencv_gpu.so;/usr/lib/x86_64-linux-gnu/libopencv_highgui.so;/usr/li
b/x86_64-linux-gnu/libopencv_imgproc.so;/usr/lib/x86_64-linux-gnu/libope
ncv_legacy.so;/usr/lib/x86_64-linux-gnu/libopencv_ml.so;/usr/lib/x86_64-l
inux-gnu/libopencv_objdetect.so;/usr/lib/x86_64-linux-gnu/libopencv_ocl.so
;/usr/lib/x86_64-linux-gnu/libopencv_photo.so;/usr/lib/x86_64-linux-gnu/
libopencv_stitching.so;/usr/lib/x86_64-linux-gnu/libopencv_superres.so;/
usr/lib/x86_64-linux-gnu/libopencv_ts.so;/usr/lib/x86_64-linux-gnu/lib
opencv_video.so;/usr/lib/x86_64-linux-gnu/libopencv_videostab.so")
有了些启发,但是还是没做出来
关于ros将opencv版本固定“写死”的一些想法的更多相关文章
- 切割模型固定写死了切平面方程是y=0.1
上一篇讲到3d模型切割我遇到的问题(切面的纹理会混乱),经过这段时间的琢磨,有了解决方案,当然我这里只给出我的解决思路,投入到实际项目中还需要做许多工作,比如我在上一篇中切割模型固定写死了切平面方程是 ...
- ROS知识(12)----cv_bridge依赖opencv版本的问题
cv_bridge默认依赖的oencv版本是2.4.8,如果安装了新的opencv版本,比如2.4.11,那么在编译cv_bridge时候会提示无法找到opencv 2.4.8.so的库. 为解决这个 ...
- 【2017-11-08】Linux与openCV:opencv版本查看及库文件位置等
1. 查看当前系统中opencv的版本: pkg-config --modversion opencv 可以看到系统中目前存在opencv2.4.9.1及opencv3.2.0两个版本. 不太清楚op ...
- 因OpenCV版本不一致所引发的报错
目录 一 因OpenCV版本不一致所引发的报错 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 因OpenCV版本不一致所引发的报错 今天遇到了一个很有意思的报错. 事情是这样的, 在编译& ...
- Atitit opencv版本新特性attilax总结
Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...
- 学习OpenCV——SVM 手写数字检测
转自http://blog.csdn.net/firefight/article/details/6452188 是MNIST手写数字图片库:http://code.google.com/p/supp ...
- 使用<jsp:include>,不想写死URL,动态生成URL的解决的方法
JSP中文件包括有2种方式,静态包括和动态包括. 静态包括使用<%@ include file="" %>.动态包括使用<jsp:include page=&qu ...
- 查不到opencv版本的问题
检查opencv版本:pkg-config --modversion opencv 前两天卸载了opencv3.0,想重装2.4版本.安装是没有问题,但现在查不到opencv版本,程序也编译不通过. ...
- fiddler 手机 https 抓包 以及一些fiddler无法解决的https问题http2、tcp、udp、websocket证书写死在app中无法抓包
原文: https://blog.csdn.net/wangjun5159/article/details/52202059 fiddler手机抓包原理 fiddler手机抓包的原理与抓pc上的web ...
随机推荐
- 发送短信验证码倒计时,CountDownTimer;
1.声明CountDownTimer的成员变量: private CountDownTimer countDownTimer; 2.设置倒计时总时间和间隔时间: countDownTimer = ne ...
- android:clipChildren属性,子布局超出父布局;
是否允许子View超出父View的范围,Boolean型true .false ,默认true不允许: android:clipChildren="true":如下 android ...
- MySQL库操作,表操作,数据操作。
数据库服务器:本质就是一台计算机,该计算机上安装有数据库管理软件的服务端,供客户端访问使用. 1数据库管理系统RDBMS(本质就是一个C/S架构的套接字),关系型数据库管理系统. 库:(文件夹)- ...
- hdfs底层存储分隔符
字段分割 \ map字段里面key \ value \ 每行结尾用linux换行符 \0a '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格,通常敲一个回车键,即是回车,又是换行( ...
- angularjs路由相关知识
angular.module('app').config(['$stateProvider','$urlRouterProvider',function($stateProvider,$urlRout ...
- python-requests模块的讲解和应用
在WINDOWS上可以通过命令行窗口(运行cmd命令), 利用pip进行自动地安装--------pip install requests 1.向网站发送请求:requests.get(url) 2. ...
- Linux终端小技巧
注释:以下都是自己遇到的问题,问题太多也记不住,每次上网查找又比较麻烦,索性记录一下随笔! 1.进程的挂载与运行 暂停运行一个进程:Ctrl+Z 其中这个进程可再被操作,如:后台运行.再次运行等 ...
- ios8.1.1系统怎么取消下划线
http://zhidao.baidu.com/link?url=y-3oAiOsuCSvoCD-7H2Uvgl_UI1BQQuNvA2jHKCRAGmZSH7_RrwDijKtRouMBa5yF_L ...
- 1.cs与bs结构
####CS 与 BS 结构 C/S 结构软件:客户端(Client)服务器(Server)软件,客户端需要单独下载安装之后,才能正常操作的软件 B/S 结构软件:浏览器(Browser)服务器(Se ...
- iOS基础知识之类别
本类从三个方面介绍iOS中的类别,分别是 什么是类别:类别的语法:类别的作用.具体内容如下: 一.类别: 类的补丁:当不能获取现有类的源码,但需要对现有类的功能进行补充时,这种情况下使用类别. 类别 ...