Нахождение индексов выпуклых точек на контуре

У меня есть вектор упорядоченных точек, которые составляют контур червя (найден с помощью 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));
}
}
}

Проблема с этой функцией состоит в том, что когда червь сильно изгибается, то есть контур становится вогнутым с одной стороны, скелет обрезает угол и больше не представляет центр червя. Мое решение состоит в том, чтобы сместить концы сегментов, если они вогнутые, исправляя сегменты и скелет.

Есть предложения относительно очень эффективной по времени функции, которая найдет все вогнутые (или выпуклые) точки на контуре?

образ проблемы:

введите описание изображения здесь

1

Решение

Невозможно получить правильные пары точек из этого массива без некоторых геометрических вычислений.

Одним из решений было бы выполнить итерацию вдоль одной стороны, а затем использовать нормаль, чтобы найти аналог точек. Я полагаю, если ширина червей не меняется слишком сильно, вы можете использовать фиксированную длину смещения для поиска другой точки, а также для другой точки используйте подмножество точек на другой стороне, что будет означать, что BF совпадает должно быть очень быстро Затем вы можете обновить смещение и подмножество во время итерации.

редактировать: если первоначальное предположение индекса партнера не очень ужасно, то даже грубое совпадение не требуется, так как вы можете пересечь сторону, пока ни одна точка не станет ближе.

1

Другие решения