opencv: add mask property to cvlaplace
authorLuis de Bethencourt <luisbg@osg.samsung.com>
Mon, 25 Jan 2016 22:30:29 +0000 (22:30 +0000)
committerLuis de Bethencourt <luisbg@osg.samsung.com>
Mon, 25 Jan 2016 22:30:44 +0000 (22:30 +0000)
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.

ext/opencv/gstcvlaplace.cpp
ext/opencv/gstcvlaplace.h

index 1081a575de5746a96ec74beb638bead2eb0e803c..c9894561506d8b9b4e0f34a792d197ff70ad23f3 100644 (file)
@@ -87,12 +87,14 @@ enum
   PROP_0,
   PROP_APERTURE_SIZE,
   PROP_SCALE,
-  PROP_SHIFT
+  PROP_SHIFT,
+  PROP_MASK
 };
 
 #define DEFAULT_APERTURE_SIZE 3
 #define DEFAULT_SCALE_FACTOR 1.0
 #define DEFAULT_SHIFT 0.0
+#define DEFAULT_MASK TRUE
 
 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",
           "Value added to the scaled source array elements", 0.0, G_MAXDOUBLE,
           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_static_pad_template_get (&src_factory));
@@ -179,6 +185,7 @@ gst_cv_laplace_init (GstCvLaplace * filter)
   filter->aperture_size = DEFAULT_APERTURE_SIZE;
   filter->scale = DEFAULT_SCALE_FACTOR;
   filter->shift = DEFAULT_SHIFT;
+  filter->mask = DEFAULT_MASK;
 
   gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
       FALSE);
@@ -223,6 +230,9 @@ gst_cv_laplace_set_property (GObject * object, guint prop_id,
     case PROP_SHIFT:
       filter->shift = g_value_get_double (value);
       break;
+    case PROP_MASK:
+      filter->mask = g_value_get_boolean (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -245,6 +255,9 @@ gst_cv_laplace_get_property (GObject * object, guint prop_id,
     case PROP_SHIFT:
       g_value_set_double (value, filter->shift);
       break;
+    case PROP_MASK:
+      g_value_set_boolean (value, filter->mask);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -309,8 +322,13 @@ gst_cv_laplace_transform (GstOpencvVideoFilter * base, GstBuffer * buf,
   cvLaplace (filter->cvGray, filter->intermediary_img, filter->aperture_size);
   cvConvertScale (filter->intermediary_img, filter->Laplace, filter->scale,
       filter->shift);
+
   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);
   memcpy (out_info.data, filter->CLaplace->imageData,
index 8590964331b7ad90ba60bcc888b4ade77b6a4cb8..82f237f34095d56f9e5605478535ffa8a39d2688 100644 (file)
@@ -70,6 +70,7 @@ struct _GstCvLaplace
   gint aperture_size;
   gdouble scale;
   gdouble shift;
+  gboolean mask;
 
   IplImage *intermediary_img;
   IplImage *cvGray;