ROS OpenCV 图像基本处理函数

在ROS中结合OpenCV使用时,cv::imread() 函数并非ROS本身的API,而是来自OpenCV库的函数,用于读取本地磁盘上的图像文件。

其用法如下:

cv::Mat cv::imread(const string& filename, int flags = IMREAD_COLOR);

参数说明:

    filename:字符串类型,表示要读取的图像文件的完整路径和名称。

    flags:整型变量,定义了读取图像的方式,可选值包括:

        IMREAD_UNCHANGED 或 -1:加载图像,包括alpha通道(如果存在)。

        IMREAD_GRAYSCALE 或 0:以灰度模式加载图像。

        IMREAD_COLOR 或 1:默认选项,以彩色模式加载图像(如果是彩色图像)。

        IMREAD_ANYDEPTH:加载任意深度图像作为单通道图像。

        IMREAD_ANYCOLOR:加载任何颜色空间的图像。

可以将上述标志进行组合,例如 IMREAD_GRAYSCALE | IMREAD_ANYDEPTH 将加载一个可能包含高动态范围数据的灰度图像。

返回值:

cv::Mat 类型的对象,代表所读取的图像数据。如果没有成功读取图像,则返回一个空矩阵(即 .empty() 返回 true)。

彩色图像使用 OpenCV 加载时是 BGR 模式。

示例代码:

#include <opencv2/opencv.hpp>

#include <ros/ros.h>

int main(int argc, char** argv)

{

    ros::init(argc, argv, "image_reader");

    ros::NodeHandle nh;

    // 读取图像文件

    cv::Mat image = cv::imread("/home/user/path/to/image.jpg", cv::IMREAD_COLOR);

    if (image.empty())

    {

        ROS_ERROR("Could not read the image file.");

        return -1;

    }

    // 显示图像

    cv::imshow("Image Window", image);

    cv::waitKey(0); // 等待用户按键,窗口才会关闭

    return 0;

}

在ROS环境下,通常会结合cv_bridge来处理ROS Image消息OpenCV Mat之间的转换,而不仅仅是读取本地文件。如果是在ROS节点内部操作摄像头获取的图像,那么需要从ROS话题订阅图像数据,并通过cv_bridge的imgmsg_to_cv2()函数将其转换为OpenCV可以处理的cv::Mat格式。

cv::imwrite() 函数同样是来自OpenCV库的函数,用于将图像数据保存到本地磁盘上的文件。可以使用这个函数来保存摄像头捕获的图像或者处理后的图像。使用函数 cv2.imwrite() 来保存一个图像。(首先需要一个文件名,之后才是要保存的图像。)

其用法如下:

cv::imwrite(const string& filename, InputArray img, const std::vector<int>& params = std::vector<int>());

参数说明:

    filename:字符串类型,表示要写入图像文件的完整路径和名称,包括扩展名,根据扩展名来确定输出图像的格式。

    img:cv::Mat 类型的对象或其他符合 InputArray 类型要求的图像数据结构,这是要保存的图像内容。

    params:可选参数,一个整数类型的向量,用于指定编码器特定的参数或选项。可选参数,用于指定图像压缩编码格式和压缩级别。

例如,在写入JPEG格式图像时可以设置压缩质量等。如果不需要特殊设置,则可以不提供此参数,此时默认为一个空的整数向量。

示例代码:

#include <iostream>

#include <opencv2/opencv.hpp>

int main()

{

    // 读取图像

    cv::Mat img = cv::imread("input.jpg");

    if (img.empty())

    {

        std::cout << "无法读取图像" << std::endl;

        return -1;

    }

    // 保存图像

    bool result = cv::imwrite("output.jpg", img);

    if (result)

    {

        std::cout << "图像保存成功" << std::endl;

    }

    else

    {

        std::cout << "图像保存失败" << std::endl;

    }

    return 0;

}

imshow()函数用于在窗口中显示图像。(窗口会自动调整为图像大小。第一个参数是窗口的名字,其次才是需要的图像。)

其用法如下:

void imshow(const String& winname, const Mat& image);  

参数说明:

winname:字符串类型,表示要显示图像的窗口名称。如果该窗口尚不存在,则会创建一个新的窗口。    

image:要显示的图像,通常是一个Mat对象。

示例代码:

#include <opencv2/opencv.hpp>

#include <iostream>

using namespace cv;

using namespace std;

int main()

