mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
facedetect: Add more parameters
Expose the parameters of cvHaarDetectObjects in facedetect element.
This commit is contained in:
parent
27fedbb352
commit
19ba4c8d19
2 changed files with 112 additions and 2 deletions
|
@ -68,6 +68,11 @@ GST_DEBUG_CATEGORY_STATIC (gst_facedetect_debug);
|
||||||
#define GST_CAT_DEFAULT gst_facedetect_debug
|
#define GST_CAT_DEFAULT gst_facedetect_debug
|
||||||
|
|
||||||
#define DEFAULT_PROFILE "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml"
|
#define DEFAULT_PROFILE "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml"
|
||||||
|
#define DEFAULT_SCALE_FACTOR 1.1
|
||||||
|
#define DEFAULT_FLAGS 0
|
||||||
|
#define DEFAULT_MIN_NEIGHBORS 3
|
||||||
|
#define DEFAULT_MIN_SIZE_WIDTH 0
|
||||||
|
#define DEFAULT_MIN_SIZE_HEIGHT 0
|
||||||
|
|
||||||
/* Filter signals and args */
|
/* Filter signals and args */
|
||||||
enum
|
enum
|
||||||
|
@ -80,9 +85,50 @@ enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_DISPLAY,
|
PROP_DISPLAY,
|
||||||
PROP_PROFILE
|
PROP_PROFILE,
|
||||||
|
PROP_SCALE_FACTOR,
|
||||||
|
PROP_MIN_NEIGHBORS,
|
||||||
|
PROP_FLAGS,
|
||||||
|
PROP_MIN_SIZE_WIDTH,
|
||||||
|
PROP_MIN_SIZE_HEIGHT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstOpencvFaceDetectFlags:
|
||||||
|
* @GST_CAMERABIN_FLAG_SOURCE_RESIZE: enable video crop and scale
|
||||||
|
* after capture
|
||||||
|
*
|
||||||
|
* Flags parameter to OpenCV's cvHaarDetectObjects function.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GST_OPENCV_FACE_DETECT_HAAR_DO_CANNY_PRUNING = (1 << 0)
|
||||||
|
} GstOpencvFaceDetectFlags;
|
||||||
|
|
||||||
|
#define GST_TYPE_OPENCV_FACE_DETECT_FLAGS (gst_opencv_face_detect_flags_get_type())
|
||||||
|
|
||||||
|
static void
|
||||||
|
register_gst_opencv_face_detect_flags (GType * id)
|
||||||
|
{
|
||||||
|
static const GFlagsValue values[] = {
|
||||||
|
{(guint) GST_OPENCV_FACE_DETECT_HAAR_DO_CANNY_PRUNING,
|
||||||
|
"Do Canny edge detection to discard some regions", "do-canny-pruning"},
|
||||||
|
{0, NULL, NULL}
|
||||||
|
};
|
||||||
|
*id = g_flags_register_static ("GstOpencvFaceDetectFlags", values);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GType
|
||||||
|
gst_opencv_face_detect_flags_get_type (void)
|
||||||
|
{
|
||||||
|
static GType id;
|
||||||
|
static GOnce once = G_ONCE_INIT;
|
||||||
|
|
||||||
|
g_once (&once, (GThreadFunc) register_gst_opencv_face_detect_flags, &id);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
/* the capabilities of the inputs and outputs.
|
/* the capabilities of the inputs and outputs.
|
||||||
*/
|
*/
|
||||||
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
|
@ -178,6 +224,28 @@ gst_facedetect_class_init (GstfacedetectClass * klass)
|
||||||
g_param_spec_string ("profile", "Profile",
|
g_param_spec_string ("profile", "Profile",
|
||||||
"Location of Haar cascade file to use for face detection",
|
"Location of Haar cascade file to use for face detection",
|
||||||
DEFAULT_PROFILE, G_PARAM_READWRITE));
|
DEFAULT_PROFILE, G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (gobject_class, PROP_FLAGS,
|
||||||
|
g_param_spec_flags ("flags", "Flags", "Flags to cvHaarDetectObjects",
|
||||||
|
GST_TYPE_OPENCV_FACE_DETECT_FLAGS, DEFAULT_FLAGS,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
g_object_class_install_property (gobject_class, PROP_SCALE_FACTOR,
|
||||||
|
g_param_spec_double ("scale-factor", "Scale factor",
|
||||||
|
"Factor by which the windows is scaled after each scan",
|
||||||
|
1.1, 10.0, DEFAULT_SCALE_FACTOR,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
g_object_class_install_property (gobject_class, PROP_MIN_NEIGHBORS,
|
||||||
|
g_param_spec_int ("min-neighbors", "Mininum neighbors",
|
||||||
|
"Minimum number (minus 1) of neighbor rectangles that makes up "
|
||||||
|
"an object", 0, G_MAXINT, DEFAULT_MIN_NEIGHBORS,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
g_object_class_install_property (gobject_class, PROP_MIN_SIZE_WIDTH,
|
||||||
|
g_param_spec_int ("min-size-width", "Minimum size width",
|
||||||
|
"Minimum window width size", 0, G_MAXINT, DEFAULT_MIN_SIZE_WIDTH,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
g_object_class_install_property (gobject_class, PROP_MIN_SIZE_HEIGHT,
|
||||||
|
g_param_spec_int ("min-size-height", "Minimum size height",
|
||||||
|
"Minimum window height size", 0, G_MAXINT, DEFAULT_MIN_SIZE_HEIGHT,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialize the new element
|
/* initialize the new element
|
||||||
|
@ -190,6 +258,11 @@ gst_facedetect_init (Gstfacedetect * filter, GstfacedetectClass * gclass)
|
||||||
{
|
{
|
||||||
filter->profile = g_strdup (DEFAULT_PROFILE);
|
filter->profile = g_strdup (DEFAULT_PROFILE);
|
||||||
filter->display = TRUE;
|
filter->display = TRUE;
|
||||||
|
filter->scale_factor = DEFAULT_SCALE_FACTOR;
|
||||||
|
filter->min_neighbors = DEFAULT_MIN_NEIGHBORS;
|
||||||
|
filter->flags = DEFAULT_FLAGS;
|
||||||
|
filter->min_size_width = DEFAULT_MIN_SIZE_WIDTH;
|
||||||
|
filter->min_size_height = DEFAULT_MIN_SIZE_HEIGHT;
|
||||||
gst_facedetect_load_profile (filter);
|
gst_facedetect_load_profile (filter);
|
||||||
|
|
||||||
gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
|
gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
|
||||||
|
@ -211,6 +284,21 @@ gst_facedetect_set_property (GObject * object, guint prop_id,
|
||||||
case PROP_DISPLAY:
|
case PROP_DISPLAY:
|
||||||
filter->display = g_value_get_boolean (value);
|
filter->display = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_SCALE_FACTOR:
|
||||||
|
filter->scale_factor = g_value_get_double (value);
|
||||||
|
break;
|
||||||
|
case PROP_MIN_NEIGHBORS:
|
||||||
|
filter->min_neighbors = g_value_get_int (value);
|
||||||
|
break;
|
||||||
|
case PROP_MIN_SIZE_WIDTH:
|
||||||
|
filter->min_size_width = g_value_get_int (value);
|
||||||
|
break;
|
||||||
|
case PROP_MIN_SIZE_HEIGHT:
|
||||||
|
filter->min_size_height = g_value_get_int (value);
|
||||||
|
break;
|
||||||
|
case PROP_FLAGS:
|
||||||
|
filter->flags = g_value_get_flags (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -230,6 +318,21 @@ gst_facedetect_get_property (GObject * object, guint prop_id,
|
||||||
case PROP_DISPLAY:
|
case PROP_DISPLAY:
|
||||||
g_value_set_boolean (value, filter->display);
|
g_value_set_boolean (value, filter->display);
|
||||||
break;
|
break;
|
||||||
|
case PROP_SCALE_FACTOR:
|
||||||
|
g_value_set_double (value, filter->scale_factor);
|
||||||
|
break;
|
||||||
|
case PROP_MIN_NEIGHBORS:
|
||||||
|
g_value_set_int (value, filter->min_neighbors);
|
||||||
|
break;
|
||||||
|
case PROP_MIN_SIZE_WIDTH:
|
||||||
|
g_value_set_int (value, filter->min_size_width);
|
||||||
|
break;
|
||||||
|
case PROP_MIN_SIZE_HEIGHT:
|
||||||
|
g_value_set_int (value, filter->min_size_height);
|
||||||
|
break;
|
||||||
|
case PROP_FLAGS:
|
||||||
|
g_value_set_flags (value, filter->flags);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -306,7 +409,9 @@ gst_facedetect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
|
||||||
|
|
||||||
faces =
|
faces =
|
||||||
cvHaarDetectObjects (filter->cvGray, filter->cvCascade,
|
cvHaarDetectObjects (filter->cvGray, filter->cvCascade,
|
||||||
filter->cvStorage, 1.1, 2, 0, cvSize (30, 30));
|
filter->cvStorage, filter->scale_factor, filter->min_neighbors,
|
||||||
|
filter->flags,
|
||||||
|
cvSize (filter->min_size_width, filter->min_size_height));
|
||||||
|
|
||||||
if (faces && faces->total > 0) {
|
if (faces && faces->total > 0) {
|
||||||
msg = gst_facedetect_message_new (filter, buf);
|
msg = gst_facedetect_message_new (filter, buf);
|
||||||
|
|
|
@ -72,6 +72,11 @@ struct _Gstfacedetect
|
||||||
gboolean display;
|
gboolean display;
|
||||||
|
|
||||||
gchar *profile;
|
gchar *profile;
|
||||||
|
gdouble scale_factor;
|
||||||
|
gint min_neighbors;
|
||||||
|
gint flags;
|
||||||
|
gint min_size_width;
|
||||||
|
gint min_size_height;
|
||||||
|
|
||||||
IplImage *cvGray;
|
IplImage *cvGray;
|
||||||
CvHaarClassifierCascade *cvCascade;
|
CvHaarClassifierCascade *cvCascade;
|
||||||
|
|
Loading…
Reference in a new issue