summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlejandroColomar <colomar.6.4.3@gmail.com>2018-11-07 22:51:11 +0100
committerAlejandroColomar <colomar.6.4.3@gmail.com>2018-11-07 22:51:11 +0100
commitb9b2f2999c0ba51cbd8cd765edfea6bb5fb147e2 (patch)
treeb2b634f9341ff13e6a436b449acd555da82a3ad9
parent6a322a3e5ffa6614e856cc9edd941344c2c5bd78 (diff)
Add Hough circles
-rw-r--r--modules/image/inc/img_cv.hpp3
-rw-r--r--modules/image/inc/img_iface.h1
-rw-r--r--modules/image/inc/img_iface.hpp10
-rw-r--r--modules/image/src/img_cv.cpp69
-rw-r--r--modules/image/src/img_iface.cpp72
-rw-r--r--modules/user/inc/user_iface.h1
-rw-r--r--modules/user/inc/user_iface.hpp1
-rw-r--r--modules/user/src/user_clui.c18
-rw-r--r--modules/user/src/user_tui.c20
9 files changed, 180 insertions, 15 deletions
diff --git a/modules/image/inc/img_cv.hpp b/modules/image/inc/img_cv.hpp
index c381612..38e2fb1 100644
--- a/modules/image/inc/img_cv.hpp
+++ b/modules/image/inc/img_cv.hpp
@@ -46,7 +46,8 @@
IMG_CV_ACT_CONTOURS_SIZE,
IMG_CV_ACT_BOUNDING_RECT,
IMG_CV_ACT_FIT_ELLIPSE,
- IMG_CV_ACT_MIN_AREA_RECT
+ IMG_CV_ACT_MIN_AREA_RECT,
+ IMG_CV_ACT_HOUGH_CIRCLES
};
diff --git a/modules/image/inc/img_iface.h b/modules/image/inc/img_iface.h
index c2421e5..a91c054 100644
--- a/modules/image/inc/img_iface.h
+++ b/modules/image/inc/img_iface.h
@@ -59,6 +59,7 @@
IMG_IFACE_ACT_BOUNDING_RECT,
IMG_IFACE_ACT_FIT_ELLIPSE,
IMG_IFACE_ACT_MIN_AREA_RECT,
+ IMG_IFACE_ACT_HOUGH_CIRCLES,
IMG_IFACE_ACT_ZB = 0x0200,
IMG_IFACE_ACT_DECODE,
diff --git a/modules/image/inc/img_iface.hpp b/modules/image/inc/img_iface.hpp
index 5f6cfa3..41c7be3 100644
--- a/modules/image/inc/img_iface.hpp
+++ b/modules/image/inc/img_iface.hpp
@@ -65,6 +65,7 @@
IMG_IFACE_ACT_BOUNDING_RECT,
IMG_IFACE_ACT_FIT_ELLIPSE,
IMG_IFACE_ACT_MIN_AREA_RECT,
+ IMG_IFACE_ACT_HOUGH_CIRCLES,
IMG_IFACE_ACT_ZB = 0x0200,
IMG_IFACE_ACT_DECODE,
@@ -205,6 +206,15 @@
bool show;
};
+ struct Img_Iface_Data_Hough_Circles {
+ std::vector <class cv::Vec <float, 3>> *circles;
+ double dist_min;
+ double param_1;
+ double param_2;
+ int radius_min;
+ int radius_max;
+ };
+
/* img_zbar -------------------------------------------------------------------*/
struct Img_Iface_Data_Decode {
enum zbar::zbar_symbol_type_e code_type;
diff --git a/modules/image/src/img_cv.cpp b/modules/image/src/img_cv.cpp
index db425e6..a82197a 100644
--- a/modules/image/src/img_cv.cpp
+++ b/modules/image/src/img_cv.cpp
@@ -65,6 +65,8 @@ static void img_cv_contours_size (void *data);
static void img_cv_bounding_rect (class cv::Mat *imgptr, void *data);
static void img_cv_fit_ellipse (class cv::Mat *imgptr, void *data);
static void img_cv_min_area_rect (class cv::Mat *imgptr, void *data);
+ /* Feature detection */
+static void img_cv_hough_circles (class cv::Mat *imgptr, void *data);
/******************************************************************************
@@ -149,6 +151,10 @@ void img_cv_act (class cv::Mat *imgptr, int action, void *data)
case IMG_CV_ACT_MIN_AREA_RECT:
img_cv_min_area_rect(imgptr, data);
break;
+
+ case IMG_CV_ACT_HOUGH_CIRCLES:
+ img_cv_hough_circles(imgptr, data);
+ break;
}
}
@@ -156,6 +162,8 @@ void img_cv_act (class cv::Mat *imgptr, int action, void *data)
/******************************************************************************
******* static functions *****************************************************
******************************************************************************/
+/* Core: The core functionality */
+/* ----- Pixel */
static void img_cv_pixel_value (class cv::Mat *imgptr, void *data)
{
/* Data */
@@ -175,6 +183,7 @@ static void img_cv_pixel_value (class cv::Mat *imgptr, void *data)
*val = imgptr->at<unsigned char>(y, x);
}
+/* ----- ROI */
static void img_cv_set_ROI (class cv::Mat *imgptr, void *data)
{
/* Data */
@@ -189,6 +198,7 @@ static void img_cv_set_ROI (class cv::Mat *imgptr, void *data)
*imgptr = (*imgptr)(*rect);
}
+/* ----- Operations on arrays */
static void img_cv_and_2ref (class cv::Mat *imgptr, void *data)
{
class cv::Mat *img_ref;
@@ -235,6 +245,8 @@ static void img_cv_component (class cv::Mat *imgptr, void *data)
cmp_img[2].release();
}
+/* Imgproc: Image processing */
+/* ----- Image filtering */
static void img_cv_dilate (class cv::Mat *imgptr, void *data)
{
/* Data */
@@ -319,6 +331,7 @@ static void img_cv_sobel (class cv::Mat *imgptr, void *data)
cv::BORDER_DEFAULT);
}
+/* ----- Geometric image transformations */
static void img_cv_rotate_orto (class cv::Mat *imgptr, void *data)
{
/* Data */
@@ -378,6 +391,7 @@ static void img_cv_rotate (class cv::Mat *imgptr, void *data)
map_matrix.release();
}
+/* ----- Miscellaneous image transformations */
static void img_cv_adaptive_thr (class cv::Mat *imgptr, void *data)
{
/* Data */
@@ -449,6 +463,7 @@ static void img_cv_threshold (class cv::Mat *imgptr, void *data)
cv::threshold(*imgptr, *imgptr, thr_val, 0xFF, thr_typ);
}
+/* ----- Histograms */
static void img_cv_histogram (class cv::Mat *imgptr, void *data)
{
/* Data */
@@ -561,6 +576,7 @@ static void img_cv_histogram_c3 (class cv::Mat *imgptr, void *data)
cmp_img[2].release();
}
+/* ----- Structural analysis and shape descriptors */
static void img_cv_contours (class cv::Mat *imgptr, void *data)
{
/* Data */
@@ -577,8 +593,11 @@ static void img_cv_contours (class cv::Mat *imgptr, void *data)
cv::findContours(*imgptr, *contours, *hierarchy, CV_RETR_EXTERNAL,
CV_CHAIN_APPROX_SIMPLE);
+ /* Set image to black */
+ imgptr->setTo(cv::Scalar(0));
+
/* Draw contours in color */
- cv::drawContours(*imgptr, *contours, -1, cv::Scalar(255, 0, 0), 1, 8,
+ cv::drawContours(*imgptr, *contours, -1, cv::Scalar(255), 1, 8,
*hierarchy, 1, cvPoint(0, 0));
}
@@ -723,6 +742,54 @@ static void img_cv_min_area_rect (class cv::Mat *imgptr, void *data)
}
}
+/* ----- Feature detection */
+static void img_cv_hough_circles (class cv::Mat *imgptr, void *data)
+{
+ /* Data */
+ struct Img_Iface_Data_Hough_Circles *data_cast;
+ data_cast = (struct Img_Iface_Data_Hough_Circles *)data;
+
+ /* Contours */
+ std::vector <class cv::Vec <float, 3>> *circles;
+ circles = data_cast->circles;
+ /* Parameters */
+ double dist_min;
+ double param_1;
+ double param_2;
+ int radius_min;
+ int radius_max;
+ dist_min = data_cast->dist_min;
+ param_1 = data_cast->param_1;
+ param_2 = data_cast->param_2;
+ radius_min = data_cast->radius_min;
+ radius_max = data_cast->radius_max;
+
+ /* Get circles */
+ cv::HoughCircles(*imgptr, *circles, CV_HOUGH_GRADIENT, 1, dist_min,
+ param_1, param_2, radius_min, radius_max);
+
+ /* Set image to black */
+ imgptr->setTo(cv::Scalar(0));
+
+ /* Draw circles */
+ class cv::Point_ <int> center;
+ int radius;
+ int i;
+ for (i = 0; i < circles->size(); i++) {
+ center.x = cvRound((*circles)[i][0]);
+ center.y = cvRound((*circles)[i][1]);
+ radius = cvRound((*circles)[i][2]);
+
+ /* Draw the circle center */
+/* cv::circle(*imgptr, center, 3,
+ cv::Scalar(0, 255, 0), -1, 8, 0);*/
+
+ /* Draw the circle outline */
+ cv::circle(*imgptr, center, radius,
+ cv::Scalar(250), 1, 8, 0);
+ }
+}
+
/******************************************************************************
******* end of file **********************************************************
diff --git a/modules/image/src/img_iface.cpp b/modules/image/src/img_iface.cpp
index 3876619..2cc152b 100644
--- a/modules/image/src/img_iface.cpp
+++ b/modules/image/src/img_iface.cpp
@@ -70,6 +70,7 @@ static double perimeter [CONTOURS_MAX];
static class cv::Mat hierarchy;
static class cv::Rect_ <int> rectangle;
static class cv::RotatedRect rectangle_rot;
+static std::vector <class cv::Vec <float, 3>> circles;
/******************************************************************************
@@ -113,6 +114,8 @@ static void img_iface_contours_size (void *data);
static void img_iface_bounding_rect (void *data);
static void img_iface_fit_ellipse (void *data);
static void img_iface_min_area_rect (void *data);
+ /* Feature detection */
+static void img_iface_hough_circles (void *data);
/* img_zbar */
static void img_iface_decode (void *data);
@@ -296,7 +299,15 @@ void img_iface_act (int action, void *data)
case IMG_IFACE_ACT_MIN_AREA_RECT:
img_iface_min_area_rect(data);
break;
+ /* Feature detection */
+ case IMG_IFACE_ACT_HOUGH_CIRCLES:
+ img_iface_hough_circles(data);
+ break;
+ /* img_orb */
+ case IMG_IFACE_ACT_ALIGN:
+ img_iface_align();
+ break;
/* img_zbar */
case IMG_IFACE_ACT_DECODE:
@@ -308,11 +319,6 @@ void img_iface_act (int action, void *data)
img_iface_read(data);
break;
- /* img_orb */
- case IMG_IFACE_ACT_ALIGN:
- img_iface_align();
- break;
-
/* img_iface */
case IMG_IFACE_ACT_APPLY:
img_iface_apply();
@@ -773,7 +779,7 @@ static void img_iface_sobel (void *data)
img_cv_act(&image_copy_tmp, IMG_CV_ACT_SOBEL, data);
}
-/* ----- Geometric image transformations */
+/* ----- ------- Geometric image transformations */
static void img_iface_rotate_orto (void *data)
{
/* Data */
@@ -1074,7 +1080,7 @@ static void img_iface_histogram_c3 (void *data)
img_cv_act(&image_copy_tmp, IMG_CV_ACT_HISTOGRAM_C3, data);
}
-/* ----- Structural analysis and shape descriptors */
+/* ----- ------- Structural analysis and shape descriptors */
static void img_iface_contours (void *data)
{
/* Must have 1 channel */
@@ -1240,6 +1246,58 @@ static void img_iface_min_area_rect (void *data)
img_cv_act(&image_copy_tmp, IMG_CV_ACT_MIN_AREA_RECT, data);
}
+/* ----- ------- Feature detection */
+static void img_iface_hough_circles (void *data)
+{
+ /* Must have 1 channel */
+ if (image_copy_tmp.channels() != 1) {
+ /* Write into log */
+ snprintf(user_iface_log.line[user_iface_log.len], LOG_LINE_LEN,
+ "! Invalid input");
+ user_iface_log.lvl[user_iface_log.len] = 1;
+ (user_iface_log.len)++;
+
+ return;
+ }
+
+ /* Data */
+ struct Img_Iface_Data_Hough_Circles data_tmp;
+ if (!data) {
+ data_tmp.circles = &circles;
+
+ /* Ask user */
+ char title [80];
+ snprintf(title, 80, "Minimum distance:");
+ data_tmp.dist_min = user_iface_getdbl(0, 5, INFINITY, title, NULL);
+
+ snprintf(title, 80, "param 1:");
+ data_tmp.param_1 = user_iface_getdbl(0, 200, INFINITY, title, NULL);
+
+ snprintf(title, 80, "param 2:");
+ data_tmp.param_2 = user_iface_getdbl(0, 100, INFINITY, title, NULL);
+
+ snprintf(title, 80, "Minimum radius");
+ data_tmp.radius_min = user_iface_getint(0, 10, INFINITY, title, NULL);
+
+ snprintf(title, 80, "Maximum radius");
+ data_tmp.radius_max = user_iface_getint(0, 0, INFINITY, title, NULL);
+
+ data = (void *)&data_tmp;
+ }
+
+ /* Circles */
+ img_cv_act(&image_copy_tmp, IMG_CV_ACT_HOUGH_CIRCLES, data);
+
+ /* Write into log */
+ struct Img_Iface_Data_Hough_Circles *data_cast;
+ data_cast = (struct Img_Iface_Data_Hough_Circles *)data;
+ snprintf(user_iface_log.line[user_iface_log.len], LOG_LINE_LEN,
+ "Circles n=%i",
+ (int)data_cast->circles->size());
+ user_iface_log.lvl[user_iface_log.len] = 1;
+ (user_iface_log.len)++;
+}
+
/* img_zbar ------------------------------------------------------------------*/
static void img_iface_decode (void *data)
{
diff --git a/modules/user/inc/user_iface.h b/modules/user/inc/user_iface.h
index 098a7a0..257b6d1 100644
--- a/modules/user/inc/user_iface.h
+++ b/modules/user/inc/user_iface.h
@@ -65,6 +65,7 @@
USER_IFACE_ACT_BOUNDING_RECT,
USER_IFACE_ACT_FIT_ELLIPSE,
USER_IFACE_ACT_MIN_AREA_RECT,
+ USER_IFACE_ACT_HOUGH_CIRCLES,
USER_IFACE_ACT_ZB = 0x0200,
USER_IFACE_ACT_DECODE,
diff --git a/modules/user/inc/user_iface.hpp b/modules/user/inc/user_iface.hpp
index 3a2c034..2808237 100644
--- a/modules/user/inc/user_iface.hpp
+++ b/modules/user/inc/user_iface.hpp
@@ -65,6 +65,7 @@
USER_IFACE_ACT_BOUNDING_RECT,
USER_IFACE_ACT_FIT_ELLIPSE,
USER_IFACE_ACT_MIN_AREA_RECT,
+ USER_IFACE_ACT_HOUGH_CIRCLES,
USER_IFACE_ACT_ZB = 0x0200,
USER_IFACE_ACT_DECODE,
diff --git a/modules/user/src/user_clui.c b/modules/user/src/user_clui.c
index a4fa8ed..54885c6 100644
--- a/modules/user/src/user_clui.c
+++ b/modules/user/src/user_clui.c
@@ -324,6 +324,17 @@ static int usr_input (void)
break;
}
break;
+ case '5':
+ /* Feature detection */
+ switch (ch[4]) {
+ case '0':
+ action = USER_IFACE_ACT_HOUGH_CIRCLES;
+ break;
+ default:
+ action = USER_IFACE_ACT_FOO;
+ break;
+ }
+ break;
default:
action = USER_IFACE_ACT_FOO;
break;
@@ -456,9 +467,9 @@ static void show_help (void)
printf(" - Rotate: %s\n", "f1111");
printf(" - Rotate 2rect_rot: %s\n", "f1112");
printf(" - Adaptive threshold: %s\n", "f1120");
- printf(" - Threshold: %s\n", "f1121");
- printf(" - Cvt color: %s\n", "f1122");
- printf(" - Distance transform: %s\n", "f1123");
+ printf(" - Cvt color: %s\n", "f1121");
+ printf(" - Distance transform: %s\n", "f1122");
+ printf(" - Threshold: %s\n", "f1123");
printf(" - Histogram: %s\n", "f1130");
printf(" - Histogram (3 chan): %s\n", "f1131");
printf(" - Contours: %s\n", "f1140");
@@ -466,6 +477,7 @@ static void show_help (void)
printf(" - Bounding rectangle: %s\n", "f1142");
printf(" - Fit ellipse: %s\n", "f1143");
printf(" - Min. area rectangle: %s\n", "f1144");
+ printf(" - Hough circles: %s\n", "f1150");
printf(" - Align 2ref (ORB): %s\n", "f20");
printf(" - Scan codes (ZBAR): %s\n", "f30");
printf(" - Scan text (OCR): %s\n", "f40");
diff --git a/modules/user/src/user_tui.c b/modules/user/src/user_tui.c
index 696a1de..4545b9f 100644
--- a/modules/user/src/user_tui.c
+++ b/modules/user/src/user_tui.c
@@ -435,6 +435,19 @@ static int usr_input (void)
break;
}
break;
+ case '5':
+ /* Feature detection */
+ ch = wgetch(win_log);
+
+ switch (ch) {
+ case '0':
+ action = USER_IFACE_ACT_HOUGH_CIRCLES;
+ break;
+ default:
+ action = USER_IFACE_ACT_FOO;
+ break;
+ }
+ break;
default:
action = USER_IFACE_ACT_FOO;
break;
@@ -588,9 +601,9 @@ static void show_help (void)
mvwprintw(win_help, r++, c, " - Rotate: %s", "f1111");
mvwprintw(win_help, r++, c, " - Rotate 2rect_rot: %s", "f1112");
mvwprintw(win_help, r++, c, " - Adaptive threshold: %s", "f1120");
- mvwprintw(win_help, r++, c, " - Threshold: %s", "f1121");
- mvwprintw(win_help, r++, c, " - Cvt color: %s", "f1122");
- mvwprintw(win_help, r++, c, " - Distance transform: %s", "f1123");
+ mvwprintw(win_help, r++, c, " - Cvt color: %s", "f1121");
+ mvwprintw(win_help, r++, c, " - Distance transform: %s", "f1122");
+ mvwprintw(win_help, r++, c, " - Threshold: %s", "f1123");
mvwprintw(win_help, r++, c, " - Histogram: %s", "f1130");
mvwprintw(win_help, r++, c, " - Histogram (3 chan): %s", "f1131");
mvwprintw(win_help, r++, c, " - Contours: %s", "f1140");
@@ -598,6 +611,7 @@ static void show_help (void)
mvwprintw(win_help, r++, c, " - Bounding rectangle: %s", "f1142");
mvwprintw(win_help, r++, c, " - Fit ellipse: %s", "f1143");
mvwprintw(win_help, r++, c, " - Min. area rectangle: %s", "f1144");
+ mvwprintw(win_help, r++, c, " - Hough circles: %s", "f1150");
mvwprintw(win_help, r++, c, " - Align 2ref (ORB): %s", "f20");
mvwprintw(win_help, r++, c, " - Scan codes (ZBAR): %s", "f30");
mvwprintw(win_help, r++, c, " - Scan text (OCR): %s", "f40");