获取矩形矢量的边界矩形的最有效方法
Most efficient way to get bounding rectangle of vector of 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()
获取右下角
我知道这行得通,但我想知道是否有更有效的方法来解决这个问题。我正在处理图像处理,所以我的代码对时间很敏感。
如有任何帮助,我们将不胜感激,
谢谢
用一个循环而不是 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);
}
我有一个 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()
获取右下角
我知道这行得通,但我想知道是否有更有效的方法来解决这个问题。我正在处理图像处理,所以我的代码对时间很敏感。
如有任何帮助,我们将不胜感激, 谢谢
用一个循环而不是 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);
}