我从图像中找到了一个轮廓。我想从轮廓中找到最小点和最小点。
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点的值,该怎么做?我真的很困惑那些数据类型。
答案 0 :(得分:2)
您可以从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,因此您还可以使用y
找到boudingRect
值:
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;
}
答案 1 :(得分:0)
一对由最小元素作为第一个元素的迭代器和作为第二个元素的最大元素的迭代器组成。如果范围为空,则返回std :: make_pair(first,first)。如果多个元素等同于最小元素,则返回第一个元素的迭代器。如果多个元素等同于最大元素,则返回最后一个元素的迭代器。
因此mmx.first
是最小值,mmx.second
是最小值。