Compartir tecnología

Problema de conflicto entre opencv4.6 y opencv4.2 del que depende cv_bridge cuando se ejecuta vins-fusion

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

El error que se ha ajustado durante más de un día finalmente se ha solucionado... y está publicado para su referencia.

1. Para el problema del conflicto entre ejecutar opencv4.6 y cv_bridge llamando a la versión 4.2 de vins-mono y vins-fusion, el proceso de depuración se registra de la siguiente manera:

Gracias a este chico por su código, todo el contenido se puede aplicar correctamente: ubuntu20.04 configuración vins-fusion+opencv4.6
Este artículo también es excelente, puede consultar: ¡Error al ejecutar lvi-sam en ubuntu20.04! Problema de conflicto entre la biblioteca Opencv y el paquete cv_bridge

1. Instale OpenCV 4.6.0

1. Descargue el código fuente de opencv, seleccione la versión requerida de opencv 4.6.0, la extensión correspondiente opencv_contrib 4.6.0 y cv_bridge utilizado para unir ROS y opencv.

Lanzamiento de OpenCV 4.6.0 · opencv/opencv · GitHub
Versión 4.6.0 · opencv/opencv_contrib · GitHub
https://github.com/ros-perception/vision_opencv/tree/

1.1 Instale opencv en /usr/local/opencv-4.6.0, mueva opencv y sus módulos de extensión e ingrese al directorio de trabajo
sudo mv ./opencv-4.6.0/ /usr/local/
sudo mv ./opencv_contirb-4.6.0/ /usr/local/
cd /usr/local/opencv-4.6.0/
  • 1
  • 2
  • 3

Insertar descripción de la imagen aquí

1.2 Antes de compilar, determine la ruta de instalación de opencv. Mi ruta de instalación es CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.6.0.
1.3 Compile opencv 4.6.0, en el que seleccioné todas las opciones relacionadas con cuda como desactivadas y no uso gpu por el momento.
sudo mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE 
        -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.6.0 
        -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.6.0/modules 
        -D WITH_CUDA=OFF 
        -D ENABLE_FAST_MATH=OFF 
        -D CUDA_FAST_MATH=OFF 
        -D WITH_CUBLAS=ON 
        -D WITH_LIBV4L=ON 
        -D WITH_GSTREAMER=ON 
        -D WITH_GSTREAMER_0_10=OFF 
        -D WITH_QT=ON 
        -D WITH_OPENGL=ON 
        -D CUDA_NVCC_FLAGS="--expt-relaxed-constexpr" 
        -D WITH_TBB=ON 
        ..
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
1.4 Si el rendimiento de la computadora es bueno, puede usar make -j8 para compilar multinúcleo. Si ocurren errores de compatibilidad, se recomienda usar make, que es más lento.
make -j8
sudo make install
  • 1
  • 2

2. Configure el paquete de funciones cv_bridge

1 Debido a que los datos opencv y ROS deben convertirse, es necesario utilizar la herramienta de puente cv_bridge. A continuación, presentaremos cómo descargar, instalar y configurar su propio paquete de funciones cv_bridge.

2. Primero crea un espacio de trabajo ros.

mkdir -r ~/third/cv_bridge_ws/src/
cd ~/cv_bridge_ws/src/
  • 1
  • 2

3. Luego, descargue el código fuente de la versión correspondiente. Como es Ubuntu 20.04, descargue la versión noética.

GitHub - ros-perception/vision_opencv en noetic

4. Después de descargarlo, extráigalo al directorio ~/third/cv_bridge_ws/src/. Dado que solo necesitamos cv_bridge, solo necesitamos conservar la carpeta cv_bridge, colocarla en ~/third/cv_bridge_ws/src/ y luego modificar la configuración. del documento cv_bridge.Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

4.1 Modifique el archivo CMakeLists.txt: agregue su ruta de instalación de opencv delante de set(_opencv_version 4), probablemente en la línea 20
set(Opencv_DIR /usr/local/opencv-4.6.0/build)
set(_opencv_version 4)
find_package(OpenCV 4 QUIET)
  • 1
  • 2
  • 3
4.2 Además, dado que el cv_bridge que hice yo corresponde al paquete de funciones de la versión opencv 4.6.0, es mejor cambiar el nombre del paquete aquí. Lo cambié a my_cv_bridge.
4.3 El contenido de todo el archivo cmakelists es el siguiente;
cmake_minimum_required(VERSION 3.0.2)
project(my_cv_bridge)

find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)

if(NOT ANDROID)
  find_package(PythonLibs)

  if(PYTHONLIBS_VERSION_STRING VERSION_LESS "3.8")
    # Debian Buster
    find_package(Boost REQUIRED python37)
  else()
    # Ubuntu Focal
    find_package(Boost REQUIRED python)
  endif()
