cv_bridge和openCV不兼容问题

1. cv_bridge不兼容问题

问题:NumPy 升级到 2.0+ 后与 ROS Noetic 的 cv_bridge 模块不兼容,但我又必须在conda环境下运行

A module that was compiled using NumPy 1.x cannot be run in NumPy 2.0.2 as it may crash. To support both 1.x and 2.x versions of NumPy, modules must be compiled with NumPy 2.0. Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.

If you are a user of the module, the easiest solution will be to downgrade to 'numpy<2' or try to upgrade the affected module. We expect that some modules will need time to support NumPy 2.

解决:不用ros noetic的cv_bridge,自己编译cv_bridge与conda环境的NumPy兼容

1)激活 Conda 环境

bash 复制代码
conda activate env_xxx
bash 复制代码
mkdir /cv_ws/src
cd ~/cv_ws/src
git clone https://github.com/ros-perception/vision_opencv.git
cd vision_opencv
git checkout noetic

确认 Python 和 NumPy 都是 Conda 的:

bash 复制代码
which python
python -c "import numpy; print(numpy.__version__)"

2)安装必要依赖

bash 复制代码
sudo apt install python3-dev python3-numpy
sudo apt install ros-noetic-cv-bridge ros-noetic-vision-opencv

3)克隆源码

bash 复制代码
mkdir -p /cv_ws/src
cd ~/cv_ws/src
git clone https://github.com/ros-perception/vision_opencv.git
cd vision_opencv
git checkout noetic

4)修改编译配置

进入 cv_bridge 目录:

bash 复制代码
cd cv_bridge

修改CMakeLists.txt(~/cv_ws/src/vision_opencv/cv_bridge/CMakeLists.txt)

bash 复制代码
cmake_minimum_required(VERSION 3.0.2)
project(cv_bridge)

# 手动指定 Conda Python 环境路径
set(PYTHON_EXECUTABLE "/home/username/miniconda3/envs/CTSAC/bin/python")
set(PYTHON_INCLUDE_DIR "/home/username/miniconda3/envs/CTSAC/include/python3.9")
set(PYTHON_INCLUDE_DIRS "/home/username/miniconda3/envs/CTSAC/include/python3.9")
set(PYTHON_LIBRARY "/home/username/miniconda3/envs/CTSAC/lib/libpython3.9.so")
set(PYTHON_LIBRARIES "/home/username/miniconda3/envs/CTSAC/lib/libpython3.9.so")

# 指定 Boost 的搜索路径到 conda 环境
set(BOOST_ROOT "/home/username/miniconda3/envs/CTSAC")
set(Boost_NO_SYSTEM_PATHS TRUE)
set(Boost_INCLUDE_DIR "${BOOST_ROOT}/include")
set(Boost_LIBRARY_DIR "${BOOST_ROOT}/lib")

find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)

# 强制使用预设的 Python 变量,防止 find_package 覆盖
set(PYTHONLIBS_FOUND TRUE)
set(PythonLibs_FOUND TRUE)
find_package(PythonLibs REQUIRED)

# 再次确保变量设置正确(防止被 find_package 覆盖)
set(PYTHON_LIBRARY "/home/username/miniconda3/envs/CTSAC/lib/libpython3.9.so")
set(PYTHON_LIBRARIES "/home/username/miniconda3/envs/CTSAC/lib/libpython3.9.so")

if(NOT ANDROID)
  find_package(Boost REQUIRED COMPONENTS python)
else()
  find_package(Boost REQUIRED)
endif()

# 尝试找到 OpenCV
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}
  ${PYTHON_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(
  DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)

修改修改 cv_bridge/src/CMakeLists.txt(~/cv_ws/src/vision_opencv/cv_bridge/src/CMakeLists.txt)

bash 复制代码
# 强制设置 Python 变量(必须在 find_package 之前)
set(PYTHON_EXECUTABLE "/home/username/miniconda3/envs/CTSAC/bin/python")
set(PYTHON_INCLUDE_DIR "/home/username/miniconda3/envs/CTSAC/include/python3.9")
set(PYTHON_INCLUDE_DIRS "/home/username/miniconda3/envs/CTSAC/include/python3.9")
set(PYTHON_INCLUDE_PATH "/home/username/miniconda3/envs/CTSAC/include/python3.9")
set(PYTHON_LIBRARY "/home/username/miniconda3/envs/CTSAC/lib/libpython3.9.so")
set(PYTHON_LIBRARIES "/home/username/miniconda3/envs/CTSAC/lib/libpython3.9.so")
set(PYTHONLIBS_FOUND TRUE)
set(PythonLibs_FOUND TRUE)
set(PYTHON_VERSION_MAJOR 3)
set(PYTHON_VERSION_MINOR 9)

# add library
include_directories(./)
add_library(${PROJECT_NAME} cv_bridge.cpp rgb_colors.cpp)
add_dependencies(${PROJECT_NAME} ${catkin_EXPORTED_TARGETS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBRARIES} ${catkin_LIBRARIES})

install(TARGETS ${PROJECT_NAME}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)

if(NOT ANDROID)
# add a Boost Python library
find_package(PythonInterp REQUIRED)
find_package(PythonLibs "${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}")

# 再次强制设置(防止被 find_package 覆盖)
set(PYTHON_LIBRARY "/home/username/miniconda3/envs/CTSAC/lib/libpython3.9.so")
set(PYTHON_LIBRARIES "/home/username/miniconda3/envs/CTSAC/lib/libpython3.9.so")

#Get the numpy include directory from its python module
if(NOT PYTHON_NUMPY_INCLUDE_DIR)
    execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print(numpy.get_include())"
                    RESULT_VARIABLE PYTHON_NUMPY_PROCESS
                    OUTPUT_VARIABLE PYTHON_NUMPY_INCLUDE_DIR
                    OUTPUT_STRIP_TRAILING_WHITESPACE)

    if(PYTHON_NUMPY_PROCESS EQUAL 0)
       file(TO_CMAKE_PATH "${PYTHON_NUMPY_INCLUDE_DIR}" PYTHON_NUMPY_INCLUDE_CMAKE_PATH)
       set(PYTHON_NUMPY_INCLUDE_DIR ${PYTHON_NUMPY_INCLUDE_CMAKE_PATH} CACHE PATH "Numpy include directory")
    else(PYTHON_NUMPY_PROCESS EQUAL 0)
        message(SEND_ERROR "Could not determine the NumPy include directory, verify that NumPy was installed correctly.")
    endif(PYTHON_NUMPY_PROCESS EQUAL 0)
 endif(NOT PYTHON_NUMPY_INCLUDE_DIR)

