假设你已经有了轮廓并且它是一个点向量,你可以使用std::minmax_element函数来达到同样的目的。它支持一种比较方法,如果它遵循签名,则可以是任何你想要的方法。因此,与您所做的类似的简单代码是:
#include <iostream>
#include <vector>
#include <algorithm>
// this is not necessary, just for testing (OpenCV Points should be used instead)
struct Point
{
int x;
int y;
Point():
x(0), y(0){}
Point(int xVal, int yVal):
x(xVal), y(yVal){}
};
int main()
{
std::vector<Point> cnt = {
{1,2},{4,5},{1,6}, {7,8}, {9,3}, {2,6}
};
// compare x axis
auto val = std::minmax_element(cnt.begin(), cnt.end(), [](Point const& a, Point const& b){
return a.x < b.x;
});
std::cout << " leftMost [ " << val.first->x << ", " << val.first->y << " ]" << std::endl;
std::cout << " RightMost [ " << val.second->x << ", " << val.second->y << " ]" << std::endl;
// compare y axis
val = std::minmax_element(cnt.begin(), cnt.end(), [](Point const& a, Point const& b){
return a.y < b.y;
});
std::cout << " TopMost [ " << val.first->x << ", " << val.first->y << " ]" << std::endl;
std::cout << " BottomMost [ " << val.second->x << ", " << val.second->y << " ]" << std::endl;
return 0;
}
这是一个link 来运行它。
在这个例子中,Point 结构只是为了模拟 OpenCV,但它的工作原理完全相同。我创建了一个测试向量,运行 minmax_element 仅比较 x 轴并打印结果。我对y 轴做同样的事情。
这个函数返回一对迭代器到这样的对象,如果你需要它们被返回,请确保复制它们:)