{

    // 读取图像

    Mat image = imread("example.jpg");

    // 检查图像是否正确读取

    if (image.empty())

    {

        cout << "无法读取图像" << endl;

        return -1;

    }

    // 创建一个名为"Example Image"的窗口

    namedWindow("Example Image", WINDOW_AUTOSIZE);

    // 在窗口中显示图像

    imshow("Example Image", image);

    // 等待按键,然后关闭窗口

    waitKey(0);

    destroyAllWindows();

    return 0;

}

在这个示例中,首先包含了必要的头文件,然后定义了一个名为main的函数。在main函数中,使用imread函数读取了一张名为example.jpg的图像,并将其存储在Mat对象image中。

然后,使用namedWindow函数创建一个名为"Example Image"的窗口,并设置窗口大小自动调整。最后,使用imshow函数在窗口中显示图像,并使用waitKey(0)等待用户按下任意键,然后使用destroyAllWindows()关闭所有打开的窗口。

补充:cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限期的等待键盘输入。

cv2.destroyAllWindows() 可以轻易删除任何建立的窗口。如果想删除特定的窗口可以使用 cv2.destroyWindow(),在括号内输入想删除的窗口名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/617177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之享元模式【结构型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

FridaHook(三)——AllSafe App wp

By ruanruan&#xff0c;2022/04/21 文章目录 1、不安全的日志记录2、硬编码3、pin绕过&#xff08;1&#xff09;反编译查看方法判断逻辑&#xff08;2&#xff09;hook方法A、Hook areEqual(Object,Object)B、Hook checkPin(a) &#xff08;3&#xff09;页面效果&#xff08…

芯课堂 | 一种带WIFI的智能多电机控制系统

现有技术中&#xff0c;每台智能家电基本均需配置一台电机及一个WiFi模组&#xff0c;每台智能家电的电机均通过对应的WiFi模组连接家庭无线路由器进行组网&#xff0c;从而实现网络连接。 但是&#xff0c;这种方式存在技术瓶颈。例如&#xff0c;当一个家庭中智能家电的数量…

80V 72V 60V 48V 降12V 5V 3.3V 功耗低降压恒压芯片H6603

输入电压80V、72V、60V、48V&#xff1a;这些是电源系统中的不同电压水平&#xff0c;通常用于驱动各种设备。例如&#xff0c;电动汽车、电动自行车或工业设备中的电池系统可能以这些电压级别工作。 降12V&#xff1a;这可能是指一种电源模块&#xff0c;其功能是将输入电压&…

Linux 文件的压缩和解压

zip压缩&#xff1a;指定目录的文件压缩到指定目录下。 可采用 zip 压缩命令&#xff1a; 例如&#xff1a;要将 /path/to/source/directory/* 目录下的所有文件压缩到 /path/to/destination 目录下的 archive.zip 文件中 zip -j /path/to/destination/archive.zip /path/to/s…

MYSQL学习——聚合函数

目录 1. 聚合函数介绍 1) AVG和SUM函数 2) MIN和MAX函数 3) COUNT函数 2. GROUP BY 1) 基本使用 2) 使用WITH ROLLUP 3. HAVING 1) 基本使用 2) WHERE和HAVING的对比 4. SELECT的执行过程 1) 查询的结构 2) SQL的执行原理 1. 聚合函数介绍 什么是聚合函数 聚合函…

HDFS WebHDFS 读写文件分析及HTTP Chunk Transfer Coding相关问题探究

文章目录 前言需要回答的问题DataNode端基于Netty的WebHDFS Service的实现 基于重定向的文件写入流程写入一个大文件时WebHDFS和Hadoop Native的块分布差异 基于重定向的数据读取流程尝试读取一个小文件尝试读取一个大文件 读写过程中的Chunk Transfer-Encoding支持写文件使用C…

xcode安装及运行源码

抖音教学视频 目录 1、xcode 介绍 2、xcode 下载 3、xocde 运行ios源码 4、快捷键 1、xcode 介绍 Xcode 是运行在操作系统Mac OS X上的集成开发工具&#xff08;IDE&#xff09;&#xff0c;由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有…

体感游戏开发体感互动游戏

体感健身游戏是一种利用特定技术来跟踪和响应玩家身体动作的互动式电子游戏。这种游戏类型的目的是通过有趣、动态的方式鼓励用户进行身体活动和健康锻炼。下面是有关体感健身游戏的一些重要信息&#xff1a; 体感游戏技术背景 体感技术&#xff1a;这些游戏通常使用运动传感…

C //练习 4-5 给计算器程序增加访问sin、exp与pow等库函数的操作。有关这些库函数的详细信息,参见附录B.4节中的头文件<math.h>。

