【ROS | OpenCV】在ROS中实现多版本OpenCV、cv_bridge共存:安装与配置指南
在 Ubuntu 20.04 中,ROS Noetic 默认安装的 OpenCV 版本为 4.2.0。如果您需要确认系统中已安装的 OpenCV 版本,可以使用以下命令:
sudo find / -iname "*opencv*"
然而,许多开源算法都是基于 OpenCV 3 编写的,如果要修改代码就非常麻烦。另一方面,一些程序可能可能又依赖高版本的OpenCV,比如4.5版本。这时就需要在系统中安装多个版本的OpenCV。
为了实现多个版本的共存,我们希望在不删除自带的 OpenCV 4 的情况下,编译安装 OpenCV 3 及其 contrib 库,并使得 cv_bridge 能够支持多版本。
本教程将介绍在不影响ROS中自带的 OpenCV 和 cv_bridge 的情况下,如何实现多版本 OpenCV 和 cv_bridge 的共存,并且将说明如何修改 CMakeLists 文件来找到指定版本的OpenCV和cv_bridge。本教程理论上对Ubuntu版本与ROS版本没有限制,并且对安装的OpenCV大版本(3或4)也没有要求。只需要注意OpenCV 3 的cv_bridge对应为melodic,而OpenCV 4则为noetic,在下载源码时选择对应版本即可。
0. 安装OpenCV依赖项
首先,更新源以确保系统处于最新状态:
sudo apt update
接着,安装所需的依赖项:
sudo apt-get install build-essential cmake git pkg-config libavcodec-dev libavformat-dev libswscale-dev libatlas-base-dev gfortran zlib1g-dev ccache autoconf automake libtool checkinstall
为了解决依赖问题,需要添加新的源。然后,安装 libjasper:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
接下来,安装常用的图像工具包以及视频 I/O 包:
sudo apt-get install libjpeg-dev libjpeg8-dev libtiff5-dev libjasper-dev libpng-dev
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
1. 编译 OpenCV 3 及其 contrib 库的源代码:
接下来,需要下载并编译 OpenCV 3 的源代码。可以从官方GitHub下载源代码,并按照以下步骤进行编译安装:
首先,下载 OpenCV 3 的源代码并切换到对应版本:
git clone https://github.com/opencv/opencv.git -b 3.4.14
mv opencv opencv3.4.14
cd opencv3.4.14
接着,下载 OpenCV contrib 模块(请注意版本的对应):
git clone https://github.com/opencv/opencv_contrib.git -b 3.4.14
然后,返回到 opencv 目录,并创建并进入 build 目录:
cd ../
mkdir build
cd build
接下来,配置 OpenCV 的编译选项:
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \-DCMAKE_BUILD_TYPE=RELEASE \-DWITH_TBB=ON \-DWITH_V4L=ON \-DCMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.14 \-DBUILD_opencv_vtk=OFF \-DWITH_VTK=OFF \..
执行完毕后你大概率会看到编译出现错误:
-- Configuring incomplete, errors occurred!
See also "/home/user/libraries/opencv3.4.14/build/CMakeFiles/CMakeOutput.log".
See also "/home/user/libraries/opencv3.4.14/build/CMakeFiles/CMakeError.log".
这里的错误来自于各种各样的依赖项没有找到或者没有安装,需要翻看报错信息来确定具体问题。可以百度/谷歌相关关键词(比如Could not find xxx)查找解决办法,这里只列举我遇到的一些依赖项问题:
--- Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
...
No package 'gstreamer-base-1.0' found
...
looking for ccache --not found
...
-- Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH)
解决方法是安装 Python 相关的开发库、gstreamer 相关库、ccache、OpenBLAS 或者 Atlas 、JNI(Java Native Interface)……:
sudo apt-get install python-dev
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install ccache
sudo apt-get install liblapack-dev liblapacke-dev libopenblas-dev
sudo apt install default-jdk
最后,可能会遇到关于 vtkParseOGLExt 的错误,可以通过复制 vtk7 文件解决:
sudo cp ./vtk7 ./vtk
完成以上步骤并且确认没有任何依赖性的问题之后,可以继续进行编译并安装 OpenCV:
make -j12
sudo make install
最好不要满线程!!!可能会卡死。可以先用htop看自己电脑最高可以多线程,然后适当减少一些编译用的线程数
2. 安装cv_bridge
cv_bridge 是用于在ROS和OpenCV图像之间进行转换的重要工具。在ROS Noetic中,默认的 cv_bridge 链接到了 OpenCV 4。为了确保ROS的完整性,并且保持 OpenCV 4 的正常使用,我们不建议卸载默认的 cv_bridge。
为了额外安装适配于 OpenCV 3 的 cv_bridge,首先需要从 cv_bridge 的 GitHub 仓库下载 ros_melodic 版本的 cv_bridge:cv_bridge GitHub
下载后,进入 vision_opencv-melodic/cv_bridge 目录,并修改其中的 CMakeLists.txt 文件,有以下两个目的:
(1)将寻找 Boost 的方式改为不区分 Python 版本,防止编译时找不到 boost_python3
(2)添加对自己安装的 OpenCV 3 的路径的设置,防止找不到与 OpenCV 版本兼容的配置文件
具体修改方式如下,注意修改的是下载的cv_bridge中CMakeLists.txt。
在文件开头添加以下内容
cmake_minimum_required(VERSION 2.8)
project(cv_bridge)# 添加下面的内容
set(OpenCV_DIR /usr/local/opencv3.4.14/share/OpenCV)
set(OpenCV_INCLUDE_DIRS "/usr/local/opencv3.4.14/include")
set(OpenCV_LIBRARIES "/usr/local/opencv3.4.14/lib")
在文件中找到以下代码:
if(NOT ANDROID)find_package(PythonLibs)if(PYTHONLIBS_VERSION_STRING VERSION_LESS 3)find_package(Boost REQUIRED python)else()find_package(Boost REQUIRED python3)endif()
else()find_package(Boost REQUIRED)
endif()
修改为:
if(NOT ANDROID)find_package(PythonLibs)find_package(Boost REQUIRED python)
else()find_package(Boost REQUIRED)
endif()
完成以上修改后,保存并退出 CMakeLists.txt 文件。
接下来,需要在 vision_opencv-melodic/cv_bridge 目录中编译 cv_bridge:
cd vision_opencv-melodic/cv_bridge
mkdir build
cd build
cmake ..
make -j12
最后,使用 make install 命令将 cv_bridge 安装到系统中:
sudo make install DESTDIR=/usr/local/cv_bridge_melodic
这样就完成了 cv_bridge 的安装。现在,您可以在您的 ROS 系统中同时使用适配于 OpenCV 3 的 cv_bridge 和系统自带的 cv_bridge(链接到 OpenCV 4)了。
3. 修改ROS包中的CMakeLists.txt来指定OpenCV和cv_bridge版本
最后,需要在 ROS 包的 CMakeLists.txt 文件中设置 OpenCV 和 cv_bridge 的链接路径。可以按照以下方式设置:
# 在 project(xxx) 后面添加以下两行
set(cv_bridge_DIR /usr/local/cv_bridge_melodic/usr/local/share/cv_bridge/cmake)
set(OpenCV_DIR /usr/local/opencv3.4.14/share/OpenCV)
需要注意的是,对所有使用了 OpenCV 或者 cv_bridge 的 CMakeLists 都需要进行相应的修改,以确保正确链接到指定版本的库。
本教程到此结束。如果在安装过程中遇到任何问题,欢迎在评论中提出。
相关文章:
【ROS | OpenCV】在ROS中实现多版本OpenCV、cv_bridge共存:安装与配置指南
在 Ubuntu 20.04 中,ROS Noetic 默认安装的 OpenCV 版本为 4.2.0。如果您需要确认系统中已安装的 OpenCV 版本,可以使用以下命令: sudo find / -iname "*opencv*"然而,许多开源算法都是基于 OpenCV 3 编写的࿰…...

