从 std::vector<cv::Point>::const_iterator 检索值
Posted
技术标签:
【中文标题】从 std::vector<cv::Point>::const_iterator 检索值【英文标题】:Retrieve value from std::vector<cv::Point>::const_iterator 【发布时间】:2016-02-24 12:16:17 【问题描述】:我从图像中找到了轮廓。我想从轮廓中找到最小点和最小点。
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 的值,该怎么做?我真的对这些数据类型感到困惑。
【问题讨论】:
“但由于我的愚蠢” - 不,因为你莫名其妙地不愿意阅读文档。说真的,en.cppreference.com/w/cpp/algorithm/minmax_element 的文档有什么问题? 【参考方案1】:您可以从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 中,您还可以使用 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!!!
虽然这可能比较慢,但您不需要定义自定义比较函数。如果需要,这还会计算最小和最大 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】:来自the std::minmax()
docs:
一对由最小元素的迭代器(作为第一个元素)和一个最大元素的迭代器(作为第二个元素)组成。如果范围为空,则返回 std::make_pair(first, first)。如果几个元素等价于最小元素,则返回第一个此类元素的迭代器。如果多个元素等价于最大元素,则返回最后一个此类元素的迭代器。
所以mmx.first
是最小值,mmx.second
是最大值。
【讨论】:
你应该说明你的引用来源:en.cppreference.com/w/cpp/algorithm/minmax_element @ChristianHackl:是的,计划,甚至将它放在我的剪贴板中,但它在标记中丢失了......已修复。谢谢。以上是关于从 std::vector<cv::Point>::const_iterator 检索值的主要内容,如果未能解决你的问题,请参考以下文章
从 Go 中迭代`std::vector<std::string>`?
将元素从 std::vector 复制到 std::stack c++
将函数返回从“std::vector<QString>”转换为“QVariant”
使用 std::count_if() 时出现错误“没有从 'std::vector<double, std::allocator<double> >' 到 'double *'