else()
find_package(Boost REQUIRED)
endif()

set(Opencv_DIR /usr/local/opencv-4.6.0/build)
set(_opencv_version 4)
find_package(OpenCV 4 QUIET)
if(NOT OpenCV_FOUND)
  message(STATUS "Did not find OpenCV 4, trying OpenCV 3")
  set(_opencv_version 3)
endif()

find_package(OpenCV ${_opencv_version} REQUIRED
  COMPONENTS
    opencv_core
    opencv_imgproc
    opencv_imgcodecs
  CONFIG
)

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES ${PROJECT_NAME}
  CATKIN_DEPENDS rosconsole sensor_msgs
  DEPENDS OpenCV
  CFG_EXTRAS cv_bridge-extras.cmake
)

catkin_python_setup()

include_directories(include ${Boost_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

if(NOT ANDROID)
add_subdirectory(python)
endif()
add_subdirectory(src)
if(CATKIN_ENABLE_TESTING)
  add_subdirectory(test)
endif()
# install the include folder
install(
  DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
4.5 Modificar package.xml y cambiar el nombre del paquete de funciones
<package format="2">
#  <name>cv_bridge</name>
  <name>my_cv_bridge</name>
  • 1
  • 2
  • 3
4.6 Compile el paquete de funciones cv_bridge
cd ~/cv_bridge_ws/
catkin_make
  • 1
  • 2
4.7 Si la compilación es exitosa, se completa la producción del paquete de funciones my_cv_bridge, lo que también significa que opencv 4.6.0 se ha instalado correctamente y el paquete de funciones my_cv_bridge se puede conectar correctamente a la versión de opencv instalada por nosotros mismos. agregue la ruta de este paquete de funciones a la carpeta ~/.bashrc, para que podamos llamar a este paquete de funciones my_cv_bridge al compilar vins-fusion más adelante, abra la carpeta ~/.bashrc y agregue el siguiente comando al final
source ~/cv_bridge_ws/devel/setup.bash
  • 1
4.8 Finalmente, obtenga la ruta actual en la terminal

fuente ~/.bas在这里插入代码片derechos humanos

3. Compile vins-fusion

1. Ingrese al espacio de trabajo de vins-fusion cd ~/vins-fusion

2. Modifique el archivo vins_estimator/CMakeLists.txt

2.1 Cambiar cv_bridge a my_cv_bridge
find_package(catkin REQUIRED COMPONENTS
    roscpp
    std_msgs
    geometry_msgs
    nav_msgs
    tf
    cv_bridge_460
    camera_models
    image_transport)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
2.2 Agregar la ruta del paquete de funciones cv_bridge_460 y la ruta de opencv-4.6.0
set(my_cv_bridge_DIR "/home/lemontech/thirdlib/cv_bridge_ws/devel/share/my_cv_bridge/cmake")

set(OpenCV_DIR "/usr/local/opencv-4.6.0/bulid/")
  • 1
  • 2
  • 3
2.3 Asegúrese de que la biblioteca cv_bridge esté correctamente instalada y vinculada
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1

3 Modificar loop_fusion

3.1 Archivo CMakeLists.txt
find_package(catkin REQUIRED COMPONENTS
    roscpp
    std_msgs
    nav_msgs
    camera_models
    my_cv_bridge
    roslib
    )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
3.2 Agregue la ruta del paquete de funciones cv_bridge_460 y la ruta de opencv-4.6.0
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/home/lemontech/thirdlib/cv_bridge_ws/devel")
set(my_cv_bridge_DIR "/home/lemontech/thirdlib/cv_bridge_ws/devel/share/my_cv_bridge/cmake")
#-DEIGEN_USE_MKL_ALL")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")

set(OpenCV_DIR "/usr/local/opencv-4.6.0/bulid/")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
3.3 Asegúrese de que la biblioteca cv_bridge esté correctamente instalada y vinculada
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS}  ${EIGEN3_INCLUDE_DIR} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1
3.4 Archivo cmakelist completo
cmake_minimum_required(VERSION 2.8.3)
project(loop_fusion)

set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++17")
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/home/lemontech/thirdlib/cv_bridge_ws/devel")
set(my_cv_bridge_DIR "/home/lemontech/thirdlib/cv_bridge_ws/devel/share/my_cv_bridge/cmake")
#-DEIGEN_USE_MKL_ALL")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")

set(OpenCV_DIR "/usr/local/opencv-4.6.0/bulid/")

find_package(catkin REQUIRED COMPONENTS
    roscpp
    std_msgs
    nav_msgs
    camera_models
    my_cv_bridge
    roslib
    )

find_package(OpenCV)


find_package(Ceres REQUIRED)

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
find_package(Eigen3)

include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS}  ${EIGEN3_INCLUDE_DIR} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
catkin_package()

add_executable(loop_fusion_node
    src/pose_graph_node.cpp
    src/pose_graph.cpp
    src/keyframe.cpp
    src/utility/CameraPoseVisualization.cpp
    src/ThirdParty/DBoW/BowVector.cpp
    src/ThirdParty/DBoW/FBrief.cpp
    src/ThirdParty/DBoW/FeatureVector.cpp
    src/ThirdParty/DBoW/QueryResults.cpp
    src/ThirdParty/DBoW/ScoringObject.cpp
    src/ThirdParty/DUtils/Random.cpp
    src/ThirdParty/DUtils/Timestamp.cpp
    src/ThirdParty/DVision/BRIEF.cpp
    src/ThirdParty/VocabularyBinary.cpp
    )

target_link_libraries(loop_fusion_node ${catkin_LIBRARIES}  ${OpenCV_LIBS} ${CERES_LIBRARIES}) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

4. Compilación exitosa

Si la compilación es exitosa y el paquete de funciones my_cv_bridge en find_package se puede identificar correctamente, los tres archivos anteriores se pueden obtener en el archivo de desarrollo de vins-fusion.Es lo mismo que instalar el cv_bridge oficial, excepto que el paquete oficial está en opt/ros/noetic/…
Insertar descripción de la imagen aquí

5. Sin embargo, una compilación exitosa no significa una operación exitosa...

Insertar descripción de la imagen aquí

Este error ocurre Bueno, es un conflicto entre opencv4.2 y 4.6, pero obviamente reemplacé cv_bridge y opencv con el mío. ! Entonces. . . Revisé cv_bridge-extras.cmake en my_cv_bridge/cmake y descubrí que todavía dice 4.2.

  1. A continuación se muestra la versión correcta después de la modificación.
    a (1) Cambie la versión a 4.6.
    b. (2) La ruta de configuración de opencv_config_path se encuentra en /usr/local/opencv-4.6.0/lib/cmake/opencv4
    Insertar descripción de la imagen aquí

  2. Luego, abrí /usr/local/opencv-4.6.0/lib/cmake/opencv4 y descubrí que el conjunto (OpenCV_VERSION 4.2.0) en la imagen de abajo decía 4.2, no 4.6. ¡Corregir y recompilar!

rm -rf build
mkdir build && cd build
cmake ..
make -j8
  • 1
  • 2
  • 3
  • 4

Insertar descripción de la imagen aquí

  1. Luego vuelva a compilar el cv_bridge_ws anterior y luego ejecute vins-fusion y se ejecutará normalmente.

6. Respecto al problema de desinstalación de la versión opencv4.2
  1. Para garantizar que los archivos de otras versiones no se eliminen accidentalmente, puede utilizar comodines para eliminar todos los archivos de la biblioteca de la versión 4.2:
sudo rm /usr/local/lib/libopencv_*4.2*
  • 1

Entonces puede haber archivos relacionados en /var y utilizar el mismo método de eliminación.
2. Verifique la ruta relacionada con la biblioteca opencv. Todos los archivos de enlace de la biblioteca se encuentran en este archivo:

sudo find / -iname "*opencv*"
  • 1
  1. Actualizar la caché de la biblioteca de vínculos dinámicos
sudo ldconfig
  • 1
  1. Desinstale el cv_bridge original sudo apt-get remove ros-melodic-cv-bridge, descargue su propia versión de cv_bridge correspondiente a ros y vincúlelo al opencv especificado [¿Se puede desinstalar esto o no? ? Lo quité]

7. Acerca del archivo cmakelist

set(CMAKE_CXX_FLAGS "-std=c++17")指定了c++17标准进行编译
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/home/lemontech/thirdlib/cv_bridge_ws/devel") 这个设置将/home/lemontech/thirdlib/cv_bridge_ws/devel路径添加到cmake的前缀路径中,以便CMake可以在路径中找到依赖项和包
set(my_cv_bridge_DIR "/home/lemontech/thirdlib/cv_bridge_ws/devel/share/my_cv_bridge/cmake")设置置顶了my_cv_bridge包的CMake配置文件路径,以便CMake可以找到并使用这个包
find_package(catkin REQUIRED COMPONENTS
my_cv_bridge
roscpp
)用于查找并配置指定的catkin包和组件,catkin是ros的构建系统,REQUIRED表示这些组件是必须的,如果缺少,会报错)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7