C++:cv::boundingRect()函数解析

cv::boundingRect() 函数是 OpenCV 库中的一个函数,用于计算并返回一个点集的边界矩形。这个函数特别有用,当你已经找到了一些轮廓(contours)或者任何其他形状的点集,并希望获得一个能够包围这些点的最小矩形时。

函数原型通常如下所示(在 C++ 中):

Rect cv::boundingRect(InputArray points)
  • points:这是一个 InputArray 类型的参数,可以是一个点集,比如一个 std::vector<cv::Point> 或者一个 cv::Mat,其中包含了二维的点坐标。这些点通常来自于轮廓检测函数(如 cv::findContours)的输出。

返回值是一个 cv::Rect 对象,它表示了边界矩形的位置和大小。cv::Rect 是一个简单的结构体,通常包含以下四个成员:

  • x:矩形左上角的 x 坐标。
  • y:矩形左上角的 y 坐标。
  • width:矩形的宽度。
  • height:矩形的高度。

使用示例

假设你已经使用 cv::findContours 函数找到了一些轮廓,并希望为每个轮廓绘制一个边界矩形:

#include <opencv2/opencv.hpp>  int main() {  // 加载图像,转换为灰度图,应用阈值处理以获取二值图像  cv::Mat src = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE);  cv::Mat binary;  cv::threshold(src, binary, 127, 255, cv::THRESH_BINARY);  // 查找轮廓  std::vector<std::vector<cv::Point>> contours;  cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);  // 绘制边界矩形  cv::Mat drawing = cv::Mat::zeros(binary.size(), CV_8UC3);  for (size_t i = 0; i < contours.size(); i++) {  cv::Rect rect = cv::boundingRect(contours[i]);  cv::rectangle(drawing, rect, cv::Scalar(0, 255, 0), 2, 8, 0);  }  // 显示结果  cv::imshow("Bounding Rectangles", drawing);  cv::waitKey(0);  return 0;  
}

在这个示例中,我们首先加载一张图像,将其转换为灰度图,并应用阈值处理以获取二值图像。然后,我们使用 cv::findContours 函数查找图像中的轮廓。对于每个找到的轮廓,我们使用 cv::boundingRect 函数计算其边界矩形,并使用 cv::rectangle 函数在另一个图像(drawing)上绘制这些矩形。最后,我们显示这个包含边界矩形的图像。

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

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

相关文章

编程什么叫f语言编程软件:深入解析F语言编程软件的概念与特性

编程什么叫f语言编程软件&#xff1a;深入解析F语言编程软件的概念与特性 在编程领域&#xff0c;各种编程语言和软件层出不穷&#xff0c;每种都有其独特的特点和适用场景。其中&#xff0c;F语言编程软件作为一种相对较为特殊的存在&#xff0c;引起了众多编程爱好者的关注。…

