OpenCV获得轮廓分数

时间:2013-03-24 04:06:09

标签: c++ opencv contour image-segmentation

到目前为止,我已经尝试过一种方法来了解一个点(cvPoint)是否在同一个洞中而不是另一个。我的解决方案是采用cvFindContours()应用产生的CvSeq,并用适当的颜色填充这些孔,以获得blob矩阵。 当它完成时,知道一个点属于同一个轮廓而不是另一个点只是比较像素值,但我无法弄清楚它为什么不起作用。

不幸的是,这是一个没有回答的问题,我在Google和StackOverflow上花了很多时间(或者我找到关键词真的很糟糕)。希望有人有线索;)

IplImage *imgTemp = cvCreateImage(cvGetSize(getMorph()), (getMorph())->depth, 1);
    CvMemStorage *mem = cvCreateMemStorage();
    cvConvertImage(getMorph(), imgTemp);
    CvSeq *contours = NULL;
    cvFindContours(imgTemp, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);

    int colIt=255;
    for (CvSeq *ptr = contours; ptr != NULL; ptr = ptr->h_next) {
        if(ptr->v_next != NULL)
        {
            CvScalar color = CV_RGB( colIt,colIt,colIt);
            cvDrawContours(imgTemp, ptr->v_next, color, color, -1, CV_FILLED, 100);
            --colIt;
        }
    }

2 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是使用C ++ API。使用C ++ API,您可以输出轮廓的层次结构,以便更容易确定它们是否属于同一轮廓。您可以找到findContours here的c ++变体的解释。

仅通过顶部loevel轮廓的示例:

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(contourImage, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
int idx = 0;
for (; idx >= 0; idx = hierarchy[idx][0]) {
 drawContours(image, contours, idx, Scalar(255), CV_FILLED);
}

答案 1 :(得分:0)

根据diip_thomas的答案,您可以使用pointPolygonTest来测试Point2f是否位于contour[i]内(其中contourvector<vector<Point> >i是此向量的第i个元素)。有关示例,请参阅this answer