artificial c++ opencv linker ubuntu-14.04 ros

c++ - artificial - OpenCV vincula problemas con ROS



opencv ubuntu ros (4)

Estoy intentando compilar este proyecto (siguiendo las instrucciones dadas). Cuando lo construyo con rosmake , obtengo una serie de undefined reference to cv::String::deallocate() y undefined reference to cv::String::allocate(unsigned long) . Me resulta curioso que me sale un error solo en esas funciones, mientras que el resto de las funciones de OpenCV parecen estar funcionando correctamente.

Sé que esto sucede porque el enlazador no puede encontrar los objetos donde se compilaron estas funciones, pero soy algo nuevo en el sistema de compilación de ROS y no puedo encontrar lo que está mal.

Intenté usar el archivo CMakeLists.txt provisto, y también find_package(OpenCV REQUIRED) y target_link_libraries(xxx xxx ${OpenCV_LIBRARIES}) , sin que eso hiciera ninguna diferencia. Sé que OpenCV está instalado y compilado correctamente (lo he usado antes), y había instalado ROS sin ningún problema.

Estoy usando OpenCV 3, ROS Indigo, Ubuntu 14.04


¿Tienes varias versiones de Opencv? si lo tiene, tal vez debería agregar la ruta a OpenCVConfig.cmake en CmakeList.txt . Justo debajo de cmake_minimum_required(VERSION 2.8.12) , así:

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

Eso es todo.


Estoy usando OpenCV 3.1.0 (Bleeding edge), ROS Indigo, Ubuntu 14.04. Me encontré con problemas similares al intentar compilar LSD-SLAM

Yo añadí:

find_package(OpenCV 3.1.0 REQUIRED COMPONENTS core highgui imgproc imgcodecs)

También agregué opencv libs para orientar bibliotecas de enlaces:

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)

Aquí está mi archivo 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)


También tuve el problema de Samme. No pude comentar la solución de Osian debido a la falta de representante, pero este es el procedimiento que utilicé:

sudo apt-get remove libopencv*

Si por alguna razón tiene OpenCV instalado desde la fuente, ingrese su directorio de compilación y haga lo siguiente:

sudo make uninstall

Entonces finalmente

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


Tenía exactamente el mismo problema: los mismos mensajes de error, la misma configuración. He logrado resolverlo, aunque no estoy exactamente seguro de los pasos que hice que realmente contribuyeron. Por lo que puedo decir, se debió a un conflicto de versiones de OpenCV. Creo que tenía versiones antiguas de OpenCV que abarrotaban mi / usr / include y / usr / local. Desinstalé todos los paquetes de OpenCV (incluidos los de ROS) e incluí mi instalación de origen de OpenCV3 (también en / usr / local). Luego instalé el paquete ROS vision_opencv, que parecía instalar OpenCV 2.4.8 (por cierto, el recomendado por LSD SLAM). Por supuesto, esto podría ser molesto si necesita OpenCV3 para otras cosas, pero ahora lo tengo como una instalación local en mi directorio de inicio (no pude encontrar la manera de conseguir que ROS vincule esto).

Creo que esto resolvió el problema, el único problema que quedaba era que recibí mensajes de error que decían que no se había encontrado. Esto se debió a que la instalación del paquete lo deja (similar para todos los archivos de inclusión de módulos), mientras que el paso de instalación de make de la instalación de origen los copia en la carpeta principal. Para evitar esto simplemente edité el #include en el único archivo en el que se usa (lsd_slam_core / src / IOWrapper / OpenCV / ImageDisplay_OpenCV.cpp). ¡Eso pareció resolverlo!

Espero que esto ayude, puedo dar más detalles si es necesario.