Docker容器化技术(docker-compose示例:部署discuz论坛和wordpress博客,使用adminer管理数据库)
安装docker-compose [rootservice ~]# systemctl stop firewalld [rootservice ~]# setenforce 0 [rootservice ~]# systemctl start docker[rootservice ~]# wget https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64创建目录 [rootse…...
微分学<6>——Taylor公式
索引 Taylor公式Taylor公式的定性分析定理6.1 Taylor公式(Peano余项) Taylor公式的定量分析定理6.2 Taylor公式(Lagrange余项) Taylor公式 Taylor公式的定性分析 定理6.1 Taylor公式(Peano余项) 若函数 f ( x ) f\left ( x \right ) f(x)在 x 0 x_{0} x0处的 n n n阶导数均…...

检索增强生成(RAG)应用的构建:LangChain与LlamaIndex的比较与选择
对于我要做RAG应用,我应该使用两者中的哪一个。或者说还是都使用? 在人工智能领域,检索增强生成(RAG)应用正变得越来越受欢迎,因为它们能够结合大型语言模型(LLMs)的自然语言处理能力…...

免费PDF转换和编辑工具 PDFgear 2.1.4
PDFgear是一款功能强大的 PDF 阅读及转换软件。 它支持多种文件格式的转换和编辑,同时还提供了丰富的功能模块,如签名、表单填写等,方便用户进行多样化的操作。 该软件界面简洁美观,操作简单易懂,适合不同层次的用户…...

