1 Вопрос: Ошибка компиляции с использованием функции lamda с max_element

вопрос создан в Wed, May 8, 2019 12:00 AM

Я пытаюсь написать код, чтобы найти контур с максимальным размером в std :: vector of contour.

У меня следующая ошибка

error: conversion from ‘__gnu_cxx::__normal_iterator<std::vector<cv::Point_<int> >*, std::vector<std::vector<cv::Point_<int> > > >’ to non-scalar type
‘std::vector<cv::Point_<int> >::iterator {aka __gnu_cxx::__normal_iterator<cv::Point_<int>*, std::vector<cv::Point_<int> > >}’ requested
    std::vector<cv::Point2i>::iterator it = std::max_element(contours.begin(), contours.end()

Ниже мой код

std::vector<std::vector <cv::Point2i>> contours;
std::vector<cv::Vec4i> hierarchy;

cv::findContours(rImg, contours, hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cv::Point(0, 0));
cv::Mat blank = cv::Mat::zeros(frame.size(), CV_8UC3);
cv::RNG rng;

std::vector<cv::Point2i>::iterator it = std::max_element(contours.begin(), contours.end(),
                                                        [](const std::vector<cv::Point2i>& p1, 
                                                        const std::vector<cv::Point2i>& p2)
                                                        { return p1.size()< p2.size(); });


std::vector<std::vector<cv::Point2i> > contourV;
contourV.push_back(it);

Хотелось бы узнать, что не так и как их исправить

    
1
  1. , поэтому было изобретено ключевое слово auto.
    2019-05-08 16: 52: 06Z
1 ответ                              1                         

Вы используете объект типа

std::vector<std::vector <cv::Point2i>> contours;

в алгоритме std::max_element

Таким образом, итератор должен соответствовать этому контейнеру. Это

std::vector<std::vector <cv::Point2i>>::iterator it = std::max_element( /*...*/ );

Или было бы еще проще написать

auto it = std::max_element(contours.begin(), contours.end(),
                           [](const std::vector<cv::Point2i>& p1, 
                              const std::vector<cv::Point2i>& p2)
                              { return p1.size()< p2.size(); });

как указано @melpomene в комментарии.

    
2
2019-05-08 16: 29: 03Z
  1. Или просто auto это.
    2019-05-08 16: 28: 55Z
  2. Еще проще: auto it = std::max_element(contours.begin(), contours.end(), [](const auto& p1, const auto& p2) { return p1.size() < p2.size(); });
    2019-05-08 16: 50: 45Z
  3. спасибо за большую помощь .... ребята ... только начали использовать функцию lamda в программировании ...
    2019-05-09 00: 33: 18Z
источник размещен Вот