9

ros とは別に自分でインストールした opencv3 をリンクできません。このエラーが発生しています

../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/ を削除して、再度コンパイルしようとしましたが、常に同じ問題が発生します..... この問題ほど長い時間を費やしたことはありません...

4

2 に答える 2

3

ROS indigo の下で ROS プロジェクトを opencv 3.1 にリンクすることができました。indigo では opencv 2.4 がまだデフォルトのバージョンであるため、これはややこしく、したがって 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 と確実にリンクされます。

于 2016-06-01T07:29:38.230 に答える
1

と の両方Opencv2.4.8を使用opencv3.1していros indigoます。はopencv3.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")

さらに、cv_bridgeインストール後に再コンパイルする必要がありますopencv3.1

于 2016-07-11T03:16:09.787 に答える