【问题标题】:Drawing Polygons in OpenCV?在 OpenCV 中绘制多边形?
【发布时间】:2012-01-07 01:12:07
【问题描述】:

我在这里做错了什么?

vector <vector<Point> > contourElement;

for (int counter = 0; counter < contours -> size (); counter ++)
{   
    contourElement.push_back (contours -> at (counter));

    const Point *elementPoints [1] = {contourElement.at (0)};
    int numberOfPoints [] = {contourElement.at (0).size ()};

    fillPoly (contourMask, elementPoints, numberOfPoints, 1, Scalar (0, 0, 0), 8);

我不断收到关于 const Point 部分的错误。编译器说

error: cannot convert 'std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > >' to 'const cv::Point*' in initialization

我做错了什么? (PS:显然忽略了for循环末尾缺少的括号,因为这只是我的代码的一部分)

【问题讨论】:

    标签: c++ arrays opencv image-processing vector


    【解决方案1】:

    有些人可能会因为 OpenCV 的 samples/cpp/create_mask.cpp 中的明显错误而到达这里。这样,考虑到上述解释,我将“if (event == EVENT_RBUTTONUP)”分支编辑为:

        ...
        mask = Mat::zeros(src.size(), CV_8UC1);
        vector<Point> tmp = pts;
        const Point* elementPoints[1] = { &tmp[0] };        
        
        int npts = (int) pts.size();        
        
        cout << "elementsPoints=" << elementPoints << endl;
    
        fillPoly(mask, elementPoints, &npts, 1, Scalar(255, 255, 255), 8);     
        bitwise_and(src, src, final, mask);
        ...
    

    希望它可以帮助某人。

    【讨论】:

      【解决方案2】:

      仅作记录(并且因为 opencv 文档在这里非常稀疏)使用 c++ API 更简化的 sn-p:

        std::vector<cv::Point> fillContSingle;
        [...]
        //add all points of the contour to the vector
        fillContSingle.push_back(cv::Point(x_coord,y_coord));
        [...]
      
        std::vector<std::vector<cv::Point> > fillContAll;
        //fill the single contour 
        //(one could add multiple other similar contours to the vector)
        fillContAll.push_back(fillContSingle);
        cv::fillPoly( image, fillContAll, cv::Scalar(128));
      

      【讨论】:

      • Afaik 这个 c++ 对 fillPoly 的调用在任何地方都没有记录,但它是绘制填充多边形最简单、最直观的方法!
      • Double >> 嵌套 std::vectors 不适用于 GCC。我试图在答案中添加一个空格,但每次编辑至少需要 6 个字符。
      • @lahjaton_j;谢谢,我加了一个空白
      • 不错!我想知道为什么没有任何关于这种方式的文档。此外,在这种单轮廓情况下,您可以将其包装在调用中:fillPoly(image, vector&lt;vector&lt;Point&gt;&gt;{fillContSingle}, color)
      【解决方案3】:

      让我们分析一下违规行:

      const Point *elementPoints [1] = { contourElement.at(0) };
      

      您将contourElement 声明为vector &lt;vector&lt;Point&gt; &gt;,这意味着contourElement.at(0) 返回vector&lt;Point&gt; 而不是const cv::Point*。所以这是第一个错误。

      最后,您需要执行以下操作:

      vector<Point> tmp = contourElement.at(0);
      const Point* elementPoints[1] = { &tmp[0] };
      int numberOfPoints = (int)tmp.size();
      

      稍后,将其称为:

      fillPoly (contourMask, elementPoints, &numberOfPoints, 1, Scalar (0, 0, 0), 8);
      

      【讨论】:

      • 谢谢。但是,在声明“const Point* elementPoints [1] = {tmp [0]};”的行上我收到错误消息“错误:在初始化中无法将 'cv::Point_' 转换为 'const cv::Point*'”。知道为什么吗?
      • 是的,我忘了添加&amp;。已更新答案,请立即测试。
      • 谢谢。它编译正确,但我有一个问题。你不只是指向一个奇异点吗?绘制整个多边形不需要传入所有点吗?
      • 您指向向量的第一个元素,但是 numberOfPoints 定义了之后有多少个元素。 ;)
      • 说,如果我有 4 个坐标,(x1,y1), (x2,y2), (x3,y3) 和 (x4,y4) 怎么写成向量的形式。 ?请帮忙。!!
      【解决方案4】:

      contourElement 是 vector&lt;Point&gt; 的向量,而不是 Point :) 所以而不是:

      const Point *elementPoints
      

      const vector<Point> *elementPoints
      

      【讨论】:

      • 谢谢。但对于函数,参数必须是 const Point 而不是 const 点向量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 2016-05-20
      • 2015-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多