Added control for changing method

This commit is contained in:
Noam 2009-05-13 12:19:43 +03:00 committed by Thiago Santos
parent 2195e2b123
commit 6bb2bbd9c3
2 changed files with 33 additions and 9 deletions

View file

@ -69,6 +69,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_templatematch_debug);
#define GST_CAT_DEFAULT gst_templatematch_debug #define GST_CAT_DEFAULT gst_templatematch_debug
#define DEFAULT_TEMPLATE NULL #define DEFAULT_TEMPLATE NULL
#define DEFAULT_METHOD (3)
/* Filter signals and args */ /* Filter signals and args */
enum enum
@ -80,8 +81,9 @@ enum
enum enum
{ {
PROP_0, PROP_0,
PROP_METHOD,
PROP_TEMPLATE,
PROP_DISPLAY, PROP_DISPLAY,
PROP_TEMPLATE
}; };
/* the capabilities of the inputs and outputs. /* the capabilities of the inputs and outputs.
@ -114,7 +116,7 @@ static void gst_templatematch_get_property (GObject * object, guint prop_id,
static gboolean gst_templatematch_set_caps (GstPad * pad, GstCaps * caps); static gboolean gst_templatematch_set_caps (GstPad * pad, GstCaps * caps);
static GstFlowReturn gst_templatematch_chain (GstPad * pad, GstBuffer * buf); static GstFlowReturn gst_templatematch_chain (GstPad * pad, GstBuffer * buf);
static void gst_templatematch_load_template (GObject * object); static void gst_templatematch_load_template(GstTemplateMatch *filter);
static void gst_templatematch_match(IplImage *input, IplImage *template, static void gst_templatematch_match(IplImage *input, IplImage *template,
IplImage *dist_image, double *best_res, CvPoint *best_pos, int method); IplImage *dist_image, double *best_res, CvPoint *best_pos, int method);
@ -151,12 +153,15 @@ gst_templatematch_class_init (GstTemplateMatchClass * klass)
gobject_class->set_property = gst_templatematch_set_property; gobject_class->set_property = gst_templatematch_set_property;
gobject_class->get_property = gst_templatematch_get_property; gobject_class->get_property = gst_templatematch_get_property;
g_object_class_install_property (gobject_class, PROP_DISPLAY, g_object_class_install_property (gobject_class, PROP_METHOD,
g_param_spec_boolean ("display", "Display", "Sets whether the detected template should be highlighted in the output", g_param_spec_int ("method", "Method", "Specifies the way the template must be compared with image regions. 0=SQDIFF, 1=SQDIFF_NORMED, 2=CCOR, 3=CCOR_NORMED, 4=CCOEFF, 5=CCOEFF_NORMED.",
TRUE, G_PARAM_READWRITE)); 0, 5, DEFAULT_METHOD, G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, PROP_TEMPLATE, g_object_class_install_property (gobject_class, PROP_TEMPLATE,
g_param_spec_string ("template", "Template", "Filename of template image", g_param_spec_string ("template", "Template", "Filename of template image",
DEFAULT_TEMPLATE, G_PARAM_READWRITE)); DEFAULT_TEMPLATE, G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, PROP_DISPLAY,
g_param_spec_boolean ("display", "Display", "Sets whether the detected template should be highlighted in the output",
TRUE, G_PARAM_READWRITE));
} }
/* initialize the new element /* initialize the new element
@ -187,6 +192,7 @@ gst_templatematch_init (GstTemplateMatch * filter,
filter->cvTemplateImage = NULL; filter->cvTemplateImage = NULL;
filter->cvDistImage = NULL; filter->cvDistImage = NULL;
filter->cvImage = NULL; filter->cvImage = NULL;
filter->method = DEFAULT_METHOD;
gst_templatematch_load_template(filter); gst_templatematch_load_template(filter);
} }
@ -197,6 +203,22 @@ gst_templatematch_set_property (GObject * object, guint prop_id,
GstTemplateMatch *filter = GST_TEMPLATEMATCH (object); GstTemplateMatch *filter = GST_TEMPLATEMATCH (object);
switch (prop_id) { switch (prop_id) {
case PROP_METHOD:
switch (g_value_get_int (value)) {
case 0:
filter->method = CV_TM_SQDIFF; break;
case 1:
filter->method = CV_TM_SQDIFF_NORMED; break;
case 2:
filter->method = CV_TM_CCORR; break;
case 3:
filter->method = CV_TM_CCORR_NORMED; break;
case 4:
filter->method = CV_TM_CCOEFF; break;
case 5:
filter->method = CV_TM_CCOEFF_NORMED; break;
}
break;
case PROP_TEMPLATE: case PROP_TEMPLATE:
filter->template = g_value_get_string (value); filter->template = g_value_get_string (value);
gst_templatematch_load_template(filter); gst_templatematch_load_template(filter);
@ -217,6 +239,9 @@ gst_templatematch_get_property (GObject * object, guint prop_id,
GstTemplateMatch *filter = GST_TEMPLATEMATCH (object); GstTemplateMatch *filter = GST_TEMPLATEMATCH (object);
switch (prop_id) { switch (prop_id) {
case PROP_METHOD:
g_value_set_int(value, filter->method);
break;
case PROP_TEMPLATE: case PROP_TEMPLATE:
g_value_set_string (value, filter->template); g_value_set_string (value, filter->template);
break; break;
@ -298,7 +323,7 @@ gst_templatematch_chain (GstPad * pad, GstBuffer * buf)
} }
if (filter->cvTemplateImage) { if (filter->cvTemplateImage) {
gst_templatematch_match(filter->cvImage, filter->cvTemplateImage, gst_templatematch_match(filter->cvImage, filter->cvTemplateImage,
filter->cvDistImage, &best_res, &best_pos, CV_TM_CCORR); filter->cvDistImage, &best_res, &best_pos, filter->method);
GstStructure *s = gst_structure_new ("template_match", GstStructure *s = gst_structure_new ("template_match",
"x", G_TYPE_UINT, best_pos.x, "x", G_TYPE_UINT, best_pos.x,
@ -350,9 +375,7 @@ static void gst_templatematch_match(IplImage *input, IplImage *template,
} }
static void gst_templatematch_load_template(GObject * object) { static void gst_templatematch_load_template(GstTemplateMatch *filter) {
GstTemplateMatch *filter = GST_TEMPLATEMATCH (object);
if (filter->template) { if (filter->template) {
filter->cvTemplateImage = cvLoadImage(filter->template, CV_LOAD_IMAGE_COLOR); filter->cvTemplateImage = cvLoadImage(filter->template, CV_LOAD_IMAGE_COLOR);
if (!filter->cvTemplateImage) { if (!filter->cvTemplateImage) {

View file

@ -73,6 +73,7 @@ struct _GstTemplateMatch
GstPad *sinkpad, *srcpad; GstPad *sinkpad, *srcpad;
gint method;
gboolean display; gboolean display;
gchar *template; gchar *template;