[leetcode]partition-list 分隔链表

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:ListNode* partition(ListNode* head, int x) {ListNode *smlDummy new ListNode(0), *bigDummy new ListNode(0);ListNode *sml smlDummy, *big bigDummy;while (head ! nullptr) {if (head->val &l…

YOLOv10改进 | 添加注意力机制 | 添加ACmix自注意力与卷积混合模型改善模型特征识别效率(包含二次创新PSA机制)

一、本文介绍 本文给大家带来的改进机制是ACmix自注意力机制的改进版本&#xff0c;它的核心思想是&#xff0c;传统卷积操作和自注意力模块的大部分计算都可以通过1x1的卷积来实现。ACmix首先使用1x1卷积对输入特征图进行投影&#xff0c;生成一组中间特征&#xff0c;然后根…

JavaScript中的Symbol类型是什么以及它的作用

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介JavaScript中的Symbol类型是什么以及它的作用1. 符号&#xff08;Symbol&#xff09;的创建2. 符号的特性3. 符号的作用3.1 属性名的唯一性3.2 防止属性被意外访问或修改3.3 使用内置的符号3.4 符号与属性遍历 4. 总结 ⭐ 写在最后…

网络协议(TCP三次握手,四次断开详解)

TCP的详细过程&#xff1a; TCP&#xff08;传输控制协议&#xff09;的三次握手和四次断开是其建立连接和终止连接的重要过程&#xff0c;以下是详细解释&#xff1a; 三次握手&#xff1a; 1. 第一次握手&#xff1a;客户端向服务器发送一个 SYN&#xff08;同步&#x…

Vue get请求传递数组,springboot接受数组(ai生成)

在Vue中&#xff0c;你可以使用axios库来发起GET请求并传递数组参数。在Spring Boot后端&#xff0c;你可以使用RequestParam注解来接收这个数组参数。 Vue (前端) 代码示例: import axios from axios;// 假设你有一个数组 const array [item1, item2, item3];// 构建查询参…

Flask 用 Redis 缓存键值对-实例

Flask 使用起 Redis 来简直就是手到擒来&#xff0c;比 MySQL 简单多了&#xff0c;不需要那么多配置&#xff0c;实际代码就这么多&#xff0c;直接复制就能用。除了提供简单实用的实例以外&#xff0c;本文后面还会简单介绍一下 Redis 的安装与使用&#xff0c;初学者也能一看…

flink 配置表

在 Flink 的上下文中&#xff0c;直接提及“配置表”可能不是 Flink 框架本身的一个标准术语。然而&#xff0c;从更广泛的角度来看&#xff0c;Flink 确实需要配置来管理其运行时的行为和资源。这些配置通常存储在配置文件中&#xff0c;如 flink-conf.yaml&#xff0c;它们可…

conda 安装不同版本python

#创建 python 环境 环境名称叫 py3.8.0 版本 3.8# conda create --name py3.8.0 python3.8 #激活# conda activate py3.8.0 #安装库# pip install opencv-python #删除python 环境 假设你的环境名字叫: py3.8.0# conda remove -n py3.8.0 --all

Java 面试中常见的 CAS 和 AQS 问题解析

在 Java 面试中&#xff0c;CAS&#xff08;Compare and Swap&#xff0c;比较并交换&#xff09;和AQS&#xff08;AbstractQueuedSynchronizer&#xff0c;抽象队列同步器&#xff09;是经常被问到的重要知识点。下面为大家整理了一些常见的面试题及详细解析。 一、CAS 相关…

Linux笔记之三

Linux笔记之三 一、用户组管理二、磁盘管理三、进程管理总结 一、用户组管理 每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理&#xff08;开发、测试、运维、root&#xff09;。不同Linux系统对用户组的管理涉及用户组的添加、删除和修改。…

HAL_DMA_ERROR_BUSY

HAL_DMA_ERROR_BUSY 是一个在STM32 HAL&#xff08;硬件抽象层&#xff09;库中可能出现的错误标志&#xff0c;它表示DMA&#xff08;直接内存访问&#xff09;控制器当前正忙&#xff0c;无法接受新的数据传输请求。当尝试启动一个DMA传输操作&#xff0c;但DMA控制器已经处于…

8. Python3 pandas数据分析处理库

11.1 pandas的数据结构 pandas的数据结构如下图所示&#xff1a; pandas的几种数据结构有内在联系&#xff0c;可以吧DataFrame看作Series的容器&#xff0c;把Panel看作DataFrame的容器。可以像操作字典那样在这些数据结构中插入或者移除数据对象。在介绍这些数据结构之前&am…

数据集成平台:企业数字化转型的多面手

当前是一个数据驱动企业发展的时代&#xff0c;企业的数字化转型已不再是选择题&#xff0c;而是关乎生存与发展的必答题。在这场深刻的变革中&#xff0c;数据集成平台作为连接企业内部外数据孤岛、促进数据流动与融合的桥梁&#xff0c;扮演着至关重要的角色。它不仅是企业数…

排序相关算法--1.插入排序+冒泡排序回顾

1.基本分类 2.插入排序 特点&#xff1a;有实践意义&#xff08;例如后期快排的优化&#xff09;&#xff0c;适应性强&#xff0c;一般不会到时间复杂度最坏的情况。 将第一个元素视为已经排好序的序列。取出下一个元素&#xff0c;在已经排好序的序列中从后往前比较&#xf…

一天20MW!天途推出无人机全自主光伏巡检平台

01 光伏电站的运维挑战 光伏发电为人类提供了可持续的清洁能源供给。一般集中式电站建设在空旷的地区&#xff0c;如荒地、沙漠等地区&#xff1b;分布式电站建设在用户的屋顶和建筑物表面&#xff0c;如住宅、商业建筑、工业厂房等地区。 随着光伏电站的大规模的使用&#x…

FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流

SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架&#xff0c;可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等&#xff0c;支持的音频编码包括AAC、OPUS等等&#xff0c;可谓功能强大的APP直播框架。 相比之下&#xff0c;另一款APP直播框架RT…

第三期书生大模型实战营 第2关 Python 基础知识

第三期书生大模型实战营 第2关 Python 基础知识 第三期书生大模型实战营 第2关 Python 基础知识Python 基础函数定义常见的内置方法replace(old, new)lower()split() 字典dict 使用Python实现词频统计使用VSCode进行调试总结 第三期书生大模型实战营 第2关 Python 基础知识 Hel…

详细分析Java中的@EventListener事件监听器(附Demo)

目录 前言1. 基本知识2. Demo 前言 Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;Spring框架从入门到学精&#xff08;全&#xff09; 1. 基本知识 用于标注一个方法为事件监听器 事件监听器方…

ArduPilot开源飞控之AP_Mount_Siyi

ArduPilot开源飞控之AP_Mount_Siyi 1. 源由2. 框架设计2.1 类和继承2.2 公共方法2.3 保护方法2.4 私有成员和方法2.5 解析状态2.6 重要成员变量 3. 重要方法3.1 AP_Mount_Siyi::init3.2 AP_Mount_Siyi::update3.3 AP_Mount_Siyi::read_incoming_packets3.4 AP_Mount_Siyi::proc…