如何找到最大的轮廓?

时间:2016-11-22 12:05:42

标签: python c++ opencv

我在 python 中编写了一个使用 max()方法的脚本,我试图用c ++重新创建一个类似的程序,但是我在获取值时遇到了麻烦对于面具中最大的轮廓。

我曾尝试在C ++中使用算法库中的 max_element()函数,但无济于事。我也尝试取消引用迭代器但收到一系列错误,这是我的代码:

if (contours.size() > 0)
{
    c = *max_element(contours.begin(), contours.end());
    //not compiling
}

这是错误:

no match for 'operator=' (operand types are 'std::vector<std::vector<cv::Point_<int> > >' and 'std::vector<cv::Point_<int> >')

以下是我在Python中的表现:

if len(contours) > 0;
        #find largest contour in mask, use to compute minEnCircle 
        c = max(contours, key = cv2.contourArea)
        (x,y), radius) = cv2.minEnclosingCircle(c)
        M = cv2.moments(c)

2 个答案:

答案 0 :(得分:7)

在Python示例中,您将比较器作为key参数

传递
c = max(contours, key = cv2.contourArea)

相当于将比较器传递给std::max_element

auto c = *std::max_element(contours.begin(),
                           contours.end(),
                           [](std::vector<cv::Point> const& lhs, std::vector<cv::Point> const& rhs)
          {
              return contourArea(lhs, false) < contourArea(rhs, false);
          });

在这种情况下,c将是std::vector<cv::Point>类型,代表轮廓。

答案 1 :(得分:0)

我认为该集合是根据OpenCV所需的findContours函数所需的点的嵌套向量。

在这种情况下,您可以看到解决方案的示例:Find Biggest Contour Using C++

基本上,您可以调用contourArea来获取轮廓所采用的实际区域,或者boundingRect或者minAreaRect来确定可以包含轮廓的区域。取决于你实际需要的是什么。