1 Lỗi biên dịch khi sử dụng hàm lamda với max_element

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đang cố gắng viết một số mã để tìm đường viền với kích thước tối đa trong một std :: vector của đường viền.

Tôi có lỗi sau

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()

Dưới đây là mã của tôi

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);

Muốn biết cái gì sai và cách sửa chúng

    
1
  1. đó là lý do tại sao từ khóa auto được phát minh.
    2019-05-08 16: 52: 06Z
1 Câu trả lời                              1                         

Bạn đang sử dụng một đối tượng thuộc loại

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

trong thuật toán std::max_element

Vì vậy, trình vòng lặp sẽ tương ứng với vùng chứa đó. Đó là

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

Hoặc nó sẽ đơn giản hơn để viết

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(); });

như @melpomene đã chỉ ra trong một nhận xét.

    
2
2019-05-08 16: 29: 03Z
  1. Hoặc chỉ auto.
    2019-05-08 16: 28: 55Z
  2. Thậm chí đơn giản hơn: 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. cảm ơn vì sự giúp đỡ tuyệt vời .... các bạn ... mới bắt đầu sử dụng chức năng lamda trong lập trình ...
    2019-05-09 00: 33: 18Z
nguồn đặt đây