【问题标题】:How to find the largest contour?如何找到最大的轮廓?
【发布时间】:2017-04-06 02:25:38
【问题描述】:

我在 python 中编写了一个使用 ma​​x() 方法的脚本,我正在尝试在 c++ 中重新创建一个类似的程序,但我无法获得该值用于遮罩中的最大轮廓。

我曾尝试使用 C++ 算法库中的 ma​​x_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)

【问题讨论】:

  • contours! 的类型是什么? C++ 是静态类型的,这就是确定操作有效性的方式。
  • std::vector > 轮廓;

标签: python c++ opencv


【解决方案1】:

在您的 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&lt;cv::Point&gt;,它表示轮廓。

【讨论】:

  • 类型名没问题 ;D
  • 感谢您的及时回复,我尝试编译此文件,但收到错误提示“'auto' 在 c++11 中更改含义;请删除它”。
  • 在没有 'auto' 的情况下编译后,我收到一条错误消息,指出“lamba 表达式仅适用于 -std=c++11 或 std-gnu++11。
  • 您之前是否定义了变量c?如果是这样,则需要将其声明为std::vector&lt;cv::Point&gt;,然后您可以删除if 块中的auto。是的,lambdas 仅在 C++11 或更高版本中可用,如果您使用的是以前的编译器版本,您可以 write a functor 代替,其作用方式相同。
  • 感谢您对函子的启发!我在 Qt 上使用 gcc-4.9,所以我发现我需要修改我的 .pro 文件以包含 "QMAKE_CXXFLAGS += -std=c++11" 行。再次感谢!
【解决方案2】:

根据 OpenCV 中的 findContours 函数的要求,我假设该集合是一个嵌套的点向量。

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

基本上,您调用contourArea 来获取轮廓所占据的实际区域,或者调用boundingRect 或者minAreaRect 来确定轮廓可以包含的区域。取决于您的实际需求。

【讨论】:

    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 2018-07-09
    • 2020-09-14
    • 2016-12-10
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多