Из документации minmax_element видно, что он возвращает пару итераторов.
Данный:
vector<Point> pts = ...
auto mmx = std::minmax_element(pts.begin(), pts.end(), less_by_y);
вы можете получить доступ к итератору к минимальному элементу с помощью mmx.first
и к итератору к максимальному элементу с помощью mmx.second
.
Если вы хотите получить минимальное и максимальное значения y
, вам нужно сделать:
int min_y = mmx.first->y;
int max_y = mmx.second->y;
Поскольку вы находитесь в OpenCV, вы также можете найти значения y
, используя boudingRect
:
Rect box = boundingRect(pts);
std::cout << "min y: " << box.tl().y << std::endl;
std::cout << "max y: " << box.br().y - 1 << std::endl; // Note the -1!!!
Хотя это, вероятно, медленнее, вам не нужно определять пользовательскую функцию сравнения. Это также вычисляет min и max x
, если это необходимо.
Вот полный пример:
#include <opencv2/opencv.hpp>
#include <algorithm>
#include <iostream>
using namespace cv;
bool less_by_y(const cv::Point& lhs, const cv::Point& rhs)
{
return lhs.y < rhs.y;
}
int main(int argc, char** argv)
{
// Some points
vector<Point> pts = {Point(5,5), Point(5,0), Point(3,5), Point(3,7)};
// Find min and max "y"
auto mmx = std::minmax_element(pts.begin(), pts.end(), less_by_y);
// Get the values
int min_y = mmx.first->y;
int max_y = mmx.second->y;
// Get the indices in the vector, if needed
int idx_min_y = std::distance(pts.begin(), mmx.first);
int idx_max_y = std::distance(pts.begin(), mmx.second);
// Show results
std::cout << "min y: " << min_y << " at index: " << idx_min_y << std::endl;
std::cout << "max y: " << max_y << " at index: " << idx_max_y << std::endl;
// Using OpenCV boundingRect
Rect box = boundingRect(pts);
std::cout << "min y: " << box.tl().y << std::endl;
std::cout << "max y: " << box.br().y - 1 << std::endl; // Note the -1!!!
return 0;
}
person
Miki
schedule
22.11.2015