public static List <Line> GetLinesFromHS(HoughSpace hs, int width, int height, byte[] buffer, int threshold) { List <Line> result = new List <Line>(); foreach (var key in hs.HS.Keys) { if (hs.HS[key].Count > threshold) { result.Add(new Line(hs.HS[key][0].Key, hs.HS[key][0].Value, hs.HS[key][3].Key, hs.HS[key][3].Value)); } } return(result); }
public static HoughSpace HoughTransform2(int width, int height, byte[] buffer) { HoughSpace result = new HoughSpace(); int distMax = (int)Math.Round(Math.Sqrt(height * height + width * width)); var theta = new double[179]; var rho = new int[distMax * 2 + 1]; //var H = new int[rho.Length, theta.Length]; int idx = 0; for (int i = 0; i < 90; i++) { theta[idx] = (Math.PI) / 180 * i; idx++; } for (int i = 91; i < 180; i++) { theta[idx] = (Math.PI) / 180 * i; idx++; } //{ theta[idx] = i;idx++; } idx = 0; for (int i = -distMax; i <= distMax; i++) { rho[idx] = i; idx++; } Console.WriteLine("Heihgt and width: {0}, {1}", height, width); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (CheckIfPxIsInEdge(width, height, buffer, i, j)) { for (var iTheta = 0; iTheta < theta.Length; iTheta++) { //var angleInRadians = theta[iTheta] * Math.PI / 180; //var distanceFromOrigin = j * Math.Cos(angleInRadians) + i * Math.Sin(angleInRadians); var r = i * Math.Cos(theta[iTheta]) + j * Math.Sin(theta[iTheta]); //FindClosestRhoToDistance(rho, r, out var minDist, out var indexInArray); var rhoIndex = FindDamnIndexInDamnArray(rho, (int)r); //H[(int)r + distMax, iTheta]++; var kv = new KeyValuePair <double, int>(theta[iTheta], rhoIndex); if (result.HS.ContainsKey(kv)) { result.HS[kv].Add(new KeyValuePair <int, int>(i, j)); } else { var l = new List <KeyValuePair <int, int> >(); l.Add(new KeyValuePair <int, int>(i, j)); result.HS.Add(kv, l); } //if (minDist < 1) //{ // H[indexInArray, iTheta]++; //} } } } Console.WriteLine("i is {0}", i); } return(result); }