uniapp,导航栏(切换项)有多项,溢出采取左滑右滑的形式展示
一、实现效果 当有多项的导航,或者说切换项,超出页面的宽度,我们采取可滑动的方式比较好一些!并且在页面右边加个遮罩,模拟最右边有渐变效果! 二、实现代码 html代码: <!-- 头部导航栏 --…...

计算机网络面经-什么是IPv4和IPv6?
前言 Internet协议(IP)是为连接到Internet网络的每个设备分配的数字地址。它类似于电话号码,是一种独特的数字组合,允许用户与他人通信。IP地址主要有两个主要功能。首先,有了IP,用户能够在Internet上被识别…...
彻底讲透:如何写sql能够有效的使用到复合索引?
在MySQL中,有效的使用复合索引需要确保查询条件按照索引定义的列顺序进行。以下是一个具体的例子: 假设我们有一个sales表,它有四个字段:customer_id、product_category、sale_date和amount。为了优化包含这些字段查询的性能&…...
在Spring Boot中如何处理跨域请求(CORS)?
什么是跨域? 跨域(Cross-Origin Resource Sharing,CORS)是一种机制,它允许在 Web 页面上运行的脚本能够请求从不同源(域名、协议或端口)的资源。在浏览器安全策略中,有一条称为同源…...

好就业三种专业#信息安全#云计算#网络工程
一、信息安全专业 根据2021年网络安全宣传周白皮书的观察结果,网络安全产业对于人才的需求正以高速增长的趋势呈现,当前网络安全行业存在着巨大的人才缺口,平均供求比例约为1:2。这一现象导致了资深人才的储备不足,并且新人才的培…...
electron-builder打包
打包配置: "build": {"appId": "cc11001100.electron.example-001", // 程序包名"copyright": "CC11001100", // 版权相关信息"productName": "example-001", // 安装包文件名"direct…...

SQLiteC/C++接口详细介绍sqlite3_stmt类(四)
返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(三) 下一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(五) 7. sqlite3_bind_parameter_count函数 sqlite3_bind_param…...
微信小程序自定义组件
微信小程序中的自定义组件是指在微信小程序中创建的可重用的、可复用的组件,它可以被多个页面使用。自定义组件可以帮助我们提高开发效率,提高代码的可维护性和可重用性。以下是微信小程序中自定义组件的使用方法: 一. 创建自定义组件 首先…...
python练习3
用户登录注册案例 while True: print("\t\t\t英雄商城登录界面\n") print("~*"*38) print("\t\t\t1.用户登录\n") print("\t\t\t2.用户注册\n") print("\t\t\t3.退出系统\n") print("~*"*38) choice input("…...
docker离线安装并修改存储目录
docker下载 根据cpu选择不同版本,正常x86就选x86_64 下载地址:https://download.docker.com/linux/static/stable/ docker安装 tar -zxvf arm-docker-25.0.4.tgz sudo cp docker/* /usr/bin/ rm -rf docker/* mkdir /etc/docker vi /etc/docker/daemo…...

【云原生 • Kubernetes】认识 k8s、k8s 架构、核心实战
文章目录 Kubernetes基础概念1. 是什么2. 架构2.1 工作方式2.2 组件架构 3. k8s组件创建集群步骤一 基础环境步骤二 安装kubelet、kubeadm、kubectl步骤三 主节点使用kubeadm引导集群步骤四 副节点加入主节点步骤五 部署dashboard Kubernetes核心实战1. 资源创建方式2. Namespa…...

墨菲安全在软件供应链安全领域阶段性总结及思考
向外看:墨菲安全在软件供应链安全领域的一些洞察、思考、行动 洞察 现状&挑战: 过去开发安全体系是无法解决软件供应链安全问题的;一些过去专注开发安全领域的厂商正在错误的引导行业用开发安全思维解决软件供应链安全问题,治…...

智慧公厕:卫生、便捷、安全的新时代厕所变革
在城市快速发展的背景下,公共厕所的建设和管理变得越来越重要。智慧公厕作为厕所变革的一项全新举措,通过建立公共厕所全面感知监测系统,以物联网、互联网、大数据、云计算、自动化控制技术为支撑,实现对公共厕所的智能化管理和运…...

Idea 不能创建JDK1.8的spring boot项目
由于https://start.springboot.io/ 不支持JDK1.8,那么我们需要换idea的springboot创建源,需要换成 https://start.aliyun.com,这也是网上大部分教程说的,但是我这边会报这样的错误: Initialization failed for https:…...
【docker】Docker学习收集
写在前面 新公司开发使用docker来部署和统一大家的开发环境,故再次记录好用的学习链接和自己遇到的奇怪问题 实用链接 Docker教程详细 常用命令 个例问题 Q: docker在终端多开,A终端的修改会影响B吗 A: 会...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...