OpenCV将问题与ROS联系起来

时间:2015-04-06 20:46:02

标签: c++ opencv linker ubuntu-14.04 ros

我正在尝试编译this项目(按照给出的说明)。使用rosmake进行构建时,我得到了一堆undefined reference to cv::String::deallocate()undefined reference to cv::String::allocate(unsigned long)。我很奇怪我在这些函数中遇到错误,而其他OpenCV函数似乎正常工作。

我知道发生这种情况是因为链接器找不到编译这些函数的对象,但我对ROS构建系统并不熟悉,也无法找到错误。

我已尝试使用提供的CMakeLists.txt文件,并添加了find_package(OpenCV REQUIRED)target_link_libraries(xxx xxx ${OpenCV_LIBRARIES}),但没有任何区别。我知道OpenCV已正确安装和编译(之前我已经使用过),而且我已经安装了ROS而没有任何问题。

我正在使用OpenCV 3,ROS Indigo,Ubuntu 14.04

4 个答案:

答案 0 :(得分:4)

我有同样的问题 - 相同的错误信息,相同的设置。我设法解决了这个问题,尽管我并不完全确定我所做的实际贡献的步骤。据我所知,这是由于OpenCV版本的冲突 - 我认为我的旧版OpenCV混乱了我的/ usr / include和/ usr / local。我卸载了所有OpenCV软件包(包括ROS软件包),包括我的源代码安装OpenCV3(也在/ usr / local)。然后我安装了ROS软件包vision_opencv,它似乎安装了OpenCV 2.4.8(顺便提一下LSD SLAM推荐的那个)。当然,如果你需要OpenCV3用于其他事情,这可能会很烦人,但我现在把它作为我主目录中的本地安装(我无法弄清楚如何让ROS链接到这个)。

我认为这解决了这个问题,剩下的唯一问题就是我收到了错误信息,说找不到。这是因为程序包安装将其保留(类似于所有模块包含文件),而源代码安装的make install步骤将它们复制到父文件夹中。为了解决这个问题,我只是在使用它的唯一文件中编辑#include(lsd_slam_core / src / IOWrapper / OpenCV / ImageDisplay_OpenCV.cpp)。这似乎解决了它!

我希望这有帮助,如果需要,我可以提供进一步的细节。

答案 1 :(得分:0)

我正在使用OpenCV 3.1.0(出血边缘),ROS Indigo,Ubuntu 14.04。 在尝试编译LSD-SLAM时,我遇到了类似的麻烦

我补充说:

find_package(OpenCV 3.1.0 REQUIRED COMPONENTS core highgui imgproc imgcodecs)

我还在目标链接库中添加了opencv库:

target_link_libraries(lsdslam ${FABMAP_LIB} g2o_core g2o_stuff csparse cxsparse g2o_solver_csparse g2o_csparse_extension g2o_types_sim3 g2o_types_sba X11 opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs)

这是我的CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.8.12)
project(lsd_slam_core)
include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)
find_package(OpenCV 3.1.0 REQUIRED COMPONENTS core highgui imgproc imgcodecs)

# Set the build type.  Options are:
#  Coverage       : w/ debug symbols, w/o optimization, w/ code-coverage
#  Debug          : w/ debug symbols, w/o optimization
#  Release        : w/o debug symbols, w/ optimization
#  RelWithDebInfo : w/ debug symbols, w/ optimization
#  MinSizeRel     : w/o debug symbols, w/ optimization, stripped binaries
set(ROS_BUILD_TYPE Release)

rosbuild_init() 

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_MODULE_PATH   ${PROJECT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})

find_package(Eigen3 REQUIRED)
find_package(SuiteParse REQUIRED) # Apparently needed by g2o
find_package(X11 REQUIRED)

# FabMap
# uncomment this part to enable fabmap
#add_subdirectory(${PROJECT_SOURCE_DIR}/thirdparty/openFabMap)
#include_directories(${PROJECT_SOURCE_DIR}/thirdparty/openFabMap/include)
#add_definitions("-DHAVE_FABMAP")
#set(FABMAP_LIB openFABMAP )

# Dynamic Reconfigure Services
rosbuild_find_ros_package(dynamic_reconfigure)
include(${dynamic_reconfigure_PACKAGE_PATH}/cmake/cfgbuild.cmake)
gencfg()

# SSE flags
rosbuild_check_for_sse()
add_definitions("-DUSE_ROS")
add_definitions("-DENABLE_SSE")

