找到点矢量的最小值和最大值

时间:2013-08-26 07:21:06

标签: c++ opencv

我想从点向量中找到最小值和最大值。向量由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的最小值和最大值?

2 个答案:

答案 0 :(得分:7)

您可以将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);

,同样适用于ymmx.first将有一个最小元素的迭代器,mmx.second到最大元素。

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

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库支持。

答案 1 :(得分:1)

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);