我想从点向量中找到最小值和最大值。向量由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的最小值和最大值?
答案 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);
,同样适用于y
。 mmx.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);