Partage de technologie

Problème de conflit entre opencv4.6 et opencv4.2 dont dépend cv_bridge lors de l'exécution de vins-fusion

2024-07-12

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

Le bug qui a été ajusté depuis plus d'une journée a finalement été résolu... et est posté pour votre référence.

1. Pour le problème de conflit entre l'exécution d'opencv4.6 et cv_bridge appelant la version 4.2 de vins-mono et vins-fusion, le processus de débogage est enregistré comme suit :

Merci à ce type pour son code, tout le contenu peut être appliqué correctement : configuration ubuntu20.04 vins-fusion+opencv4.6
Cet article est également génial, vous pouvez vous référer à : Erreur lors de l'exécution de lvi-sam sur Ubuntu20.04 ! Problème de conflit entre la bibliothèque Opencv et le package cv_bridge

1. Installez OpenCV 4.6.0

1. Téléchargez le code source opencv, sélectionnez la version requise opencv 4.6.0, l'extension correspondante opencv_contrib 4.6.0 et le cv_bridge utilisé pour relier ROS et opencv

Version d'OpenCV 4.6.0 · opencv/opencv · GitHub
Version 4.6.0 · opencv/opencv_contrib · GitHub
https://github.com/ros-perception/vision_opencv/arbre/

1.1 Installez opencv sous /usr/local/opencv-4.6.0, déplacez opencv et ses modules d'extension et entrez dans le répertoire de travail
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

Insérer la description de l'image ici

1.2 Avant de compiler, déterminez le chemin d'installation d'opencv. Mon chemin d'installation est CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.6.0.
1.3 Compilez opencv 4.6.0, dans lequel j'ai désactivé toutes les options liées à cuda et je n'utilise pas GPU pour le moment.
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 les performances de l'ordinateur sont bonnes, vous pouvez utiliser make -j8 pour compiler multicœur. Si des erreurs de compatibilité se produisent, il est recommandé d'utiliser make, qui est plus lent.
make -j8
sudo make install
  • 1
  • 2

2. Configurez le package de fonctions cv_bridge

1 Étant donné que les données opencv et les données ROS doivent être converties, il est nécessaire d'utiliser l'outil de pontage cv_bridge. Ensuite, nous présenterons comment télécharger, installer et configurer votre propre package de fonctions cv_bridge.

2. Créez d’abord un espace de travail ros

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

3. Ensuite, téléchargez le code source de la version correspondante. Puisqu'il s'agit d'Ubuntu 20.04, téléchargez la version noétique.

GitHub - ros-perception/vision_opencv chez noetic

4. Après le téléchargement, extrayez-le dans le répertoire ~/third/cv_bridge_ws/src/ Puisque nous n'avons besoin que de cv_bridge, il nous suffit de conserver le dossier cv_bridge, de le placer dans ~/third/cv_bridge_ws/src/ puis de modifier la configuration. du document cv_bridge.Insérer la description de l'image ici

Insérer la description de l'image ici

4.1 Modifiez le fichier CMakeLists.txt : ajoutez votre chemin d'installation opencv devant set(_opencv_version 4), probablement à la ligne 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 De plus, puisque le cv_bridge créé par moi-même correspond au package de fonctions de la version opencv 4.6.0, il est préférable de changer le nom du package, je l'ai changé en my_cv_bridge ici.
4.3 Le contenu de l'intégralité du fichier cmakelists est le suivant :
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 Modifier package.xml et changer le nom du package de fonctions
<package format="2">
#  <name>cv_bridge</name>
  <name>my_cv_bridge</name>
  • 1
  • 2
  • 3
4.6 Compiler le package de fonctions cv_bridge
cd ~/cv_bridge_ws/
catkin_make
  • 1
  • 2