# Also add some useful compiler flag
set(CMAKE_CXX_FLAGS
   "${CMAKE_CXX_FLAGS} ${SSE_FLAGS} -march=native  -std=c++0x"
) 

# Set source files
set(lsd_SOURCE_FILES
  ${PROJECT_SOURCE_DIR}/src/DataStructures/Frame.cpp
  ${PROJECT_SOURCE_DIR}/src/DataStructures/FramePoseStruct.cpp
  ${PROJECT_SOURCE_DIR}/src/DataStructures/FrameMemory.cpp
  ${PROJECT_SOURCE_DIR}/src/SlamSystem.cpp
  ${PROJECT_SOURCE_DIR}/src/LiveSLAMWrapper.cpp
  ${PROJECT_SOURCE_DIR}/src/DepthEstimation/DepthMap.cpp
  ${PROJECT_SOURCE_DIR}/src/DepthEstimation/DepthMapPixelHypothesis.cpp
  ${PROJECT_SOURCE_DIR}/src/util/globalFuncs.cpp
  ${PROJECT_SOURCE_DIR}/src/util/SophusUtil.cpp
  ${PROJECT_SOURCE_DIR}/src/util/settings.cpp
  ${PROJECT_SOURCE_DIR}/src/util/Undistorter.cpp
  ${PROJECT_SOURCE_DIR}/src/Tracking/Sim3Tracker.cpp
  ${PROJECT_SOURCE_DIR}/src/Tracking/Relocalizer.cpp
  ${PROJECT_SOURCE_DIR}/src/Tracking/SE3Tracker.cpp
  ${PROJECT_SOURCE_DIR}/src/Tracking/TrackingReference.cpp
  ${PROJECT_SOURCE_DIR}/src/IOWrapper/Timestamp.cpp
  ${PROJECT_SOURCE_DIR}/src/GlobalMapping/FabMap.cpp
  ${PROJECT_SOURCE_DIR}/src/GlobalMapping/KeyFrameGraph.cpp
  ${PROJECT_SOURCE_DIR}/src/GlobalMapping/g2oTypeSim3Sophus.cpp
  ${PROJECT_SOURCE_DIR}/src/GlobalMapping/TrackableKeyFrameSearch.cpp
)
set(SOURCE_FILES
  ${lsd_SOURCE_FILES}
  ${PROJECT_SOURCE_DIR}/src/IOWrapper/ROS/ROSImageStreamThread.cpp
  ${PROJECT_SOURCE_DIR}/src/IOWrapper/ROS/ROSOutput3DWrapper.cpp
  ${PROJECT_SOURCE_DIR}/src/IOWrapper/OpenCV/ImageDisplay_OpenCV.cpp
)

include_directories(
  ${EIGEN3_INCLUDE_DIR}
  ${PROJECT_SOURCE_DIR}/src
  ${PROJECT_SOURCE_DIR}/thirdparty/Sophus
  ${CSPARSE_INCLUDE_DIR} #Has been set by SuiteParse
  ${CHOLMOD_INCLUDE_DIR} #Has been set by SuiteParse
)

# build shared library.
rosbuild_add_library(lsdslam SHARED ${SOURCE_FILES})
target_link_libraries(lsdslam ${FABMAP_LIB} g2o_core g2o_stuff csparse cxsparse g2o_solver_csparse g2o_csparse_extension g2o_types_sim3 g2o_types_sba X11 opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs)
rosbuild_link_boost(lsdslam thread)


# build live ros node
rosbuild_add_executable(live_slam src/main_live_odometry.cpp)
target_link_libraries(live_slam lsdslam)


# build image node
rosbuild_add_executable(dataset_slam src/main_on_images.cpp)
target_link_libraries(dataset_slam lsdslam)

答案 2 :(得分:0)

你有多版本的Opencv吗?如果你有,也许你应该将OpenCVConfig.cmake的路径添加到CmakeList.txt。就在cmake_minimum_required(VERSION 2.8.12)下面,就像这样:

set(OpenCV_DIR "/home/ubuntu/src/opencv-3.1.0/build")

就是这样。

答案 3 :(得分:-1)

我也有samme问题。由于缺乏代表,无法评论Osian的解决方案,但这是我使用的程序:

sudo apt-get remove libopencv*

如果由于某种原因从源代码安装了OpenCV,请输入您的构建目录并执行:

sudo make uninstall

然后终于

sudo apt-get install ros-indigo-desktop-full