1

到目前为止,我已经尝试找到一种方法来知道一个点(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;
        }
    }
4

2 回答 2

0

基于diip_thomas的答案,您可能可以使用pointPolygonTest来测试 a 是否Point2f位于内部contour[i]contoura是哪里,vector<vector<Point> >并且i是这个向量的第 i 个元素)。有关示例,请参见此答案。

于 2013-04-26T09:29:34.990 回答
0

最好的方法是使用 C++ API。使用 C++ API,您可以输出轮廓的层次结构,从而更容易确定它们是否属于同一轮廓。您可以在此处找到 findContours 的 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);
}
于 2013-03-26T13:39:11.903 回答