首页 > 编程语言 >C++生成随机裁剪尺寸

C++生成随机裁剪尺寸

时间:2024-12-28 13:30:10浏览次数:5  
标签:rand maxWidth int maxHeight 裁剪 C++ 随机 rect

随机裁剪尺寸 (x, y, w, h),其中裁剪区域的宽度和高度不能超过 640 和 360,保证裁剪的宽度和高度 ( w ) 和 ( h ) 是 2 的倍数

代码

#include <iostream>
#include <cstdlib>  // For rand() and srand()
#include <ctime>    // For time()

struct CropRect {
    int x; // Top-left x-coordinate
    int y; // Top-left y-coordinate
    int w; // Width of the crop
    int h; // Height of the crop
};

CropRect generateRandomCrop(int maxWidth, int maxHeight) {
    CropRect rect;

    // Generate random width and height as multiples of 2
    rect.w = (rand() % (maxWidth / 2) + 1) * 2; // Width: 2 to maxWidth, step 2
    rect.h = (rand() % (maxHeight / 2) + 1) * 2; // Height: 2 to maxHeight, step 2

    // Generate random top-left corner ensuring it fits within the boundaries
    rect.x = rand() % (maxWidth - rect.w + 1); // x: 0 to (maxWidth - width)
    rect.y = rand() % (maxHeight - rect.h + 1); // y: 0 to (maxHeight - height)

    return rect;
}

int main() {
    // Set seed for random number generation
    srand(static_cast<unsigned>(time(0)));

    int maxWidth = 640;  // Maximum width
    int maxHeight = 360; // Maximum height

    CropRect crop = generateRandomCrop(maxWidth, maxHeight);

    std::cout << "Random Crop Rectangle:" << std::endl;
    std::cout << "x: " << crop.x << ", y: " << crop.y << ", w: " << crop.w << ", h: " << crop.h << std::endl;

    return 0;
}

改动说明

  1. 确保 ( w ) 和 ( h ) 是 2 的倍数:

    • 使用 (rand() % (maxWidth / 2) + 1) * 2 生成宽度,确保生成的值范围是 ( [2, \text{maxWidth}] ),且是偶数。
    • 类似地,使用 (rand() % (maxHeight / 2) + 1) * 2 生成高度。
  2. 保持边界校验:

    • ( x ) 和 ( y ) 的计算不受影响,仍然确保裁剪框在图像范围内。

输出示例

每次运行程序将输出不同的裁剪尺寸,且 ( w ) 和 ( h ) 必定是 2 的倍数。例如:

Random Crop Rectangle:
x: 12, y: 30, w: 128, h: 64

此修改确保宽度和高度符合要求,并且裁剪框始终位于有效范围内。

 

标签:rand,maxWidth,int,maxHeight,裁剪,C++,随机,rect
From: https://www.cnblogs.com/chentiao/p/18637418

相关文章

  • C++ 中,直接打印枚举的名称
    在C++中,直接打印枚举的名称并不容易,因为枚举本质上是整数类型,编译后的程序不会保存枚举名称的字符串形式。但是,有一些方法可以实现这个功能。方法1:手动映射(常用方法)使用一个映射表或 switch 语句,将枚举值与其对应的名称关联起来。#include<iostream>#include<string>......
  • 跟我学C++中级篇——C++17中的std::void_t
    一、std::void_tstd::void_t是从C++17提供的一个元函数,主要用来在SFINAE应用上更简单方便一些。老规矩先看一下其定义形式:template<class...>usingvoid_t=void;这段代码单纯从代码意义上理解有两个情况:一是它使用了变参模板;二是使用了别名应用。它是一种很简单的......
  • PSRAM(Pseudo SRAM,伪静态随机存取存储器)与SRAM
    PSRAM(PseudoSRAM,伪静态随机存取存储器)与SRAM(静态随机存取存储器)存在多方面区别:###技术原理-**SRAM**:利用双稳态触发器(由多个晶体管组成)来存储数据。只要电源持续供电,触发器就能保持其存储的状态,不需要额外的刷新操作,数据可以随时被读取和写入。-**PSRAM**:本质上是一种特殊的D......
  • C++日志管理从基础到完善
    万古教员有名言,自信人生二百年。个人主页:oioihoii喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞!版本一:基础日志代码在设计C++日志系统时,我们需要考虑以下几个关键点:易用性:日志系统应该易于使用,开发者应该能够轻松地添加日志条目。性能:日志系统应......
  • 《 C++ 点滴漫谈: 十三 》C++ 中的虚拟函数革命:virtual、override 和 final 如何改变你
    摘要这篇博客深入探讨了C++中virtual、override和final关键字的核心概念与使用技巧。我们从虚函数和多态的基本概念出发,讲解了如何通过virtual实现动态绑定,使程序能够在运行时根据对象类型调用适当的函数。接着,我们深入分析了override的使用,帮助开发者避免重写错......
  • C++大内存分配错误
    支持一对一答疑的购买网址C++无法分配大内存当影像较大时,m和n是int类型时,char*a=newchar[m*n]可能出现无法分配内存的错误原因分析:由于早期数据处理需求对内存需要较小,例如早期影像较小,影像长宽的积较小,char*a=newchar[m*n]不会出错。时代变化,影像体积变大,老代码仍旧使......
  • c++入门
    ⦁C++基础1.数据类型主要有五类数据类型:布尔类型,字符型,整型,浮点型和无类型。部分数据类型及所占位数:数据类型C++语言表示所占位数范围字符型char8b(1字节)-128~127或0~255无符号字符型unsignedchar8b(1字节)0~255整型int......
  • 基于BiLSTM和随机森林回归模型的序列数据预测
    本文以新冠疫情相关数据集为案例,进行新冠数量预测。(源码请留言或评论)首先介绍相关理论概念:序列数据特点序列数据是人工智能和机器学习领域的重要研究对象,在多个应用领域展现出独特的特征。这种数据类型的核心特点是元素之间的顺序至关重要,反映了数据内在的时间或空间关联......
  • 只谈C++11新特性 - 删除函数
    删除函数背景在C++11之前,C++的类默认会生成拷贝构造函数和赋值运算符。这在某些情况下会引发问题,尤其是在我们希望明确禁止某些操作时。假设我们有一个类,它不希望被拷贝,但未明确声明拷贝构造函数和赋值运算符,这时编译器会自动生成默认实现,导致程序员可能无意间拷贝了该......
  • 期末复习c++时 发现以前没注意的点
    期末复习因为没有往年卷做现在闲得无聊导致的......