include_directories(${PYTHON_INCLUDE_PATH} ${Boost_INCLUDE_DIRS} ${PYTHON_NUMPY_INCLUDE_DIR})

if (PYTHON_VERSION_MAJOR VERSION_EQUAL 3)
  add_definitions(-DPYTHON3)
endif()

add_library(${PROJECT_NAME}_boost module.cpp module_opencv4.cpp)
target_link_libraries(${PROJECT_NAME}_boost ${Boost_LIBRARIES}
                                            ${catkin_LIBRARIES}
                                            ${PROJECT_NAME}
)

if(NOT APPLE)
  target_link_libraries(${PROJECT_NAME}_boost ${PYTHON_LIBRARIES})
endif()

set_target_properties(${PROJECT_NAME}_boost PROPERTIES
                      LIBRARY_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_PYTHON_DESTINATION}/${PROJECT_NAME}/boost/
                      RUNTIME_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_GLOBAL_PYTHON_DESTINATION}/${PROJECT_NAME}/boost/
                      PREFIX ""
)
if(APPLE)
  set_target_properties(${PROJECT_NAME}_boost PROPERTIES
                        SUFFIX ".so")
  set_target_properties(${PROJECT_NAME}_boost PROPERTIES
                        LINK_FLAGS "-undefined dynamic_lookup")
endif()
if(MSVC)
  set_target_properties(${PROJECT_NAME}_boost PROPERTIES
                        SUFFIX ".pyd")
endif()

install(TARGETS ${PROJECT_NAME}_boost DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}/boost/)
endif()

5)编译

bash 复制代码
cd ~/cv_ws
rm -rf build devel
catkin_make
# 或者
catkin_make -DPYTHON_EXECUTABLE=/home/username/miniconda3/envs/CTSAC/bin/python

6)source工作空间

bash 复制代码
source ~/cv_ws/devel/setup.bash
python -c "from cv_bridge import CvBridge; print('cv_bridge OK')"

7)cv_ws的工作空间也要source,而scout_ws工作空间也要source

方法一:把编译顺序写入.bashrc文件

bash 复制代码
nano ~/.bashrc
source /opt/ros/noetic/setup.bash
source ~/scout_ws/devel/setup.bash
source ~/cv_ws/devel/setup.bash


# 保存后
source ~/.bashrc

方法二:合并工作空间

如果cv_bridge只是给scout_ws用的,可以直接把cv_bridge的源码放到scout_ws:

bash 复制代码
cp -r ~/cv_ws/src/vision_opencv ~/scout_ws/src/
cd ~/scout_ws
catkin_make

这样只需要一个工作空间。

8)编译成功后验证方法

bash 复制代码
python -c "import cv_bridge; print('cv_bridge OK')"
相关推荐
归秋1423 分钟前
2026企业AI办公工具选型指南:如何评估具备端到端任务交付能力的平台
大数据·人工智能
IT_陈寒7 分钟前
Redis集群切换主节点时,服务竟然全员掉线
前端·人工智能·后端
打工仔折腾 AI15 分钟前
多台服务器日志分散难查?用Promtail+Loki+Grafana搭建集中检索平台
服务器·人工智能·后端·python·性能优化·django·grafana
2601_9622035119 分钟前
需要本地或私有化部署,又担心硬件和配置成本?快鹭KuWork、OpenOcta、安捷AI、AnythingLLM四款企业级AI智能体办公平台技术对比
人工智能
蜗牛互联网20 分钟前
OLMo-core 3的token gerrymandering提醒:MoE路由要按时间窗验收
java·人工智能·wpf
欢喜躲在眉梢里20 分钟前
时序数据库选型指南:从大数据架构视角拆解 Apache IoTDB 的适用边界
大数据·人工智能·ai·架构·时序数据库·模型
勤劳X码农21 分钟前
2026年抖音AI配音软件怎么选?
人工智能
打不了嗝 ᥬ᭄25 分钟前
AI-Agent入门
人工智能·agent
Dawson Zhu26 分钟前
Cookbook Agent:拓扑Codebook方法与多Agent通信效率优化
人工智能·语言模型·架构·aigc·agi
打工仔折腾 AI27 分钟前
DiPlay 实测:iPhone 绕过硬件盒子直连 BYD 车机的思路拆解
android·人工智能·后端·python·gradle·iphone·ai agent 实战