From 4f1ae8626a01c49357e7f4339e71400757d177e5 Mon Sep 17 00:00:00 2001 From: alejandro-colomar Date: Wed, 31 Jul 2019 20:06:27 +0200 Subject: Optimize: faster calibration --- libalx | 2 +- src/coins.c | 42 ++++++++++++++++++------------------------ 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/libalx b/libalx index 1286da1..793f2b6 160000 --- a/libalx +++ b/libalx @@ -1 +1 @@ -Subproject commit 1286da18cfc0cefbebd8bae7fe652f46f9227af2 +Subproject commit 793f2b688d65b1fbe5c5e699c564dd9d1b686e6d 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, -- cgit v1.2.3