Technologieaustausch

Konfliktproblem zwischen opencv4.6 und opencv4.2, von dem cv_bridge abhängt, wenn vins-fusion ausgeführt wird

2024-07-12

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

Der Fehler, der seit mehr als einem Tag behoben wurde, wurde endlich behoben ... und wird als Referenz veröffentlicht.

1. Für das Konfliktproblem zwischen der Ausführung von opencv4.6 und cv_bridge beim Aufrufen der Version 4.2 von vins-mono und vins-fusion wird der Debugging-Prozess wie folgt aufgezeichnet:

Dank dieses Mannes für seinen Code können alle Inhalte korrekt angewendet werden: ubuntu20.04-Konfiguration vins-fusion+opencv4.6
Dieser Artikel ist auch großartig, Sie können sich auf Folgendes beziehen: Fehler beim Ausführen von lvi-sam unter Ubuntu20.04! Konfliktproblem zwischen Opencv-Bibliothek und cv_bridge-Paket

1. Installieren Sie OpenCV 4.6.0

1. Laden Sie den OpenCV-Quellcode herunter, wählen Sie die erforderliche Version OpenCV 4.6.0, die entsprechende Erweiterung OpenCV_Contrib 4.6.0 und die CV_Bridge aus, die zum Überbrücken von ROS und OpenCV verwendet wird

Release OpenCV 4.6.0 · opencv/opencv · GitHub
Version 4.6.0 · opencv/opencv_contrib · GitHub
https://github.com/ros-perception/vision_opencv/tree/

1.1 Installieren Sie opencv unter /usr/local/opencv-4.6.0, verschieben Sie opencv und seine Erweiterungsmodule und geben Sie das Arbeitsverzeichnis ein
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

Fügen Sie hier eine Bildbeschreibung ein

1.2 Bestimmen Sie vor dem Kompilieren den Installationspfad von opencv. Mein Installationspfad ist CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.6.0
1.3 Kompilieren Sie opencv 4.6.0, in dem ich alle cuda-bezogenen Optionen deaktiviert habe und vorerst keine GPU verwende.
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 Wenn die Computerleistung gut ist, können Sie make -j8 zum Kompilieren von Multicores verwenden. Wenn Kompatibilitätsfehler auftreten, wird empfohlen, make zu verwenden, was langsamer ist.
make -j8
sudo make install
  • 1
  • 2

2. Konfigurieren Sie das Funktionspaket cv_bridge

1 Da opencv-Daten und ROS-Daten konvertiert werden müssen, ist die Verwendung des cv_bridge-Bridging-Tools erforderlich. Als Nächstes stellen wir vor, wie Sie Ihr eigenes cv_bridge-Funktionspaket herunterladen, installieren und konfigurieren.

2. Erstellen Sie zunächst einen Ros-Arbeitsbereich

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

3. Laden Sie dann den Quellcode der entsprechenden Version herunter. Da es sich um Ubuntu 20.04 handelt, laden Sie die Noetic-Version herunter.

GitHub - ros-perception/vision_opencv bei noetic

4. Extrahieren Sie es nach dem Herunterladen in das Verzeichnis ~/third/cv_bridge_ws/src/. Da wir nur cv_bridge benötigen, müssen wir nur den Ordner cv_bridge behalten, ihn in ~/third/cv_bridge_ws/src/ ablegen und dann die Konfiguration ändern von cv_bridge.Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

4.1 Ändern Sie die Datei CMakeLists.txt: Fügen Sie Ihren opencv-Installationspfad vor set(_opencv_version 4) hinzu, wahrscheinlich in Zeile 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 Da die von mir erstellte cv_bridge dem Funktionspaket der opencv 4.6.0-Version entspricht, ist es außerdem am besten, den Paketnamen hier in my_cv_bridge zu ändern.
4.3 Der Inhalt der gesamten cmakelists-Datei ist wie folgt;
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 Ändern Sie package.xml und ändern Sie den Namen des Funktionspakets
<package format="2">
#  <name>cv_bridge</name>
  <name>my_cv_bridge</name>
  • 1
  • 2
  • 3
4.6 Kompilieren Sie das Funktionspaket cv_bridge
cd ~/cv_bridge_ws/
catkin_make
  • 1
  • 2
