]> rtime.felk.cvut.cz Git - eurobot/public.git/commitdiff
Merge branch 'shapedet' of ssh://rtime.felk.cvut.cz/eurobot into shapedet
authorMartin Synek <synek.martin@gmail.com>
Thu, 21 Apr 2011 15:21:11 +0000 (17:21 +0200)
committerMartin Synek <synek.martin@gmail.com>
Thu, 21 Apr 2011 15:21:11 +0000 (17:21 +0200)
Conflicts:
src/hokuyo/shape-detect/shape_detect.cc
src/hokuyo/shape-detect/shape_detect.h

Shape_detect:
Solution conflict.
Error correction in Bresenham's algorithm (convert constant to milimeters).

1  2 
src/hokuyo/shape-detect/shape_detect.cc
src/hokuyo/shape-detect/shape_detect.h

index cabf767c8d96e320a30456b0a0066ad1fb686d12,006798167fd3f15ecbc704da8acf66a3a7fb86ad..71caf5d414c5732d712b179ae5075ced6093ad48
@@@ -161,92 -161,82 +161,165 @@@ bool Shape_detect::fit_arc(int begin, i
        return 0;
  }
  
- void Shape_detect::bresenham_circle(int scale_radius, std::vector<Shape_detect::Point> &circle)
++void Shape_detect::bresenham_circle(const float &radius, const float &scale, std::vector<Shape_detect::Point> &circle)
 +{
 +      int d;
 +
++      int scale_radius = abs((radius / 10) / (scale / 10));
++
 +      int x = 0;
 +      int y = scale_radius;
 +
 +      Shape_detect::Point tmp;
 +
 +      tmp.x = x;
 +      tmp.y = y;
 +
 +      circle.push_back(tmp);
 +
 +      d = 3 - (2 * scale_radius);
 +
 +      for (x = 0; x <= y; x++) {
 +              if (d < 0) {
 +                      y = y;
 +                      d = (d + (4 * x) + 6);
 +              } else {
 +                      y--;
 +                      d = d + (4 * (x - y) + 10);
 +              }
 +              
 +              tmp.x = x;
 +              tmp.y = y;
 +
 +              circle.push_back(tmp);
 +      }
++      
 +      return;
 +}
 +