C程序设计语言 &#xff08;第二版&#xff09; 练习 4-5 练习 4-5 给计算器程序增加访问sin、exp与pow等库函数的操作。有关这些库函数的详细信息&#xff0c;参见附录B.4节中的头文件<math.h>。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下…

2024.1.11 关于 Jedis 库操作 Redis 基本演示

目录 引言 通用命令 SET & GET EXISTS & DEL KEYS EXPIRE & TTL TYPE String 类型命令 MGET & MSET GETRANGE & SETRANGE APPEND INCR & DECR List 类型命令 LPUSH & LRANG LPOP & LPOP BLPOP & BRPOP LLEN Set 类型命…

SwiftUI 为任意视图加上徽章(Badge)而想到的(下)

概览 在 SwiftUI 为任意视图加上徽章(Badge)而想到的(上) 这篇文章中,我们讨论了如何使用 Preference 技术打造 SwiftUI 中任意视图上徽章的实现。 虽然,我们完成了一系列挑战最后基本得偿所愿,不过在上篇的实现中仍有些许不尽如人意之处。 在本篇博文中,您将学到如下…

【web安全】弱口令,以及不同领域的弱口令爆破

弱口令的概念 简单的理解就是简单的&#xff0c;容易让别人猜出来的密码。 弱口令的分类 弱口令分了三类 简单常用的易记密码 这种密码是人均常用的密码&#xff0c;比如活到了这么大&#xff0c;我见过很多很多的wifl密码是88888888或者12345678这种的密码。很多情况下数…

Jmeter 性能压测 —— TPS与QPS

1、TPS和QPS的区别 TPS&#xff1a;意思是每秒事务数&#xff0c;具体事务的定义都是人为的&#xff0c;可以一个接口、多个接口、一个业务流程等等。 一个事务是指事务内第一个请求发送到接收到最后一个请求的响应的过程&#xff0c;以此来计算使用的时间和完成的事务个数。…

WPF 布局

了解 WPF中所有布局如下&#xff0c;我们一一尝试实现&#xff0c;本文档主要以图形化的形式展示每个布局的功能。 布局&#xff1a; Border、 BulletDecorator、 Canvas、 DockPanel、 Expander、 Grid、 GridView、 GridSplitter、 GroupBox、 Panel、 ResizeGrip、 Separat…

蓝屏代码0x000007E解决办法

概述 出现该问题&#xff1a; 1、硬件冲突造成的蓝屏 驱动冲突&#xff1a;与其他设备或应用程序的驱动冲突可能会引起系统崩溃。 2、内存虚拟不足造成的蓝屏 错误配置&#xff1a;不正确的配置或设置可能会导致蓝屏错误。 3、超频后也可能出现蓝屏 CUP超频或者显卡超频后出现蓝…

NAS使用的一些常见命令 ssh sftp 上传 下载 ALL in one

目录 登陆上传/下载内网穿透 登陆 ssh 登陆 ssh usernameserverIP -p portNumsftp 登陆 sftp -P portNum usernameserverIP上传/下载 如ls等&#xff0c;远程服务器操作 如lls等&#xff0c;本机操作&#xff0c;前缀为l 文件 put **** 将本机上文件上传到远程服务器上当…

分析一个项目(微信小程序篇)三

目录 接下来分析接口方面&#xff1a; home接口&#xff1a; categories接口&#xff1a; details接口&#xff1a; login接口&#xff1a; 分析一个项目讲究的是如何进行对项目的解析分解&#xff0c;进一步了解项目的整体结构&#xff0c;熟悉项目的结构&#xff0c;能够…

kylin集群反向代理(健康检查)

前面一篇文章提到了使用nginx来对kylin集群进行反向代理&#xff0c; kylin集群使用nginx反向代理-CSDN博客文章浏览阅读349次&#xff0c;点赞8次&#xff0c;收藏9次。由于是同一个集群的&#xff0c;元数据没有变化&#xff0c;所以&#xff0c;直接将原本的kylin使用scp的…

C++学习笔记——类继承

目录 一、一个简单的基类 1.1封装性 1.2继承性 1.3虚函数 1.4多态性 二、基类 2.1一个简单的C基类的示例 2.2 Animal是一个基类。 三、继承 3.1概念 3.2is-a关系 3.3多态公有继承 3.4静态联编和动态联编 3.5访问控制 3.6ABC理念 一、一个简单的基类 C中的基类是一…