4.7 Wenn die Kompilierung erfolgreich ist, ist die Produktion des Funktionspakets my_cv_bridge abgeschlossen, was auch bedeutet, dass opencv 4.6.0 korrekt installiert wurde und das Funktionspaket my_cv_bridge korrekt mit der von uns installierten opencv-Version verbunden werden kann Fügen Sie den Pfad dieses Funktionspakets zum Ordner ~/.bashrc hinzu, damit wir dieses Funktionspaket my_cv_bridge später beim Kompilieren von vins-fusion aufrufen können, öffnen Sie den Ordner ~/.bashrc und fügen Sie am Ende den folgenden Befehl hinzu
source ~/cv_bridge_ws/devel/setup.bash
  • 1
4.8 Geben Sie abschließend den aktuellen Pfad im Terminal ein

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

3. Kompilieren Sie vins-fusion

1. Rufen Sie den vins-fusion-Arbeitsbereich cd ~/vins-fusion auf

2. Ändern Sie die Datei vins_estimator/CMakeLists.txt

2.1 Ändern Sie cv_bridge in 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 Fügen Sie den Pfad des Funktionspakets cv_bridge_460 und den Pfad von opencv-4.6.0 hinzu
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 Stellen Sie sicher, dass die cv_bridge-Bibliothek korrekt installiert und verknüpft ist
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1

3 Ändern Sie loop_fusion

3.1 CMakeLists.txt-Datei
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 Fügen Sie den Pfad des Funktionspakets cv_bridge_460 und den Pfad von opencv-4.6.0 hinzu
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 Stellen Sie sicher, dass die cv_bridge-Bibliothek korrekt installiert und verknüpft ist
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS}  ${EIGEN3_INCLUDE_DIR} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1
3.4 Vollständige cmakelist-Datei
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. Kompilierung erfolgreich

Wenn die Kompilierung erfolgreich ist und das Funktionspaket my_cv_bridge in find_package korrekt identifiziert werden kann, können die oben genannten drei Dateien in der Entwicklungsdatei von vins-fusion abgerufen werden.Es ist dasselbe wie die Installation der offiziellen cv_bridge, außer dass sich das offizielle Paket in opt/ros/noetic/… befindet.
Fügen Sie hier eine Bildbeschreibung ein

5. Eine erfolgreiche Kompilierung bedeutet jedoch nicht einen erfolgreichen Betrieb ...

Fügen Sie hier eine Bildbeschreibung ein

Dieser Fehler tritt auf. Nun, es ist ein Konflikt zwischen opencv4.2 und 4.6, aber ich habe offensichtlich cv_bridge und opencv durch mein eigenes ersetzt! ! Dann. . . Ich habe cv_bridge-extras.cmake unter my_cv_bridge/cmake überprüft und festgestellt, dass dort immer noch 4.2 steht!!!

  1. Nachfolgend finden Sie die korrekte Version nach der Änderung
    a. (1) Ändern Sie die Version auf 4.6
    B. (2) opencv_config_path - Verzeichnis/usr/local/opencv-4.6.0/lib/cmake/opencv4
    Fügen Sie hier eine Bildbeschreibung ein

  2. Dann habe ich /usr/local/opencv-4.6.0/lib/cmake/opencv4 geöffnet und festgestellt, dass der Satz (OpenCV_VERSION 4.2.0) im Bild unten 4.2 und nicht 4.6 lautet!!! Korrigieren und neu kompilieren

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

Fügen Sie hier eine Bildbeschreibung ein

  1. Kompilieren Sie dann cv_bridge_ws oben neu und führen Sie dann vins-fusion aus, damit es normal ausgeführt wird.

6. Bezüglich des Deinstallationsproblems der opencv4.2-Version
  1. Um sicherzustellen, dass Dateien anderer Versionen nicht versehentlich gelöscht werden, können Sie Platzhalter verwenden, um alle Bibliotheksdateien der Version 4.2 zu löschen:
sudo rm /usr/local/lib/libopencv_*4.2*
  • 1

Dann befinden sich möglicherweise verwandte Dateien in /var und verwenden dieselbe Löschmethode.
2. Überprüfen Sie den Pfad zur opencv-Bibliothek. Die Linkdateien der Bibliothek befinden sich alle unter dieser Datei:

sudo find / -iname "*opencv*"
  • 1
  1. Aktualisieren Sie den Cache der dynamischen Linkbibliothek
sudo ldconfig
  • 1
  1. Deinstallieren Sie die ursprüngliche cv_bridge sudo apt-get remove ros-melodic-cv-bridge, laden Sie Ihre eigene Version von cv_bridge entsprechend ros herunter und verlinken Sie auf die angegebene opencv [Kann dies deinstalliert werden oder nicht? ? Ich habe es entfernt]

7. Über die cmakelist-Datei

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