2016-06-01 109 views
7

我无法链接自己与ros分开安装的opencv3。我得到这个错误如何正确链接ROS Indigo下的opencv3(使用CMake)?

../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 ....这里是CMake的文件正在ROS下使用(即不工作)

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的版本之间有冲突正在使用和(V2 .4)由ROS使用?也许cv_bridge或image_transport正在创建这个问题......(???)我甚至删除了build /和devel /并试图再次编译,但总是出现同样的问题.....我从来没有花费这么长时间,而不是这个问题...

+0

[Here](http://wiki.ros.org/opencv3)它似乎意味着OpenCV 3应该是当今ROS的默认值。 – Antonio

+0

我重新安装了ubuntu 14和ROS Indigo,并尝试编译但仍然是同样的问题。但是,它在ROS Kinetic的ubuntu 16下工作正常。 请注意,我采取了相同的包,但在Indigo下无法正常工作,但现在工作正常的包...但仍然无法将我的ros包与我自己安装的opencv链接起来 – Courier

+0

@polar你有没有设法解决这在Ubuntu 14上,还是你升级结束? – JTIM

回答

2

我能够在ROS靛蓝下将ROS项目与opencv 3.1关联起来。请注意,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}) 

最后,因为罗斯的OpenCV绑定了OpenCV的2.4只编译,你需要克隆vision_opencv库(https://github.com/ros-perception/vision_opencv)在编译之前进入您的工作区。这将确保绑定与opencv 3的链接。

+0

仍然是同样的问题......下面是我所做的总结:1)'sudo apt-get install ros-indigo-opencv3' 2)'roscd workspace/src' 3)'git clone https:// github。 com/ros-perception/vision_opencv.git' – Courier

+0

我也应该修改package.xml吗? – Courier

+0

我试过这个http://answers.ros.org/question/214043/use-ros-indigo-opencv3-alongside-248/ ...但仍然没有 – Courier

1

我正在使用Opencv2.4.8opencv3.1与​​3210。 opencv3.1从主目录下的源安装 -​​。

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

当需要opencv3.1时,应该设置CMAKE_PREFIX_PATH来查找lib。

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被重新编译。