ワームの輪郭を構成する順序付けられたポイントのベクトルがあります (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));
}
}
}
この関数の問題点は、ワームが大きく曲がると、つまり、輪郭が片側で凹状になると、スケルトンが角を切り取り、ワームの中心を表すことができなくなることです。私の解決策は、セグメントの端が凹んでいる場合はセグメントの端をずらして、セグメントとスケルトンを修正することです。
輪郭上のすべての凹面 (または凸面) の点を見つける非常に時間効率の良い関数に関する提案はありますか?
問題の画像: