From 928e97bb2784301cdaef82d239472fb83ee9ca70 Mon Sep 17 00:00:00 2001 From: alejandro-colomar Date: Thu, 1 Aug 2019 23:25:45 +0200 Subject: Move init & deinit to static functions --- .gitignore | 2 +- Makefile | 2 +- src/coins.c | 168 +++++++++++++++++++++++++++++++++++++----------------------- 3 files changed, 105 insertions(+), 67 deletions(-) diff --git a/.gitignore b/.gitignore index 5ccb995..a1a0901 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ *.o *.s *.a -bin/coins* +bin/cv-* diff --git a/Makefile b/Makefile index 79d7803..cc508b9 100644 --- a/Makefile +++ b/Makefile @@ -198,7 +198,7 @@ export LIBS ################################################################################ # executables -BIN_NAME = coins +BIN_NAME = cv-coins export BIN_NAME diff --git a/src/coins.c b/src/coins.c index 071bc59..f4ffae7 100644 --- a/src/coins.c +++ b/src/coins.c @@ -70,26 +70,36 @@ struct Coins { /****************************************************************************** ******* static functions (prototypes) **************************************** ******************************************************************************/ -static int proc_coins_steps (const char *restrict fname); -static int coins_positions (img_s *restrict img, ptrdiff_t nmemb, - struct Coins - coins[static restrict 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 (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, - struct Coins coins[static restrict n]); -static double coin_value (double diameter_mm); -static double coins_total_value (ptrdiff_t n, - const struct Coins - coins[static restrict n]); -static void report (ptrdiff_t n, - const struct Coins - coins[static restrict n], - double tot); +static +int init_cv (img_s **img_1, img_s **img_2); +static +void deinit_cv (img_s *img_1, img_s *img_2); +static +int proc_coins_steps (const char *restrict fname); +static +int coins_positions (img_s *restrict img, ptrdiff_t nmemb, + struct Coins coins[static restrict 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 (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, + struct Coins coins[static restrict n]); +static +double coin_value (double diameter_mm); +static +double coins_total_value (ptrdiff_t n, + const struct Coins coins[static restrict n]); +static +void report (ptrdiff_t n, + const struct Coins coins[static restrict n], + double tot); /****************************************************************************** @@ -116,7 +126,41 @@ int proc_coins (const char *restrict fname) /****************************************************************************** ******* static functions (definitions) *************************************** ******************************************************************************/ -static int proc_coins_steps (const char *restrict fname) +static +int init_cv (img_s **img_1, img_s **img_2) +{ + + if (alx_cv_alloc_img(img_1)) + return -1; + if (alx_cv_init_img(*img_1, 1, 1)) + goto out_free_1; + if (alx_cv_alloc_img(img_2)) + goto out_deinit_1; + if (alx_cv_init_img(*img_2, 1, 1)) + goto out_free_2; + return 0; + +out_free_2: + alx_cv_free_img(img_2); +out_deinit_1: + alx_cv_deinit_img(img_1); +out_free_1: + alx_cv_free_img(img_1); + return -1; +} + +static +void deinit_cv (img_s *img_1, img_s *img_2) +{ + + alx_cv_deinit_img(img_2); + alx_cv_free_img(img_2); + alx_cv_deinit_img(img_1); + alx_cv_free_img(img_1); +} + +static +int proc_coins_steps (const char *restrict fname) { img_s *img; img_s *img_dt; @@ -128,27 +172,21 @@ static int proc_coins_steps (const char *restrict fname) double value_total; status = -1; - if (alx_cv_alloc_img(&img)) + if (init_cv(&img, &img_dt)) return -1; - if (alx_cv_init_img(img, 1, 1)) - goto out_free_img; if (alx_cv_imread(img, fname)) - goto out_deinit_img; - if (alx_cv_alloc_img(&img_dt)) - goto out_deinit_img; - if (alx_cv_init_img(img_dt, 1, 1)) - goto out_free_dt; + goto err; if (alx_cv_component(img, ALX_CV_CMP_BLUE)) - goto out_deinit_dt; + goto err; if (alx_cv_threshold(img, CV_THRESH_BINARY_INV, ALX_CV_THR_OTSU)) - goto out_deinit_dt; + goto err; // 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; + goto err; if (alx_cv_maximum_flt(img, &max_r_pix)) - goto out_deinit_dt; + goto err; /* 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); @@ -156,45 +194,40 @@ static int proc_coins_steps (const char *restrict fname) // 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; + goto err; // alx_cv_imwrite(img, "/home/alex/Downloads/coins_img_dt_thr.png"); if (alx_cv_local_max(img)) - goto out_deinit_dt; + goto err; if (alx_cv_dilate(img, 2)) - goto out_deinit_dt; + goto err; // alx_cv_imwrite(img, "/home/alex/Downloads/coins_locmax.png"); if (coins_positions(img, ARRAY_SIZE(coins), coins, &ncoins)) - goto out_deinit_dt; + goto err; // alx_cv_imwrite(img, "/home/alex/Downloads/coins_contours.png"); if (coins_diameters_pix(img_dt, ncoins, coins)) - goto out_deinit_dt; + goto err; /* Get coins diameters in mm */ coins_diameters_mm(mm_per_pix, ncoins, coins); /* Get coins values (by their sizes) */ printf("mm/pix = %lf\n", mm_per_pix); if (coins_values(ncoins, coins)) - goto out_deinit_dt; + goto err; /* Add total value */ value_total = coins_total_value(ncoins, coins); report(ncoins, coins, value_total); status = 0; -out_deinit_dt: - alx_cv_deinit_img(img_dt); -out_free_dt: - alx_cv_free_img(img_dt); -out_deinit_img: - alx_cv_deinit_img(img); -out_free_img: - alx_cv_free_img(img); +err: + deinit_cv(img, img_dt); return status; } -static int coins_positions (img_s *restrict img, ptrdiff_t nmemb, - struct Coins coins[static restrict nmemb], - ptrdiff_t *ncoins) +static +int coins_positions (img_s *restrict img, ptrdiff_t nmemb, + struct Coins coins[static restrict nmemb], + ptrdiff_t *ncoins) { conts_s *conts; rect_s *rect; @@ -233,8 +266,9 @@ out_deinit_conts: return status; } -static int coins_diameters_pix (const img_s *restrict img, ptrdiff_t n, - struct Coins coins[static restrict n]) +static +int coins_diameters_pix (const img_s *restrict img, ptrdiff_t n, + struct Coins coins[static restrict n]) { float tmp; @@ -246,22 +280,25 @@ static int coins_diameters_pix (const img_s *restrict img, ptrdiff_t n, return 0; } -static double calibrate_mm_per_pix (float max_radius_pix) +static +double calibrate_mm_per_pix (float max_radius_pix) { return 25.75 / (max_radius_pix * 2.0); } -static void coins_diameters_mm (double mm_per_pix, ptrdiff_t n, - struct Coins coins[static restrict n]) +static +void coins_diameters_mm (double mm_per_pix, ptrdiff_t n, + struct Coins coins[static restrict n]) { for (ptrdiff_t i = 0; i < n; i++) coins[i].diameter_mm = mm_per_pix * coins[i].diameter_pix; } -static int coins_values (ptrdiff_t n, - struct Coins coins[static restrict n]) +static +int coins_values (ptrdiff_t n, + struct Coins coins[static restrict n]) { for (ptrdiff_t i = 0; i < n; i++) { @@ -273,7 +310,8 @@ static int coins_values (ptrdiff_t n, return 0; } -static double coin_value (double diameter_mm) +static +double coin_value (double diameter_mm) { if (diameter_mm > (COIN_DIAMETER_2E + 1.5)) @@ -297,9 +335,9 @@ static double coin_value (double diameter_mm) return -1; } -static double coins_total_value (ptrdiff_t n, - const struct Coins - coins[static restrict n]) +static +double coins_total_value (ptrdiff_t n, + const struct Coins coins[static restrict n]) { double tot; @@ -310,10 +348,10 @@ static double coins_total_value (ptrdiff_t n, return tot; } -static void report (ptrdiff_t n, - const struct Coins - coins[static restrict n], - double tot) +static +void report (ptrdiff_t n, + const struct Coins coins[static restrict n], + double tot) { for (ptrdiff_t i = 0; i < n; i++) { -- cgit v1.2.3