到目前为止,我已经尝试过一种方法来了解一个点(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;
}
}
答案 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]
内(其中contour
是vector<vector<Point> >
和i
是此向量的第i个元素)。有关示例,请参阅this answer。