2016-04-13 95 views
3

我试图实现这个code,但是当我想要确定轮廓的最极端点时,请按照本教程进行操作。使用OpenCV C++查找轮廓线上的极端点

# 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]) 

任何人都可以帮助我解决这个问题吗?

+0

看看http://answers.opencv.org/question/64433 – sturkmen

回答

3

std::vector<cv::Point>开始,您可以使用std::max_elementstd::min_element用适当的比较,即适用于x坐标找到点,并适用于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; 
        }); 
+0

为extRight和extBot的代码需要有比较反转(lhs.x> rhs.x用于extRight,lhs.y> rhs.y用于extBot) – bantic

+0

@bantic你是对的......实际上这个代码很糟糕;)我会用minmax_element asap重写它 – Miki