- void Shape_detect::hough_transform_arc(int begin, int end, std::vector<Arc> &arcs, int radius, int scale)
+ void Shape_detect::hough_transform_arc(int begin, int end, std::vector<Arc> &arcs, float radius, float scale)
  {
        if ((end - begin) < 10)
                return;
  
-       int signum_x = (cartes[end].x < 0) ? -1 : 1;
-       int signum_y = (cartes[end].y < 0) ? -1 : 1;
+       float max_x, max_y, min_x, min_y;
+       max_x = cartes[begin].x;
+       min_x = max_x;
  
-       int max_x, max_y, min_x, min_y; // cm
+       max_y = cartes[begin].y;
+       min_y = max_y;
  
-       max_x = 300;
-       min_x = 0;
-       max_y = 210;
-       min_y = 0;
+       for (int i = begin; i <= end; i++) {
+               //std::cout << cartes[i].x << " -- " << cartes[i].y << " || ";
+               if (cartes[i].x > max_x)
+                       max_x = cartes[i].x;
+               else if (cartes[i].x < min_x) 
+                       min_x = cartes[i].x;
 -              
++
+               if (cartes[i].y > max_y)
+                       max_y = cartes[i].y;
+               else if (cartes[i].y < min_y) 
+                       min_y = cartes[i].y;
+       }
 +
-       int distance_x = ceil(max_x / scale);
-       int distance_y = ceil(max_y / scale);
+       const float center_x = (max_x - min_x)/2 + min_x;
+       const float center_y = (max_y - min_y)/2 + min_y;
  
-       int accumulator[distance_y][distance_x];
 -      const int asize = 600/scale;
 -      const int amid = asize/2;
++      const int asize = 600 / scale;
++      const int amid = asize / 2;
+       Shape_detect::Arc arc;
+       //arc.debug = 0;
+       arc.debug = new (struct arc_debug);
+       if (arc.debug) {
+               arc.debug->bitmap = new int[asize*asize];
+               arc.debug->acc_size = asize;
+               arc.debug->acc_origin.x = center_x - amid*scale;
+               arc.debug->acc_origin.y = center_y - amid*scale;
+               arc.debug->acc_scale = scale;
+       }
+       
+       int accumulator[asize][asize];
  
        memset(accumulator, 0, sizeof(accumulator));
  
 -// transformace
 +      std::vector<Shape_detect::Point> circle;
 +
-       bresenham_circle(radius / scale, circle);
++      bresenham_circle(radius, scale, circle);
 +
 +      for (int i = begin; i <= end; i++) {
-               int xc = abs(floor(cartes[i].x / (10 * scale)));
-               int yc = abs(floor(cartes[i].y / (10 * scale)));
++              int xc = floor((cartes[i].x - center_x) / scale);
++              int yc = floor((cartes[i].y - center_y) / scale);
 +
 +              for (unsigned int i = 0; i < circle.size(); i++) {
-                       accumulator[yc + (int) circle[i].x][xc + (int) circle[i].y] += 1;
-                       accumulator[yc - (int) circle[i].x][xc - (int) circle[i].y] += 1;
-                       accumulator[yc - (int) circle[i].x][xc + (int) circle[i].y] += 1;
-                       accumulator[yc + (int) circle[i].x][xc - (int) circle[i].y] += 1;
-                       accumulator[yc + (int) circle[i].y][xc + (int) circle[i].x] += 1;
-                       accumulator[yc - (int) circle[i].y][xc - (int) circle[i].x] += 1;
-                       accumulator[yc - (int) circle[i].y][xc + (int) circle[i].x] += 1;
-                       accumulator[yc + (int) circle[i].y][xc - (int) circle[i].x] += 1;
++                      int par[8];
++
++                      par[0] = amid + yc + (int) circle[i].x;
++                      par[1] = amid + yc - (int) circle[i].x;
++                      par[2] = amid + xc + (int) circle[i].x;
++                      par[3] = amid + xc - (int) circle[i].x;
++                      par[4] = amid + yc + (int) circle[i].y;
++                      par[5] = amid + yc - (int) circle[i].y;
++                      par[6] = amid + xc + (int) circle[i].y;
++                      par[7] = amid + xc - (int) circle[i].y;
++
++                      if (par[0] > 0 && par[0] < asize && par[6] > 0 && par[6] < asize)
++                              accumulator[par[0]][par[6]] += 1;
++
++                      if (par[1] > 0 && par[1] < asize && par[7] > 0 && par[7] < asize)
++                              accumulator[par[1]][par[7]] += 1;
++
++                      if (par[1] > 0 && par[1] < asize && par[6] > 0 && par[6] < asize)
++                              accumulator[par[1]][par[6]] += 1;
++
++                      if (par[0] > 0 && par[0] < asize && par[7] > 0 && par[7] < asize)
++                              accumulator[par[0]][par[7]] += 1;
++
++                      if (par[4] > 0 && par[4] < asize && par[2] > 0 && par[2] < asize)
++                              accumulator[par[4]][par[2]] += 1;
++
++                      if (par[5] > 0 && par[5] < asize && par[3] > 0 && par[3] < asize)
++                              accumulator[par[5]][par[3]] += 1;
++
++                      if (par[5] > 0 && par[5] < asize && par[2] > 0 && par[2] < asize)
++                              accumulator[par[5]][par[2]] += 1;
++
++                      if (par[4] > 0 && par[4] < asize && par[3] > 0 && par[3] < asize)
++                              accumulator[par[4]][par[3]] += 1;
 +              }
 +      }
 +
-       Shape_detect::Arc arc;
++/*
+       int a, b;
+       double phi;
+       double step = (2 * M_PI) / 180;
+       for (int i = begin; i <= end; i++) {
+               int x_k = floor((cartes[i].x - center_x) / scale);
+               int y_k = floor((cartes[i].y - center_y) / scale);
+               int last_a = 0, last_b = 0;
+               for (phi = 0.0; phi < 2 * M_PI; phi += step) {
+                       a = amid + x_k - (radius / scale) * cos(phi) ;
+                       b = amid + y_k - (radius / scale) * sin(phi);
+                       if (a > 0 && a < asize && b > 0 && b < asize && (a != last_a || b != last_b))
+                               accumulator[b][a] += 1;
+                       last_a = a;
+                       last_b = b;
+               }
+       }
 -
++*/
        Shape_detect::Point center;
  
-       arc.radius = radius * 10; //radius v arc [mm]!!!
+       arc.radius = radius; //radius [mm]
  
-       int max = 1;
+       int max = 0;
  
-       for (int i = 0; i < distance_y; i++) {
-               for (int j = 0; j < distance_x; j++) {
+       for (int i = 0; i < asize; i++) {
+               for (int j = 0; j < asize; j++) {
                        if (accumulator[i][j] > max) {
  
                                max = accumulator[i][j];
                arcs.push_back(arc);
        }
  
--// tisk
 -/*
 -      std::cout << "Tisk" << std::flush <<  std::endl;
--
--      for (int i = 0; i < distance_y; i++) {
--              for (int j = 0; j < distance_x; j++) {
-                       std::cout << accumulator[i][j] << " ";
 -                      std::cout << accumulator[i][j];
--              }
--              std::cout << std::endl;
--      }
 -*/
        return;
  }
  
@@@ -451,7 -444,7 +516,9 @@@ void Shape_detect::arc_detect(std::vect
                end --;
  
                //fit_arc(start, end, arcs);
-               hough_transform_arc(start, end, arcs, 10, 2);
++
+               hough_transform_arc(start, end, arcs, 100.0, 10); // radius [mm], scale[mm]
++
                start = end + 1;
        }
  }
index 78f5f7645e7eb3db2f4b77d8d8443adf942ab38e,2ca2276abab0d9bb71074c22f83002f950b9d864..7045486ad8e2e43cf8c757e71255e9424763939b
@@@ -256,10 -264,7 +264,10 @@@ class Shape_detec
  
                bool fit_arc(int begin, int end, std::vector<Arc> &arcs);
  
-               void bresenham_circle(int scale_radius, std::vector<Point> &circle);
++              void bresenham_circle(const float &radius,const float &scale, std::vector<Point> &circle);
 +
-               // radius [cm], scale [cm]
-               void hough_transform_arc(int begin, int end, std::vector<Arc> &arcs, int radius, int scale);
++              // radius [mm], scale [mm]
+               void hough_transform_arc(int begin, int end, std::vector<Arc> &arcs, float radius, float scale);
  };
  
  #endif // SHAPE_DETECT