opencv3连接ROS动力学

时间:2017-03-12 09:21:06

标签: opencv cmake ros clion

所有!

我正在尝试在CLion项目中使用OpenCV库,但这是不成功的。我有一次安装了ROS动能的opencv 3.2.0(我可以在/opt/ros/kinetic/include/opencv-3.2.0目录中看到它,我可以通过python导入cv2)。但是当我使用这样的CMakeLists.txt时:

cmake_minimum_required(VERSION 3.6)
project(visual_slam)

set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
set(OpenCV_DIR /opt/ros/kinetic/include/opencv-3.2.0)
include_directories( ${OpenCV_DIR})
add_executable(visual_slam ${SOURCE_FILES})

使用下一个简单代码:

  #include <iostream>
  #include <opencv2/opencv.hpp>

  using namespace cv;

  int main()
  {
      return 0;
  }

我收到了下一个错误:

  

CMakeFiles / visual_slam.dir / main.cpp.o:在函数cv::String::~String()': /opt/ros/kinetic/include/opencv-3.2.0/opencv2/core/cvstd.hpp:664: undefined reference to cv :: String :: deallocate()'中   CMakeFiles / visual_slam.dir / main.cpp.o:在函数cv::String::operator=(cv::String const&)': /opt/ros/kinetic/include/opencv-3.2.0/opencv2/core/cvstd.hpp:672: undefined reference to cv :: String :: deallocate()'

OpenCV linking problems with ROS中也讨论过这样的错误,但完全卸载然后再安装OpenCV真的有必要吗?还有更快的解决方案吗?

第二个问题,如何正确地将ROS从OpenCV添加到CMakeLists.txt?当前的CMakeLists(如上所示)看起来并不灵活。我已经尝试添加

find_package(OpenCV 3 REQUIRED)
target_link_libraries(visual_slam ${OpenCV_LIBRARIES} )

但错误是CMake构建时的错误

 By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "OpenCV",      but
 CMake did not find one.
 Could not find a package configuration file provided 
 by "OpenCV" (requested version 3) with any of the following names:

 OpenCVConfig.cmake
 opencv-config.cmake

1 个答案:

答案 0 :(得分:0)

你得到的第二个错误(即缺失的OpenCV.cmake)实际上不仅与第一个错误相关(undefined reference to),而且是原因。

如果cmake无法找到OpenCV模块,则${OpenCV_LIBS}不会做任何事情,这意味着target_link_libraries(visual_slam ${OpenCV_LIBRARIES} )不会链接您的代码所需的库。这就是说我也相信OpenCV_LIBS代替OpenCV_LIBRARIES

您当然可以指定find_package(...)命令查找cmake模块的路径(我认为它是CMAKE_FIND_ROOT_PATH变量),或者甚至手动指定您的根文件夹OpenCV安装并手动处理OpenCV.cmake为您处理的所有内容。

最后但并非最不重要的是,我不确定ROS Kinetic是否使用最新的OpenCV(您正在使用的是v3.2)。你应该检查一下,如果使用了不同的版本(非常可能),你将不得不从头开始构建所有与ROS OpenCV相关的软件包。您可能会问&#34;我为什么要这样做?&#34;。好吧,为了避免兼容性问题和可能会或可能不会发生的各种奇怪错误(取决于您使用的OpenCV功能),因为OpenCV的X版本被用于系统上存在的ROS和版本Y的二进制包(使用X! = Y)。我不得不用PCL(Point Cloud Library)做过一次,因为我得到的错误(对于C ++来说很典型)很神秘,所以我花了好几天才得出这个结论。为避免冲突,请确保您的系统上只存在一个版本的OpenCV(可由cmake找到),以便与ROS安装一起使用。这也是为什么ROS二进制包使用由包管理器(OpenCV,PCL等)解析的依赖关系通过Ubuntu repos发布的原因。

PS:由于我还没有使用Clion我还建议(在做上述任何事情之前)检查它是否不是IDE中的一些隐藏的cmake相关设置会搞砸了。