summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicola Murino <nicola.murino@gmail.com>2014-09-05 08:51:30 +0200
committerSebastian Dröge <sebastian@centricular.com>2014-09-05 10:38:32 +0300
commit3a0a4a8d700b7c719c72e9a7b6bfc6eef72304d7 (patch)
tree450a59c6d114fd0e7771dd1bc60c018cfebdc6f3
parentf1b026c4801ccde3a9200d0d6bc824031a47e4f5 (diff)
facedetect: Add new property min-stddev
face detection will be performed only if image standard deviation is greater that min-stddev. Default min-stddev is 0 for backward compatibility. This property will avoid to perform face detection on images with little changes improving cpu usage and reducing false positives https://bugzilla.gnome.org/show_bug.cgi?id=730510
-rw-r--r--ext/opencv/gstfacedetect.c42
-rw-r--r--ext/opencv/gstfacedetect.h1
2 files changed, 37 insertions, 6 deletions
diff --git a/ext/opencv/gstfacedetect.c b/ext/opencv/gstfacedetect.c
index 0af2efb96..fa01268b5 100644
--- a/ext/opencv/gstfacedetect.c
+++ b/ext/opencv/gstfacedetect.c
@@ -97,6 +97,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_face_detect_debug);
#define DEFAULT_MIN_NEIGHBORS 3
#define DEFAULT_MIN_SIZE_WIDTH 30
#define DEFAULT_MIN_SIZE_HEIGHT 30
+#define DEFAULT_MIN_STDDEV 0
/* Filter signals and args */
enum
@@ -118,7 +119,8 @@ enum
PROP_FLAGS,
PROP_MIN_SIZE_WIDTH,
PROP_MIN_SIZE_HEIGHT,
- PROP_UPDATES
+ PROP_UPDATES,
+ PROP_MIN_STDDEV
};
@@ -306,6 +308,14 @@ gst_face_detect_class_init (GstFaceDetectClass * klass)
"When send update bus messages, if at all",
GST_TYPE_FACE_DETECT_UPDATES, GST_FACEDETECT_UPDATES_EVERY_FRAME,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MIN_STDDEV,
+ g_param_spec_int ("min-stddev", "Minimum image standard deviation",
+ "Minimum image average standard deviation: on images with standard "
+ "deviation lesser than this value facedetection will not be "
+ "performed. Setting this property help to save cpu and reduce "
+ "false positives not performing face detection on images with "
+ "little changes", 0,
+ 255, DEFAULT_MIN_STDDEV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
gst_element_class_set_static_metadata (element_class,
"facedetect",
@@ -336,6 +346,7 @@ gst_face_detect_init (GstFaceDetect * filter)
filter->flags = DEFAULT_FLAGS;
filter->min_size_width = DEFAULT_MIN_SIZE_WIDTH;
filter->min_size_height = DEFAULT_MIN_SIZE_HEIGHT;
+ filter->min_stddev = DEFAULT_MIN_STDDEV;
filter->cvFaceDetect =
gst_face_detect_load_profile (filter, filter->face_profile);
filter->cvNoseDetect =
@@ -404,6 +415,9 @@ gst_face_detect_set_property (GObject * object, guint prop_id,
case PROP_MIN_SIZE_HEIGHT:
filter->min_size_height = g_value_get_int (value);
break;
+ case PROP_MIN_STDDEV:
+ filter->min_stddev = g_value_get_int (value);
+ break;
case PROP_FLAGS:
filter->flags = g_value_get_flags (value);
break;
@@ -450,6 +464,9 @@ gst_face_detect_get_property (GObject * object, guint prop_id,
case PROP_MIN_SIZE_HEIGHT:
g_value_set_int (value, filter->min_size_height);
break;
+ case PROP_MIN_STDDEV:
+ g_value_set_int (value, filter->min_stddev);
+ break;
case PROP_FLAGS:
g_value_set_flags (value, filter->flags);
break;
@@ -514,13 +531,26 @@ gst_face_detect_run_detector (GstFaceDetect * filter,
CvHaarClassifierCascade * detector, gint min_size_width,
gint min_size_height)
{
- return cvHaarDetectObjects (filter->cvGray, detector,
- filter->cvStorage, filter->scale_factor, filter->min_neighbors,
- filter->flags, cvSize (min_size_width, min_size_height)
+ double img_stddev = 0;
+ if (filter->min_stddev > 0) {
+ CvScalar mean, stddev;
+ cvAvgSdv (filter->cvGray, &mean, &stddev, NULL);
+ img_stddev = stddev.val[0];
+ }
+ if (img_stddev >= filter->min_stddev) {
+ return cvHaarDetectObjects (filter->cvGray, detector,
+ filter->cvStorage, filter->scale_factor, filter->min_neighbors,
+ filter->flags, cvSize (min_size_width, min_size_height)
#if (CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >= 2)
- , cvSize (0, 0)
+ , cvSize (0, 0)
#endif
- );
+ );
+ } else {
+ GST_LOG_OBJECT (filter,
+ "Calculated stddev %f lesser than min_stddev %d, detection not performed",
+ img_stddev, filter->min_stddev);
+ return cvCreateSeq (0, sizeof (CvSeq), sizeof (CvPoint), filter->cvStorage);
+ }
}
/*
diff --git a/ext/opencv/gstfacedetect.h b/ext/opencv/gstfacedetect.h
index a9fdd1f4f..090fb7958 100644
--- a/ext/opencv/gstfacedetect.h
+++ b/ext/opencv/gstfacedetect.h
@@ -103,6 +103,7 @@ struct _GstFaceDetect
gint flags;
gint min_size_width;
gint min_size_height;
+ gint min_stddev;
gint updates;
IplImage *cvGray;