mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
opencv: add mask property to cvlaplace
Add a "mask" property that sets whether the edges by cvLaplace should be used as a mask on the original input or not. The same way the original image is copied to the edges in edgedetect.
This commit is contained in:
parent
9301d5874a
commit
a152a8342b
2 changed files with 21 additions and 2 deletions
|
@ -87,12 +87,14 @@ enum
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_APERTURE_SIZE,
|
PROP_APERTURE_SIZE,
|
||||||
PROP_SCALE,
|
PROP_SCALE,
|
||||||
PROP_SHIFT
|
PROP_SHIFT,
|
||||||
|
PROP_MASK
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFAULT_APERTURE_SIZE 3
|
#define DEFAULT_APERTURE_SIZE 3
|
||||||
#define DEFAULT_SCALE_FACTOR 1.0
|
#define DEFAULT_SCALE_FACTOR 1.0
|
||||||
#define DEFAULT_SHIFT 0.0
|
#define DEFAULT_SHIFT 0.0
|
||||||
|
#define DEFAULT_MASK TRUE
|
||||||
|
|
||||||
G_DEFINE_TYPE (GstCvLaplace, gst_cv_laplace, GST_TYPE_OPENCV_VIDEO_FILTER);
|
G_DEFINE_TYPE (GstCvLaplace, gst_cv_laplace, GST_TYPE_OPENCV_VIDEO_FILTER);
|
||||||
|
|
||||||
|
@ -157,6 +159,10 @@ gst_cv_laplace_class_init (GstCvLaplaceClass * klass)
|
||||||
g_param_spec_double ("shift", "Shift",
|
g_param_spec_double ("shift", "Shift",
|
||||||
"Value added to the scaled source array elements", 0.0, G_MAXDOUBLE,
|
"Value added to the scaled source array elements", 0.0, G_MAXDOUBLE,
|
||||||
DEFAULT_SHIFT, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
|
DEFAULT_SHIFT, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
|
||||||
|
g_object_class_install_property (gobject_class, PROP_MASK,
|
||||||
|
g_param_spec_boolean ("mask", "Mask",
|
||||||
|
"Sets whether the detected edges should be used as a mask on the original input or not",
|
||||||
|
DEFAULT_MASK, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
|
||||||
|
|
||||||
gst_element_class_add_pad_template (element_class,
|
gst_element_class_add_pad_template (element_class,
|
||||||
gst_static_pad_template_get (&src_factory));
|
gst_static_pad_template_get (&src_factory));
|
||||||
|
@ -179,6 +185,7 @@ gst_cv_laplace_init (GstCvLaplace * filter)
|
||||||
filter->aperture_size = DEFAULT_APERTURE_SIZE;
|
filter->aperture_size = DEFAULT_APERTURE_SIZE;
|
||||||
filter->scale = DEFAULT_SCALE_FACTOR;
|
filter->scale = DEFAULT_SCALE_FACTOR;
|
||||||
filter->shift = DEFAULT_SHIFT;
|
filter->shift = DEFAULT_SHIFT;
|
||||||
|
filter->mask = DEFAULT_MASK;
|
||||||
|
|
||||||
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),
|
||||||
FALSE);
|
FALSE);
|
||||||
|
@ -223,6 +230,9 @@ gst_cv_laplace_set_property (GObject * object, guint prop_id,
|
||||||
case PROP_SHIFT:
|
case PROP_SHIFT:
|
||||||
filter->shift = g_value_get_double (value);
|
filter->shift = g_value_get_double (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_MASK:
|
||||||
|
filter->mask = g_value_get_boolean (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;
|
||||||
|
@ -245,6 +255,9 @@ gst_cv_laplace_get_property (GObject * object, guint prop_id,
|
||||||
case PROP_SHIFT:
|
case PROP_SHIFT:
|
||||||
g_value_set_double (value, filter->shift);
|
g_value_set_double (value, filter->shift);
|
||||||
break;
|
break;
|
||||||
|
case PROP_MASK:
|
||||||
|
g_value_set_boolean (value, filter->mask);
|
||||||
|
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;
|
||||||
|
@ -309,8 +322,13 @@ gst_cv_laplace_transform (GstOpencvVideoFilter * base, GstBuffer * buf,
|
||||||
cvLaplace (filter->cvGray, filter->intermediary_img, filter->aperture_size);
|
cvLaplace (filter->cvGray, filter->intermediary_img, filter->aperture_size);
|
||||||
cvConvertScale (filter->intermediary_img, filter->Laplace, filter->scale,
|
cvConvertScale (filter->intermediary_img, filter->Laplace, filter->scale,
|
||||||
filter->shift);
|
filter->shift);
|
||||||
|
|
||||||
cvZero (filter->CLaplace);
|
cvZero (filter->CLaplace);
|
||||||
cvCvtColor (filter->Laplace, filter->CLaplace, CV_GRAY2RGB);
|
if (filter->mask) {
|
||||||
|
cvCopy (img, filter->CLaplace, filter->Laplace);
|
||||||
|
} else {
|
||||||
|
cvCvtColor (filter->Laplace, filter->CLaplace, CV_GRAY2RGB);
|
||||||
|
}
|
||||||
|
|
||||||
gst_buffer_map (outbuf, &out_info, GST_MAP_WRITE);
|
gst_buffer_map (outbuf, &out_info, GST_MAP_WRITE);
|
||||||
memcpy (out_info.data, filter->CLaplace->imageData,
|
memcpy (out_info.data, filter->CLaplace->imageData,
|
||||||
|
|
|
@ -70,6 +70,7 @@ struct _GstCvLaplace
|
||||||
gint aperture_size;
|
gint aperture_size;
|
||||||
gdouble scale;
|
gdouble scale;
|
||||||
gdouble shift;
|
gdouble shift;
|
||||||
|
gboolean mask;
|
||||||
|
|
||||||
IplImage *intermediary_img;
|
IplImage *intermediary_img;
|
||||||
IplImage *cvGray;
|
IplImage *cvGray;
|
||||||
|
|
Loading…
Reference in a new issue