C++ 从std::vector中检索值<;cv::Point>;::常量迭代器

C++ 从std::vector中检索值<;cv::Point>;::常量迭代器,c++,opencv,minmax,C++,Opencv,Minmax,我从图像中找到了一个轮廓。我想从等高线中找到最小点和最小点 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; } 向量测试=等高线[

我从图像中找到了一个轮廓。我想从等高线中找到最小点和最小点

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;
}
向量测试=等高线[0];
auto mmx=std::minmax_元素(test.begin()、test.end()、less_by_y);
按y(常数cv::点和左侧,常数cv::点和右侧)
{
返回左侧y<右侧y;
}
我已经尝试过这种编码,它运行成功。但由于我的愚蠢,我不知道如何从mmx检索数据。谁能帮帮我

如果我想从等高线获取点y的值,怎么做?我真的把这些数据类型弄糊涂了。

来自:

由一个迭代器到最小元素作为第一个元素和一个迭代器到最大元素作为第二个元素组成的一对。如果范围为空,则返回std::make_pair(first,first)。如果几个元素相当于最小的元素,则返回第一个此类元素的迭代器。如果几个元素相当于最大的元素,则返回最后一个此类元素的迭代器

因此
mmx。first
是最小值,
mmx。second
是最大值。

您可以从文档中看到它返回一对迭代器

鉴于:

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

由于您在OpenCV中,因此还可以使用
boudingRect
查找
y
值:

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!!!

“但由于我的愚蠢”-不,因为你莫名其妙地不愿意阅读文档。说真的,这里的文档有什么问题吗?你应该说明你引用的来源:@ChristianHackl:是的,计划好了,甚至在我的剪贴板上,但它在markeup中丢失了。。。固定的。谢谢
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!!!
#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;
}