在OpenCV中绘制多边形

Drawing Polygons in OpenCV?

本文关键字:多边形 绘制 OpenCV      更新时间:2023-10-16

我哪里做错了?

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循环结束时缺少的括号,因为这只是我代码的一部分)

只是为了记录(并且因为opencv文档在这里非常稀疏)使用c++ API的更精简的代码片段:

  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));

让我们分析违规行:

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

您声明contourElementvector <vector<Point> >,这意味着contourElement.at(0)返回vector<Point>而不是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);

contouelement是vector<Point>的矢量,而不是Point:)所以不是:

const Point *elementPoints

const vector<Point> *elementPoints

有些人可能会因为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);
    ...

希望对大家有所帮助。