summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralejandro-colomar <colomar.6.4.3@gmail.com>2019-08-01 23:25:45 +0200
committeralejandro-colomar <colomar.6.4.3@gmail.com>2019-08-01 23:25:45 +0200
commit928e97bb2784301cdaef82d239472fb83ee9ca70 (patch)
tree64e0f7fdc0212cd68c7767ba6d094b7893fc1168
parent1bf706a165f91109e23b06b84e44331c1c9b4716 (diff)
Move init & deinit to static functions
-rw-r--r--.gitignore2
-rw-r--r--Makefile2
-rw-r--r--src/coins.c168
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++) {