private void CollectLines()
{
int maxTheta = houghMap.GetLength(0);
int maxRadius = houghMap.GetLength(1);
short intensity;
bool foundGreater;
int halfHoughWidth = maxRadius >> 1;
// clean lines collection
lines.Clear();
// for each Theta value
for (int theta = 0; theta < maxTheta; theta++)
{
// for each Radius value
for (int radius = 0; radius < maxRadius; radius++)
{
// get current value
intensity = houghMap[theta, radius];
if (intensity < minLineIntensity)
continue;
foundGreater = false;
// check neighboors
for (int tt = theta - localPeakRadius, ttMax = theta + localPeakRadius; tt < ttMax; tt++)
{
// break if it is not local maximum
if (foundGreater == true)
break;
int cycledTheta = tt;
int cycledRadius = radius;
// check limits
if (cycledTheta < 0)
{
cycledTheta = maxTheta + cycledTheta;
cycledRadius = maxRadius - cycledRadius;
}
if (cycledTheta >= maxTheta)
{
cycledTheta -= maxTheta;
cycledRadius = maxRadius - cycledRadius;
}
for (int tr = cycledRadius - localPeakRadius, trMax = cycledRadius + localPeakRadius; tr < trMax; tr++)
{
// skip out of map values
if (tr < 0)
continue;
if (tr >= maxRadius)
break;
// compare the neighboor with current value
if (houghMap[cycledTheta, tr] > intensity)
{
foundGreater = true;
break;
}
}
}
// was it local maximum ?
if (!foundGreater)
{
// we have local maximum
lines.Add(new HoughLine((double)theta / stepsPerDegree, (short)(radius - halfHoughWidth), intensity, (double)intensity / maxMapIntensity));
}
}
}
lines.Sort();
}
}