Получить значение из std::vector‹cv::Point›::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 из контуров, как это сделать? Я действительно запутался с этими типами данных.


person SamTew    schedule 22.11.2015    source источник
comment
Но из-за моей тупости - Нет, из-за вашего необъяснимого нежелания читать документацию. Серьезно, что не так с документацией на en.cppreference.com/w/cpp/algorithm/ minmax_element?   -  person Christian Hackl    schedule 22.11.2015


Ответы (2)


Из документации 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

Из документов std::minmax():

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

Таким образом, mmx.first — это минимум, а mmx.second — это максимум.

person Adi Shavit    schedule 22.11.2015
comment
Вы должны указать источник вашего цитирования: en.cppreference.com/w/cpp/algorithm /минмакс_элемент - person Christian Hackl; 22.11.2015
comment
@ChristianHackl: Да, планировал, он даже был в моем буфере обмена, но он потерялся в разметке... Исправлено. Спасибо. - person Adi Shavit; 22.11.2015