【问题标题】:Is there any simple way to multiply cv::Rect size and coordinates?有没有简单的方法来乘以 cv::Rect 大小和坐标?
【发布时间】:2019-04-08 17:10:53
【问题描述】:

假设我有 2 个矩形。我希望第二个矩形比第一个矩形大两倍,并且 x,y 的位置也大两倍。

cv::Rect r1=Rect(10,20,40,60);
cv::Rect r2 = r1 * 2;  //this won't work

将矩形 2 参数 1 设置为 1 将起作用

r2.height = r1.height * 2;
r2.width = r1.height * 2;
r2.x = r1.x * 2;
r2.y = r2.y * 2;

它有效,但有没有更简单的方法(如单行代码)?

【问题讨论】:

  • 不是根据docs,您可以编写自己的函数,但这似乎相对专业,因为您要乘以位置?
  • 你试过了吗 cv::Rect r2 = r1 * cv::Size(2,2); ?或 cv::Rect r2 = r1 +cv::Size(width, height) 进行翻译, rect + cv::Point(x,y) 应该可以工作。
  • 你要乘以职位x,y 乘以职位是什么意思?要调整大小,您可以乘以 width, height。
  • 将一个矩形乘以二并没有真正明确的意义;原点应该在哪里? (0, 0)?左下方?中心?

标签: c++ opencv


【解决方案1】:

如果你想这样做,这可能是最短的方法:

cv::Rect r1=Rect(10,20,40,60);
cv::Rect r2(r1.tl() * 2, r1.br() * 2);

【讨论】:

    【解决方案2】:

    我们可以重载* 运算符:

    cv::Rect operator*(cv::Rect r, double scale) {
        r.height *= scale;
        r.width *= scale;
        r.x *= scale;
        r.y *= scale;
        return r;
    }
    

    然后你可以直接将矩形相乘:

    Rect r2 = Rect(10, 20, 40, 60) * 2;
    

    【讨论】:

    • 乘法位置没有意义,这就是 OpenCV 不提供这种运算符重载的原因。乘法位置并不意味着按照 OP 的要求调整大小。
    • @BahramdunAdil 诚然,我不认为像乘法运算符这样的东西是一个好主意,因为这种乘法并不常见。但是操作确实说“第一个矩形和 x,y 的位置也大了两倍。”。
    • @George 如果您检查 OP 问题下的 cmets,您会看到其他人也认为通过乘以位置来调整 Rectangle 的大小是错误的,因此不仅 OP 的错误问题(因为他想调整大小,而不是重新定位)而且根据这个答案也是没有意义的。调整大小和重新定位是两个不同的概念。你不能一次完成。
    • 只是缩放操作。当你缩放某些东西时,你必须将位置和大小乘以相同的因子。
    • @JorgePerez 那么0,0 的位置呢?或者x=200 而width=300 和2 现在乘以x=400 会超出范围并抛出异常,但width 仍然可以毫无异常地绘制。
    猜你喜欢
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多