2

我想从点向量中找到最小值和最大值。向量由 x 和 y 元素类型组成。我想要 x 的最小值和最大值以及 y 的最小值。我的向量定义为:

 std::vector<cv::Point> location;
findNOZeroInMat(angles,location);

//I tried to use but it gives an error
  minMaxLoc(location.cols(0), &minVal_x, &maxVal_x);
    minMaxLoc(location.cols(1), &minVal_y, &maxVal_y);

我也尝试了 location.x ,但它没有用。如何分别获得 x 和 y 的最小值和最大值?

4

2 回答 2

8

您可以将std::minmax_element与自定义小于比较函数/函子一起使用:

#include <algorithm>

bool less_by_x(const cv::Point& lhs, const cv::Point& rhs)
{
  return lhs.x < rhs.x;
}

然后

auto mmx = std::minmax_element(location.begin(), location.end(), less_by_x);

同样对于y. mmx.first将有一个迭代器到最小元素和mmx.second最大元素。

如果您没有 C++11 支持,auto则需要明确:

typedef std::vector<cv::Point>::const_iterator PointIt;
std::pair<PointIt, PointIt> mmx = std::minmax_element(location.begin(), 
                                                      location.end(), 
                                                      less_by_x);

但请注意,这std::minmax_element需要 C++11 库支持。

于 2013-08-26T07:59:57.587 回答
4

cv::boundingRect正在做你想做的事。它

计算点集的右上边界矩形。

结果是cv::Rect具有属性的类型,x, y, width, heigth但也提供了可用于查找所需最小值的方法tl(= 左上角)和(= 右下角)。br和最大。价值观。请注意,这tl是包含但是bt排他的。

std::vector<cv::Point> points;
// do something to fill points...

cv::Rect rect = cv::boundingRect(points);

// tl() directly equals to the desired min. values
cv::Point minVal = rect.tl();

// br() is exclusive so we need to subtract 1 to get the max. values
cv::Point maxVal = rect.br() - cv::Point(1, 1);
于 2018-03-07T10:35:58.607 回答