У меня есть вектор упорядоченных точек, которые составляют контур червя (найден с помощью 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));
}
}
}
Проблема с этой функцией состоит в том, что когда червь сильно изгибается, то есть контур становится вогнутым с одной стороны, скелет обрезает угол и больше не представляет центр червя. Мое решение состоит в том, чтобы сместить концы сегментов, если они вогнутые, исправляя сегменты и скелет.
Есть предложения относительно очень эффективной по времени функции, которая найдет все вогнутые (или выпуклые) точки на контуре?
образ проблемы:
Невозможно получить правильные пары точек из этого массива без некоторых геометрических вычислений.
Одним из решений было бы выполнить итерацию вдоль одной стороны, а затем использовать нормаль, чтобы найти аналог точек. Я полагаю, если ширина червей не меняется слишком сильно, вы можете использовать фиксированную длину смещения для поиска другой точки, а также для другой точки используйте подмножество точек на другой стороне, что будет означать, что BF совпадает должно быть очень быстро Затем вы можете обновить смещение и подмножество во время итерации.
редактировать: если первоначальное предположение индекса партнера не очень ужасно, то даже грубое совпадение не требуется, так как вы можете пересечь сторону, пока ни одна точка не станет ближе.