std::vector<cv::Rect> rects;rects中全部cv::Rect的值加上一个固定的值x

1.概要

2.内容

如果你有一个 std::vector<cv::Rect> 类型的变量 rects,并且你想要将这个向量中所有 cv::Rect 对象的 x 坐标都加上一个固定的值 x_offset,你可以通过遍历这个向量并修改每个 cv::Rect 对象的 x 坐标来实现。

下面是一个示例代码,展示了如何完成这个操作:


#include <vector>
#include <opencv2/opencv.hpp>

int main() {
    // 假设我们有一个包含几个矩形的向量
    std::vector<cv::Rect> rects = {
        cv::Rect(50, 50, 100, 200),
        cv::Rect(150, 150, 50, 50),
        cv::Rect(200, 200, 30, 30)
    };

    // 我们想要加上的x坐标偏移量
    int x_offset = 30;

    // 遍历向量中的每个矩形,并修改其x坐标
    for (auto& rect : rects) {
        rect.x += x_offset;
    }

    // 现在rects中的所有矩形的x坐标都已经加上了x_offset
    // 打印修改后的矩形信息以验证结果
    for (const auto& rect : rects) {
        std::cout << "Rect: x=" << rect.x << ", y=" << rect.y << ", width=" << rect.width << ", height=" << rect.height << std::endl;
    }

    return 0;
}

在这个示例中,我们首先定义了一个包含几个 cv::Rect 对象的向量 rects。然后,我们定义了一个想要加上的 x 坐标偏移量 x_offset。接下来,我们使用一个范围 for 循环(也称为基于范围的 for 循环)来遍历 rects 向量中的每个 cv::Rect 对象,并通过引用(auto&)来修改它们的 x 坐标。最后,我们打印出修改后的矩形信息来验证结果。

注意,在这个循环中,我们使用 auto& 而不是 auto 来确保我们是在修改向量中的实际对象,而不是它们的副本。如果我们只使用 auto,那么循环中的 rect 将是一个值拷贝,对它的修改不会反映到原始的 rects 向量中。

3.关联知识

1.cv::Rect的x坐标加上一个值

在OpenCV中,cv::Rect类的x坐标表示矩形左上角的横坐标。如果你想将矩形的x坐标加上一个特定的值,以移动矩形在水平方向上的位置,你可以直接修改x坐标或者通过创建一个新的cv::Rect对象来实现。

直接修改x坐标的方法如下:


cv::Rect rect(50, 50, 100, 200); // 原始矩形
int offsetX = 30; // 要加上的x坐标偏移量

rect.x += offsetX; // 将矩形的x坐标加上偏移量

// 现在rect的x坐标已经变成了80(50 + 30)

通过创建一个新的cv::Rect对象的方法如下:


cv::Rect rect(50, 50, 100, 200); // 原始矩形
int offsetX = 30; // 要加上的x坐标偏移量

// 创建一个新的矩形,其x坐标为原始矩形的x坐标加上偏移量
cv::Rect newRect(rect.x + offsetX, rect.y, rect.width, rect.height);

// 现在newRect的x坐标是80(50 + 30)

在这两种方法中,第一种是直接修改原始矩形的x坐标,而第二种是创建一个新的矩形对象,其属性基于原始矩形但x坐标有所偏移。选择哪种方法取决于你的具体需求和代码逻辑。

如果你只是想临时计算一个新的位置而不改变原始矩形的坐标,那么第二种方法可能更合适。如果你打算永久地移动矩形的位置,那么第一种方法可能更简单直接。

2.cv::Rect 

cv::Rect 是 OpenCV(一个开源的计算机视觉和机器学习软件库)中用于表示矩形的一个类。它主要用于图像处理中定义和操作矩形区域。cv::Rect 类包含四个主要的成员变量:x、y、width 和 height,分别代表矩形左上角的 x 坐标、y 坐标、矩形的宽度和高度。

主要成员变量

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

构造函数

cv::Rect 提供了多种构造函数,允许你以不同的方式初始化矩形对象。例如:

  • Rect(): 默认构造函数,创建一个宽度和高度都为 0 的矩形。
  • Rect(int x, int y, int width, int height): 使用指定的左上角坐标和宽度高度来构造矩形。
  • Rect(const Point& topLeft, const Size& size): 使用指定的左上角点和尺寸来构造矩形。
  • Rect(const Point2f& topLeft, const Size2f& size): 使用浮点数表示的左上角点和尺寸来构造矩形,适用于处理亚像素精度的情况。

主要成员函数

  • area(): 返回矩形的面积。
  • contains(Point pt): 检查点 pt 是否在矩形内。
  • size(): 返回矩形的大小(Size 对象)。
  • tl(): 返回矩形左上角的点(Point 对象)。
  • br(): 返回矩形右下角的点(Point 对象)。

用途

在图像处理中,cv::Rect 非常有用,它可以用来:

  • 定义图像中的感兴趣区域(ROI,Region of Interest),以便对图像的特定部分进行处理。
  • 在图像上绘制矩形,用于标注或高亮显示特定区域。
  • 在目标检测、人脸检测等应用中,用于表示检测到的目标的位置和大小。

示例

下面是一个简单的使用 cv::Rect 的示例:


#include <opencv2/opencv.hpp>

int main() {
    // 创建一个矩形对象,左上角坐标为 (50, 50),宽度为 100,高度为 200
    cv::Rect rect(50, 50, 100, 200);

    // 打印矩形的属性
    std::cout << "x: " << rect.x << ", y: " << rect.y << std::endl;
    std::cout << "width: " << rect.width << ", height: " << rect.height << std::endl;

    // 检查点 (75, 75) 是否在矩形内
    cv::Point pt(75, 75);
    if (rect.contains(pt)) {
        std::cout << "点 (75, 75) 在矩形内" << std::endl;
    } else {
        std::cout << "点 (75, 75) 不在矩形内" << std::endl;
    }

    return 0;
}

这个示例创建了一个 cv::Rect 对象,并演示了如何访问其属性以及如何使用 contains 方法来检查一个点是否在矩形内。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值