![](/img/trans.png)
[英]Using std::lower_bound with std::vector::const_iterator
[英]Retrieve value from 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点的值,该怎么做? 我真的对那些数据类型感到困惑。
您可以从minmax_element文档中看到它返回了一对迭代器。
鉴于:
vector<Point> pts = ...
auto mmx = std::minmax_element(pts.begin(), pts.end(), less_by_y);
您可以使用mmx.first
来访问min元素的迭代器,使用mmx.second
来访问max元素的迭代器。
如果要检索最小和最大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!!!
尽管这可能会比较慢,但是您无需定义自定义比较功能。 如果需要,这还将计算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;
}
一对,由最小元素的迭代器作为第一个元素,至最大元素的迭代器作为第二个元素。 如果范围为空,则返回std :: make_pair(first,first)。 如果几个元素等于最小的元素,则返回第一个此类元素的迭代器。 如果几个元素等于最大元素,则返回最后一个此类元素的迭代器。
因此, mmx.first
是最小值, mmx.second
是最大值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.