return 0;
}
+void Shape_detect::hough_transform_arc(int begin, int end, std::vector<Arc> &arcs, float radius, int 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 = 200.0;
+ min_x = 0.0;
+ max_y = 200.0;
+ min_y = 0.0;
+
+/*
+ max_x = cartes[begin].x;
+ min_x = max_x;
+
+ max_y = cartes[begin].y;
+ min_y = max_y;
+
+ 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++ - min_x--);
+ int distance_y = ceil(max_y++ - min_y--);
+*/
+ int distance_x = ceil(max_x / scale);
+ int distance_y = ceil(max_y / scale);
+
+ int accumulator[distance_y][distance_x];
+
+ for (int i = 0; i < distance_y; i++)
+ for (int j = 0; j < distance_x; j++)
+ accumulator[i][j] = 0;
+// transformace
+ int a, b;
+ double phi;
+
+ double step = (2 * M_PI) / 180;
+
+ for (int i = begin; i <= end; i++) {
+ int x_k = abs(floor(cartes[i].x / (10 * scale)));
+ int y_k = abs(floor(cartes[i].y / (10 * scale)));
+
+ for (phi = 0.0; phi < 2 * M_PI; phi += step) {
+ a = x_k - (radius / scale) * cos(phi);
+ b = y_k - (radius / scale) * sin(phi);
+
+ if (a > 0 && a < distance_x && b > 0 && b < distance_y)
+ accumulator[b][a] += 1;
+ }
+ }
+
+ Shape_detect::Arc arc;
+ Shape_detect::Point center;
+
+ arc.radius = radius * 10; //radius [mm]
+
+ int max = 1;
+
+ for (int i = 0; i < distance_y; i++) {
+ for (int j = 0; j < distance_x; j++) {
+ if (accumulator[i][j] > max) {
+
+ max = accumulator[i][j];
+
+ center.x = j * 10 * scale * signum_x;
+ center.y = i * 10 * scale * signum_y;
+ }
+ }
+ }
+
+ if (max > 7 ) {
+ arc.center = center;
+ 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 << std::endl;
+ }
+*/
+ return;
+}
+
int Shape_detect::perpendicular_regression(float &r, const int begin, const int end, General_form &gen)
{
int number_points = abs(end-begin) + 1;
end --;
- fit_arc(start, end, arcs);
+ //fit_arc(start, end, arcs);
+ hough_transform_arc(start, end, arcs, 10.0, 2); // radius [cm], scale[cm]
start = end + 1;
}
}