summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralejandro-colomar <colomar.6.4.3@gmail.com>2019-07-31 20:06:27 +0200
committeralejandro-colomar <colomar.6.4.3@gmail.com>2019-07-31 20:06:27 +0200
commit4f1ae8626a01c49357e7f4339e71400757d177e5 (patch)
tree52a63dedf67388c482a0d3f5555ed2d1ed12d5de
parent83d86e6ad0c3d1b7aef84df69d8e65fa2d3bfe9a (diff)
Optimize: faster calibration
m---------libalx0
-rw-r--r--src/coins.c42
2 files changed, 18 insertions, 24 deletions
diff --git a/libalx b/libalx
-Subproject 1286da18cfc0cefbebd8bae7fe652f46f9227af
+Subproject 793f2b688d65b1fbe5c5e699c564dd9d1b686e6
diff --git a/src/coins.c b/src/coins.c
index 85b6929..b0f8932 100644
--- a/src/coins.c
+++ b/src/coins.c
@@ -78,9 +78,7 @@ static int coins_positions (img_s *restrict img, ptrdiff_t nmemb,
ptrdiff_t *ncoins);
static int coins_diameters_pix (const img_s *restrict img, ptrdiff_t n,
struct Coins coins[static restrict n]);
-static double calibrate_mm_per_pix (ptrdiff_t n,
- const struct Coins
- coins[static restrict n]);
+static double calibrate_mm_per_pix (float max_radius_pix);
static void coins_diameters_mm (double mm_per_pix, ptrdiff_t n,
struct Coins coins[static restrict n]);
static int coins_values (ptrdiff_t n,
@@ -123,6 +121,7 @@ static int proc_coins_steps (const char *restrict fname)
{
img_s *img;
img_s *img_dt;
+ float max_r_pix;
struct Coins coins[BUFSIZ];
ptrdiff_t ncoins;
int status;
@@ -145,26 +144,32 @@ static int proc_coins_steps (const char *restrict fname)
goto out_deinit_dt;
if (alx_cv_threshold(img, CV_THRESH_BINARY_INV, ALX_CV_THR_OTSU))
goto out_deinit_dt;
-//alx_cv_invert(img);
- alx_cv_imwrite(img, "/home/alex/Downloads/coins_thr.png");
+// alx_cv_invert(img); /* Only if the source image is inverted */
+// alx_cv_imwrite(img, "/home/alex/Downloads/coins_thr.png");
if (alx_cv_distance_transform(img))
goto out_deinit_dt;
+ if (alx_cv_maximum_flt(img, &max_r_pix))
+ goto out_deinit_dt;
+ /* Calibrate with the biggest coin; every img should have a 2 € coin */
+ /* TODO: Fix this: should calibrate with a pattern, or else */
+ mm_per_pix = calibrate_mm_per_pix(max_r_pix);
alx_cv_clone(img_dt, img);
- alx_cv_imwrite(img_dt, "/home/alex/Downloads/coins_img_dt.png");
+// alx_cv_imwrite(img_dt, "/home/alex/Downloads/coins_img_dt.png");
+ if (alx_cv_threshold(img, CV_THRESH_TOZERO,
+ (COIN_DIAMETER_1c / 2.0 - 0.5) / mm_per_pix))
+ goto out_deinit_dt;
+// alx_cv_imwrite(img, "/home/alex/Downloads/coins_img_dt_thr.png");
if (alx_cv_local_max(img))
goto out_deinit_dt;
if (alx_cv_dilate(img, 2))
goto out_deinit_dt;
- alx_cv_imwrite(img, "/home/alex/Downloads/coins_locmax.png");
+// alx_cv_imwrite(img, "/home/alex/Downloads/coins_locmax.png");
if (coins_positions(img, ARRAY_SIZE(coins), coins, &ncoins))
goto out_deinit_dt;
- alx_cv_imwrite(img, "/home/alex/Downloads/coins_contours.png");
+// alx_cv_imwrite(img, "/home/alex/Downloads/coins_contours.png");
if (coins_diameters_pix(img_dt, ncoins, coins))
goto out_deinit_dt;
- /* Calibrate with the biggest coin; every img should have a 2 € coin */
- /* TODO: Fix this: should calibrate with a pattern */
- mm_per_pix = calibrate_mm_per_pix(ncoins, coins);
/* Get coins diameters in mm */
coins_diameters_mm(mm_per_pix, ncoins, coins);
/* Get coins values (by their sizes) */
@@ -242,21 +247,10 @@ static int coins_diameters_pix (const img_s *restrict img, ptrdiff_t n,
return 0;
}
-static double calibrate_mm_per_pix (ptrdiff_t n,
- const struct Coins
- coins[static restrict n])
+static double calibrate_mm_per_pix (float max_radius_pix)
{
- uint16_t coins_size_pix[n];
- ptrdiff_t max_pos;
- uint16_t max_size;
-
- for (ptrdiff_t i = 0; i < n; i++)
- coins_size_pix[i] = coins[i].diameter_pix;
-
- max_pos = alx_maximum_u16(ARRAY_SIZE(coins_size_pix), coins_size_pix);
- max_size = coins_size_pix[max_pos];
- return 25.75 / max_size;
+ return 25.75 / (max_radius_pix * 2.0);
}
static void coins_diameters_mm (double mm_per_pix, ptrdiff_t n,