我有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()
会获得右下角。
我知道这会有效,但我想知道是否有更有效的方法来解决问题。我正在处理图像处理,因此我的代码对时间敏感。
任何帮助将不胜感激, 感谢
答案 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);
}