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

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

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

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

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

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


person John Whitworth    schedule 07.08.2014    source источник
comment
См. answers.opencv. орг/вопрос/3207/   -  person Haris    schedule 08.08.2014
comment
@Haris Я рассмотрел этот вариант, но моя проблема в том, чтобы получить точки на скелете, упорядоченные от головы до хвоста. Любые идеи?   -  person John Whitworth    schedule 08.08.2014
comment
Найти контур даст вам точки по порядку.   -  person Haris    schedule 08.08.2014


Ответы (1)


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

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

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

person bluewater2    schedule 07.08.2014