在OpenCV中绘制多边形?

fdh*_*fdh 6 c++ arrays opencv vector image-processing

我在这做错了什么?

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);
Run Code Online (Sandbox Code Playgroud)

我一直在const Point部分出错.编译说

error: cannot convert 'std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > >' to 'const cv::Point*' in initialization
Run Code Online (Sandbox Code Playgroud)

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

kar*_*lip 13

让我们分析一下违规行:

const Point *elementPoints [1] = { contourElement.at(0) };
Run Code Online (Sandbox Code Playgroud)

你声明contourElementvector <vector<Point> >,这意味着contourElement.at(0)返回a vector<Point>而不是a const cv::Point*.这是第一个错误.

最后,你需要做一些事情:

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

后来称之为:

fillPoly (contourMask, elementPoints, &numberOfPoints, 1, Scalar (0, 0, 0), 8);
Run Code Online (Sandbox Code Playgroud)


Oli*_*del 13

仅仅为了记录(并且因为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));
Run Code Online (Sandbox Code Playgroud)

  • Afaik这个关于fillPoly的c ++调用没有在任何地方记录,但它是绘制填充多边形的最简单,最直观的方法! (3认同)
  • 好的!我想知道为什么没有任何关于这种方式的文档。此外,在这种单轮廓情况下,您可以将其包装在调用中:`fillPoly(image, vector&lt;vector&lt;Point&gt;&gt;{fillContSingle}, color)` (2认同)