获取矩形矢量的边界矩形的最有效方法

Most efficient way to get bounding rectangle of vector of rectangles

我有一个 std::vectorcv::Rects(来自 opencv 框架)称为 rects,但我想相同的逻辑将应用于任何矩形对象,所以我不会在这个问题中标记 opencv。

我正在尝试找到包含向量中所有矩形的最小矩形,这是我目前所拥有的:

int t = min_element(rects.begin(), rects.end(), [](cv::Rect a, cv::Rect b){ a.tl().y < b.tl().y;})->tl().y;
int l = min_element(rects.begin(), rects.end(), [](cv::Rect a, cv::Rect b){ a.tl().x < b.tl().x;})->tl().x;
int b = max_element(rects.begin(), rects.end(), [](cv::Rect a, cv::Rect b){ a.br().y < b.br().y;})->br().y;
int r = max_element(rects.begin(), rects.end(), [](cv::Rect a, cv::Rect b){ a.br().x < b.br().x;})->br().x;
cv::Rect smallest_encompassing_rect = cv::Rect(cv::Point(t, l),cv::Point(b, r)))

不清楚的话,.tl()函数获取矩形的左上点,.br()获取右下角

我知道这行得通,但我想知道是否有更有效的方法来解决这个问题。我正在处理图像处理,所以我的代码对时间很敏感。

如有任何帮助,我们将不胜感激, 谢谢

用一个循环而不是 4 个循环,你可以这样做:

cv::Rect result = rects[0];

for (int i = 1; i != rects.end(); ++i) {
    result.tl().x = std::min(result.tl().x, rects[i].tl().x);
    result.tl().y = std::min(result.tl().y, rects[i].tl().y);
    result.br().x = std::max(result.br().x, rects[i].br().x);
    result.br().y = std::max(result.br().y, rects[i].br().y);
}