【问题标题】:How to correctly link opencv3 under ROS Indigo (using CMake)?如何在 ROS Indigo(使用 CMake)下正确链接 opencv3?
【发布时间】:2016-09-30 09:05:03
【问题描述】:

我无法链接我自己安装的 opencv3 与 ros 分开。收到此错误

../devel/lib/libirTest.so: undefined reference to `cv::ORB::create(int, float, int, int, int, int, int, int, int)'
../devel/lib/libirTest.so: undefined reference to `cv::calcOpticalFlowPyrLK(cv::_InputArray const&, cv::_InputArray const&, cv::_InputArray const&, cv::_InputOutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, cv::Size_<int>, int, cv::TermCriteria, int, double)'

但是,我能够在 ROS 外部成功编译;也就是说,使用没有ROS的类似包....这是我在ROS下使用的CMake文件(不起作用)

cmake_minimum_required(VERSION 2.8.3)
project(my_test_pkg)

SET(SRC ${CMAKE_CURRENT_SOURCE_DIR}/src)

find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  image_transport
  roscpp
  rospy
  std_msgs
  message_generation
  genmsg
)
find_package(nodelet REQUIRED)

################################################
## Declare ROS messages, services and actions ##
################################################

 add_message_files(
   FILES
    velocity_trsl.msg 
   )

  generate_messages(
    DEPENDENCIES
    std_msgs
    )

catkin_package(
  CATKIN_DEPENDS message_generation cv_bridge image_transport roscpp rospy std_msgs
)

###########
## Build ##
###########
include_directories(
  ${catkin_INCLUDE_DIRS}
  )


#***********************
#******   GSL
#***********************
find_package( PkgConfig REQUIRED)
pkg_check_modules( gsl REQUIRED gsl )

#***********************
#******   Boost
#***********************

SET (BOOST_DIR "/home/polar/soft/lib/boost/boost_1_61_0")

FIND_PACKAGE(Boost 1.61.0 REQUIRED thread)
if (NOT Boost_FOUND)
  message(FATAL_ERROR " Fatal error: Boost (version >= 1.55) required.")
else()
  message(STATUS "Setting up BOOST")
  message(STATUS " Includes - ${Boost_INCLUDE_DIRS}")
  message(STATUS " Library  - ${Boost_LIBRARY_DIRS}")
  include_directories(${Boost_INCLUDE_DIRS})
  link_directories(${Boost_LIBRARY_DIRS})
endif (NOT Boost_FOUND)   

#***********************
#******   OpenCV
#***********************
find_package( OpenCV 3.1.0 REQUIRED )
find_package( OpenCV 3.1.0 REQUIRED PATHS /home/polar/soft/lib/opencv/opencv-3.1.0/cmake)
if (NOT OpenCV_FOUND)
  message(FATAL_ERROR "*****!!!!! opencv NOT found.")
endif (NOT OpenCV_FOUND)    

#****************************************
include_directories(${SRC}/calculus)
SET(MY_LIB
  irTest
  )

#   ALL EXEC FILES...
SET(EXE_TESTER  
   tester1
    )

  add_executable(tester1 ${CMAKE_CURRENT_SOURCE_DIR}/exe-main-files-stdl/testdir/tester1.cpp )

  SET(FILES_2_RUN
    ${EXE_TESTER}
    )


#--------------------------
foreach(file2link ${FILES_2_RUN})
  target_link_libraries(${file2link}
    ${catkin_LIBRARIES}
    ${Boost_LIBRARIES}
    ${gsl_LIBRARIES}
    ${OpenCV_LIBRARIES}
    ${OpenCV_LIBS}
    ${MY_LIB}
    )

  add_dependencies(${file2link} my_test_pkg_generate_messages_cpp)# newlly added for messages!!
endforeach(file2link)  

add_subdirectory(src)

是否应该是正在使用的opencv版本与ROS使用的(v2.4)版本之间的冲突?也许 cv_bridge 或 image_transport 正在造成这个问题......(???)我什至删除了 build/ 和 devel/ 并尝试再次编译,但总是同样的问题......我从来没有花这么长时间比这个问题...

【问题讨论】:

  • Here 这似乎暗示 OpenCV 3 应该是当今 ROS 的默认设置。
  • 我重新安装了 ubuntu 14 和 ROS Indigo 并尝试编译但仍然是同样的问题。但是,它在带有 ROS Kinetic 的 ubuntu 16 下运行良好。请注意,我采用了在 Indigo 下不起作用的相同包,该包现在仍然可以正常工作......但仍然无法将我的 ros 包与我自己安装的 opencv 链接
  • @polar 你有没有设法在 ubuntu 14 上解决这个问题,或者你是否以升级结束?

标签: c++ cmake opencv3.0 ros catkin


【解决方案1】:

我能够在 ROS indigo 下将 ROS 项目与 opencv 3.1 链接。请注意,opencv 2.4 仍然是 indigo 下的默认版本,所以这会变得很棘手,因此会出现 YMMV。

首先,您需要安装 ros-indigo-opencv3 软件包。有可能通过手动指定路径来实现源路径,但我还没有测试过。

确保在您的 CMakeLists.txt 中包含 ${OpenCV_INCLUDE_DIRS} 并与 ${OpenCV_LIBRARIES} 链接:

find_package(OpenCV 3 REQUIRED)
include_directories(
  ${catkin_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS}
)
add_library(your_node src/your_node.cpp)
target_link_libraries(your_node ${catkin_LIBRARIES} ${OpenCV_LIBRARIES} )

最后,因为 ros opencv 绑定仅针对 opencv 2.4 编译,所以您需要在编译之前将 vision_opencv 存储库 (https://github.com/ros-perception/vision_opencv) 克隆到您的工作区中。这将确保与 opencv 3 的绑定链接。

【讨论】:

  • 还是同样的问题......这是我所做的总结:1)sudo apt-get install ros-indigo-opencv3 2)roscd workspace/src 3)git clone https://github.com/ros-perception/vision_opencv.git
  • 我也应该修改 package.xml 吗?
  • 我试过这个answers.ros.org/question/214043/… ...但还是没有
【解决方案2】:

我同时使用Opencv2.4.8opencv3.1ros indigoopencv3.1 是从主目录-/home/xxx/opencv3_install 下的源代码安装的。

优点是我使用opencv2.4.8的旧包不需要更改任何代码,因为默认的opencv版本是2.4.8

当需要opencv3.1 时,应设置CMAKE_PREFIX_PATH 以查找库。

set(CMAKE_PREFIX_PATH "/home/xxx/opencv3_install")
find_package(OpenCV 3.1 REQUIRED)
set(OpenCV_INCLUDE_DIRS "/home/xxx/opencv3_install/include")

另外,安装opencv3.1后需要重新编译cv_bridge

【讨论】:

    猜你喜欢
    • 2015-03-06
    • 1970-01-01
    • 2017-06-30
    • 2015-10-24
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多