У меня есть вектор упорядоченных точек, которые составляют контур червя (найден с помощью opencv). Я пытаюсь получить точки вдоль скелета червя. Я хочу сделать это очень быстро и иметь простую функцию сегментации:
void Worm::segmentWorm(void)
{
int jump = 5;
int numPoints = wormContour.size();
int currentIndex = headIndex; //large circle in image w/overlay
int endIndex = tailIndex; //small circle in image w/overlay
int matchingIndex;
int direction = (endIndex - currentIndex)/abs(endIndex - currentIndex);
int thisSideLength = abs(endIndex - currentIndex);
int otherSideLength = numPoints - thisSideLength;
double lengthPercentage;
if (direction > 0) {
while (currentIndex < endIndex - jump) {
currentIndex += jump;
lengthPercentage = (double)(endIndex - currentIndex)/(double)thisSideLength;
matchingIndex = boundCheck((int)((lengthPercentage * otherSideLength) + endIndex), numPoints - 1);
segments.push_back(pair<int, int>(currentIndex, matchingIndex));
}
} else if (direction < 0) {
while (currentIndex > endIndex + jump) {
currentIndex -= jump;
lengthPercentage = (double)(currentIndex - endIndex)/(double)thisSideLength;
matchingIndex = boundCheck((int)(-(lengthPercentage * otherSideLength) + endIndex), numPoints - 1);
segments.push_back(pair<int, int>(currentIndex, matchingIndex));
}
}
}
Проблема с этой функцией заключается в том, что когда червяк сильно изгибается, то есть контур становится вогнутым с одной стороны, скелет срезает угол и больше не представляет собой центр червяка. Мое решение состоит в том, чтобы сместить концы сегментов, если они вогнутые, исправив сегменты и скелет.
Любые предложения по очень эффективной функции, которая найдет все вогнутые (или выпуклые) точки на контуре?
образ проблемы: