1

我有一个组成蠕虫轮廓的有序点向量(用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));
        }
    }
}

这个函数的问题是当蜗杆弯曲很多时,即轮廓在一侧变得凹入,骨架切掉了角落,不再代表蜗杆的中心。我的解决方案是,如果它们是凹的,则移动段末端,纠正段和骨架。

关于一个非常省时的函数的任何建议,它将找到轮廓上的所有凹(或凸)点?

问题图片:

在此处输入图像描述

4

1 回答 1

1

如果没有一些几何计算,就无法从该数组中获得正确的点对。

一种解决方案是沿一侧迭代,然后使用法线找到点的对应物。我想如果蠕虫的宽度没有太大变化,您可以使用固定偏移长度来搜索另一点,并且对于另一点,使用另一侧点的子集,这意味着 BF 匹配应该非常快。然后,您可以在迭代时更新偏移量和子集。

编辑:如果对方索引的初始猜测不是真的很糟糕,那么甚至不需要蛮力匹配,因为你可以遍历边直到没有点更接近了。

于 2014-08-07T23:29:34.877 回答