获得矩形向量矩形的最有效方法

时间:2017-03-09 02:45:30

标签: c++ vector rectangles

我有std::vector cv::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()会获得右下角。

我知道这会有效,但我想知道是否有更有效的方法来解决问题。我正在处理图像处理,因此我的代码对时间敏感。

任何帮助将不胜感激, 感谢

1 个答案:

答案 0 :(得分:0)

使用一个循环而不是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);
}