Получить значение из std :: vector & lt; cv :: Point & gt; :: const_iterator

Я нашел контур от изображения. Я хочу найти минимальную точку и минимальную точку из контуров.

vector<Point> test = contours[0];
auto mmx = std::minmax_element(test.begin(), test.end(), less_by_y);

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

Я пробовал эту кодировку, и она успешно работает. Но из-за моей глупости я не знаю, как извлечь данные из mmx. Кто-нибудь, пожалуйста, помогите мне?

Если я хочу получить доступ к значению точки y из контуров, как это сделать? Я действительно перепутал с этими типами данных.

1

Решение

Вы можете видеть из minmax_element документация, что он возвращает пару итераторов.

Дано:

vector<Point> pts = ...
auto mmx = std::minmax_element(pts.begin(), pts.end(), less_by_y);

Вы можете получить доступ к итератору для элемента min с помощью mmx.firstи итератор элемента max с 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!!!

Хотя это, вероятно, медленнее, вам не нужно определять пользовательскую функцию сравнения. Это также вычисляет мин и макс 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;
}
2

Другие решения

От std::minmax() документы:

пара, состоящая из итератора для наименьшего элемента в качестве первого элемента и итератора для наибольшего элемента в качестве второго. Возвращает std :: make_pair (first, first), если диапазон пуст. Если несколько элементов эквивалентны наименьшему элементу, возвращается итератор первого такого элемента. Если несколько элементов эквивалентны наибольшему элементу, возвращается итератор последнего такого элемента.

Так mmx.first это минимум и mmx.second это максимум.

0

По вопросам рекламы [email protected]