使用OpenCV C++在轮廓中查找极值点

3

我尝试实现了这个代码,但是在按照此教程确定轮廓的最极点时遇到了问题。

# determine the most extreme points along the contour
    extLeft = tuple(c[c[:, :, 0].argmin()][0])
    extRight = tuple(c[c[:, :, 0].argmax()][0])
    extTop = tuple(c[c[:, :, 1].argmin()][0])
    extBot = tuple(c[c[:, :, 1].argmax()][0])

有人能帮我解决这个问题吗?


请查看http://answers.opencv.org/question/64433 - sturkmen
1个回答

4

从一个std::vector<cv::Point>开始,您可以使用合适的比较器在x坐标上运行std::max_elementstd::min_element来查找左侧右侧点,并在y坐标上运行以查找顶部底部点:

// Your points
vector<Point> pts;
...


Point extLeft  = *min_element(pts.begin(), pts.end(), 
                      [](const Point& lhs, const Point& rhs) {
                          return lhs.x < rhs.x;
                  }); 
Point extRight = *max_element(pts.begin(), pts.end(),
                      [](const Point& lhs, const Point& rhs) {
                          return lhs.x < rhs.x;
                  });
Point extTop   = *min_element(pts.begin(), pts.end(), 
                      [](const Point& lhs, const Point& rhs) {
                          return lhs.y < rhs.y;
                  }); 
Point extBot   = *max_element(pts.begin(), pts.end(),
                      [](const Point& lhs, const Point& rhs) {
                          return lhs.y < rhs.y;
                  });

extRight和extBot的代码需要将比较反转(对于extRight,lhs.x > rhs.x;对于extBot,lhs.y > rhs.y)。 - bantic
@bantic 你说得对... 实际上这段代码很糟糕 ;) 我会尽快使用minmax_element重写它 - Miki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接