如何找到最大的轮廓?

ran*_*ndy 2 c++ python opencv

我在python中编写了一个使用max()方法的脚本,我试图在c ++中重新创建一个类似的程序,但是我无法获得掩码中最大轮廓的值.

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

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

这是错误:

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

以下是我在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)
Run Code Online (Sandbox Code Playgroud)

Cor*_*mer 8

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

c = max(contours, key = cv2.contourArea)
Run Code Online (Sandbox Code Playgroud)

这样做的相当于是一个比较传给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);
          });
Run Code Online (Sandbox Code Playgroud)

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

  • 类型名称没问题; D. (3认同)
  • 你之前是否定义了变量`c`?如果是这样,它需要声明为`std :: vector <cv :: Point>`,然后你可以删除`if`块中的`auto`.是的lambdas仅在C++ 11或更高版本中可用,如果您使用以前的编译器版本,您可以[编写一个仿函数](/sf/ask/24986531/相反,它将以相同的方式行事. (2认同)