4.7 Si la compilation réussit, la production du package de fonctions my_cv_bridge est terminée, ce qui signifie également qu'opencv 4.6.0 a été correctement installé et que le package de fonctions my_cv_bridge peut être correctement connecté à la version opencv installée par nous-mêmes. ajoutez le chemin de ce package de fonctions au dossier ~/.bashrc, afin que nous puissions appeler ce package de fonctions my_cv_bridge lors de la compilation de vins-fusion ultérieurement, ouvrez le dossier ~/.bashrc et ajoutez la commande suivante à la fin
source ~/cv_bridge_ws/devel/setup.bash
  • 1
4.8 Enfin, recherchez le chemin actuel dans le terminal

source ~/.bas在这里插入代码片hrc

3. Compiler des vins-fusion

1. Entrez dans l'espace de travail vins-fusion cd ~/vins-fusion

2. Modifiez le fichier vins_estimator/CMakeLists.txt

2.1 Remplacez cv_bridge par 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 Ajouter le chemin du package de fonctions cv_bridge_460 et le chemin d'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 Assurez-vous que la bibliothèque cv_bridge est correctement installée et liée
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1

3 Modifier loop_fusion

3.1 Fichier 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 Ajouter le chemin du package de fonctions cv_bridge_460 et le chemin d'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 Assurez-vous que la bibliothèque cv_bridge est correctement installée et liée
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS}  ${EIGEN3_INCLUDE_DIR} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1
3.4 Fichier cmakelist complet
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. Compilation réussie

Si la compilation réussit et que le package de fonctions my_cv_bridge dans find_package peut être correctement identifié, les trois fichiers ci-dessus peuvent être obtenus dans le fichier de développement de vins-fusion.C'est la même chose que l'installation du cv_bridge officiel, sauf que le package officiel est dans opt/ros/noetic/…
Insérer la description de l'image ici

5. Cependant, une compilation réussie ne signifie pas une opération réussie...

Insérer la description de l'image ici

Cette erreur se produit. Eh bien, c'est un conflit entre opencv4.2 et 4.6, mais j'ai évidemment remplacé cv_bridge et opencv par les miens ! ! Alors. . . J'ai vérifié cv_bridge-extras.cmake sous my_cv_bridge/cmake et j'ai découvert qu'il était toujours indiqué 4.2 !!!

  1. Ci-dessous la version correcte après modification
    a. (1) Changer la version en 4.6
    b. (2) Le chemin d'accès opencv_config se trouve dans /usr/local/opencv-4.6.0/lib/cmake/opencv4
    Insérer la description de l'image ici

  2. Ensuite, j'ai ouvert /usr/local/opencv-4.6.0/lib/cmake/opencv4 et j'ai découvert que l'ensemble (OpenCV_VERSION 4.2.0) dans l'image ci-dessous disait 4.2, pas 4.6 !!!

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

Insérer la description de l'image ici

  1. Recompilez ensuite le cv_bridge_ws ci-dessus, puis exécutez vins-fusion et il fonctionnera normalement.

6. Concernant le problème de désinstallation de la version opencv4.2
  1. Pour garantir que les fichiers d'autres versions ne sont pas supprimés accidentellement, vous pouvez utiliser des caractères génériques pour supprimer tous les fichiers de la bibliothèque de la version 4.2 :
sudo rm /usr/local/lib/libopencv_*4.2*
  • 1

Ensuite, il peut y avoir des fichiers associés dans /var et utiliser la même méthode de suppression.
2. Vérifiez le chemin lié à la bibliothèque opencv. Les fichiers de lien de bibliothèque se trouvent tous sous ce fichier :

sudo find / -iname "*opencv*"
  • 1
  1. Mettre à jour le cache de la bibliothèque de liens dynamiques
sudo ldconfig
  • 1
  1. Désinstallez le cv_bridge original sudo apt-get Remove ros-melodic-cv-bridge, téléchargez votre propre version de cv_bridge correspondant à ros et créez un lien vers l'opencv spécifié [Cela peut-il être désinstallé ou non ? ? Je l'ai supprimé]

7. À propos du fichier 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