2011-11-26 158 views
4

我在这里做错了什么?在OpenCV中绘制多边形?

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循环结束时的丢失托架由于此仅为我的代码部分)

回答

12

让我们分析问题的行:

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

谢谢。但是,在表示“const Point * elementPoints [1] = {tmp [0]}”的行;“我得到错误说:“错误:不能在初始化中将'cv :: Point_ '转换为'const cv :: Point *'。任何想法为什么? – fdh

+0

是的,我忘了添加一个'&'。更新了答案,请现在测试。 – karlphillip

+0

谢谢。它编译正确,但我有一个问题。你不只是指出一个奇点吗?你不需要通过所有的点来绘制整个多边形吗? – fdh

2

contourElement是vector<Point>矢量,而不是指向:) 所以不是:

const Point *elementPoints 

const vector<Point> *elementPoints 
+0

谢谢。但是对于函数,参数必须是一个常量点而不是一个常量向量点。 – fdh

9

只是为了记录(因为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)); 
+2

Afaik这个C++的fillPoly调用没有记录在任何地方,但它是绘制填充多边形的最简单和最直观的方法! – Micka

+0

Double >>嵌套的std :: vectors不适用于GCC。我试图给答案增加一个空格,但每次编辑至少需要6个字符。 –

+0

@ lahjaton_j; Thxs,我添加了一个空白 –