当前位置: 首页 > news >正文

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 环境

conda activate env_xxx
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 的:

which python
python -c "import numpy; print(numpy.__version__)"

2)安装必要依赖

sudo apt install python3-dev python3-numpy
sudo apt install ros-noetic-cv-bridge ros-noetic-vision-opencv

3)克隆源码

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 目录:

cd cv_bridge

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

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} REQUIREDCOMPONENTSopencv_coreopencv_imgprocopencv_imgcodecsCONFIG
)catkin_package(INCLUDE_DIRS includeLIBRARIES ${PROJECT_NAME}CATKIN_DEPENDS rosconsole sensor_msgsDEPENDS OpenCVCFG_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)

# 强制设置 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_PROCESSOUTPUT_VARIABLE PYTHON_NUMPY_INCLUDE_DIROUTPUT_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 PROPERTIESLIBRARY_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 PROPERTIESSUFFIX ".so")set_target_properties(${PROJECT_NAME}_boost PROPERTIESLINK_FLAGS "-undefined dynamic_lookup")
endif()
if(MSVC)set_target_properties(${PROJECT_NAME}_boost PROPERTIESSUFFIX ".pyd")
endif()install(TARGETS ${PROJECT_NAME}_boost DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}/boost/)
endif()

5)编译

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

6)source工作空间

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文件

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:

cp -r ~/cv_ws/src/vision_opencv ~/scout_ws/src/
cd ~/scout_ws
catkin_make

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

8)编译成功后验证方法

python -c "import cv_bridge; print('cv_bridge OK')"

http://www.dtcms.com/a/482990.html

相关文章:

  • json转excel python pd
  • 上海网站建设排名公司哪家好天蝎网站建设公司
  • 进入网络管理的网站不想用原来的网站模板了就用小偷工具采集了一个可是怎么替换
  • 西安注册公司在哪个网站系统哈尔滨模板网站
  • android 开机启动 无线调试
  • Polaris Officev9.9.12全功能解锁版
  • 云信im在Android的使用
  • 王道数据结构应用题强化表3.1.1-3.1.6
  • JDK 1.8 自动化脚本安装方案
  • 网站备案不通过怎么解决小米网站建设案例
  • 网路原理:UDP协议
  • 什么是区块链主机托管?为何要使用主机托管?
  • R语言空间数据分析实战:机器学习预测、尺度转换与地统计建模
  • 数据结构系列之堆
  • MySQL索引原理
  • 扁平化网站源码云服务器最便宜
  • 一个网站的成功深圳市深企在线技术开发有限公司
  • Python学习-----小游戏之人生重开模拟器(普通版)
  • 上海网站建设的网html网站系统
  • 理解AUROC,AP,F1-scroe,PRO
  • php做网站安全性wordpress 网银
  • 教程上新|重新定义下一代 OCR:IBM 最新开源 Granite-docling-258M,实现端到端的「结构+内容」统一理解
  • 网络原理 -- HTTP
  • 县级门户网站建设的报告网页游戏网站排名
  • 快速创建无线AP热点
  • CSS级联层样式权重和优先级
  • 免费搭建私人网站修改wordpress后台文字
  • 站内推广的方法网络整合营销传播
  • 国际网站建设的目的网站建设预算知乎
  • 瀚海微SD NAND/TF卡:赋能全场景数据存储,定义高效安全新基准