До сих пор я пытался найти способ узнать, находится ли точка (cvPoint) в той же лунке, что и другая. Мое решение состояло в том, чтобы взять CvSeq, полученный в результате применения cvFindContours (), и заполнить эти дыры подходящим цветом, чтобы получить матрицу из капель.
Когда это будет сделано, знание того, принадлежит ли точка тому же контуру, что и другая точка, состоит только в сравнении значения пикселя, но я не могу понять, почему это не работает.
К сожалению, это вопрос, на который не ответили, и я провел много времени в 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;
}
}
Лучший способ сделать это — использовать API C ++. С помощью API C ++ вы можете вывести иерархию ваших контуров, чтобы было намного проще определить, принадлежат ли они одному и тому же контуру. Вы можете найти объяснение c ++ варианта findContours Вот.
Пример для прохождения только верхних контуров уровня:
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);
}
Опираясь на diip_thomas
ответ, вы, вероятно, можете использовать pointPolygonTest проверить, действительно ли Point2f
лежит внутри contour[i]
(где contour
это vector<vector<Point> >
а также i
является i-тым элементом этого вектора). Увидеть этот ответ для примера.