static void gst_cv_sobel_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstCvSobel *filter = GST_CV_SOBEL (object); switch (prop_id) { case PROP_X_ORDER: filter->x_order = g_value_get_int (value); break; case PROP_Y_ORDER: filter->y_order = g_value_get_int (value); break; case PROP_APERTURE_SIZE:{ gint as = g_value_get_int (value); if (as % 2 != 1) { GST_WARNING_OBJECT (filter, "Invalid value %d for aperture size", as); } else filter->aperture_size = g_value_get_int (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; } }
/* Clean up */ static void gst_cv_sobel_finalize (GObject * obj) { GstCvSobel *filter = GST_CV_SOBEL (obj); filter->cvGray.release (); filter->cvSobel.release (); G_OBJECT_CLASS (gst_cv_sobel_parent_class)->finalize (obj); }
static GstFlowReturn gst_cv_sobel_transform (GstOpencvVideoFilter * base, GstBuffer * buf, IplImage * img, GstBuffer * outbuf, IplImage * outimg) { GstCvSobel *filter = GST_CV_SOBEL (base); cvSobel (img, outimg, filter->x_order, filter->y_order, filter->aperture_size); return GST_FLOW_OK; }
/* Clean up */ static void gst_cv_sobel_finalize (GObject * obj) { GstCvSobel *filter = GST_CV_SOBEL (obj); if (filter->cvSobel != NULL) { cvReleaseImage (&filter->cvGray); cvReleaseImage (&filter->cvSobel); } G_OBJECT_CLASS (gst_cv_sobel_parent_class)->finalize (obj); }
/* this function handles the link with other elements */ static gboolean gst_cv_sobel_set_caps (GstOpencvVideoFilter * transform, gint in_width, gint in_height, int in_cv_type, gint out_width, gint out_height, int out_cv_type) { GstCvSobel *filter = GST_CV_SOBEL (transform); filter->cvGray.create (cv::Size (in_width, in_height), CV_8UC1); filter->cvSobel.create (cv::Size (out_width, out_height), CV_8UC1); return TRUE; }
/* this function handles the link with other elements */ static gboolean gst_cv_sobel_set_caps (GstOpencvVideoFilter * transform, gint in_width, gint in_height, gint in_depth, gint in_channels, gint out_width, gint out_height, gint out_depth, gint out_channels) { GstCvSobel *filter = GST_CV_SOBEL (transform); if (filter->cvGray) cvReleaseImage (&filter->cvGray); filter->cvGray = cvCreateImage (cvSize (in_width, in_height), IPL_DEPTH_8U, 1); return TRUE; }
static GstFlowReturn gst_cv_sobel_transform (GstOpencvVideoFilter * base, GstBuffer * buf, IplImage * img, GstBuffer * outbuf, IplImage * outimg) { GstCvSobel *filter = GST_CV_SOBEL (base); cvCvtColor (img, filter->cvGray, CV_RGB2GRAY); cvSobel (filter->cvGray, filter->cvSobel, filter->x_order, filter->y_order, filter->aperture_size); cvZero (outimg); if (filter->mask) { cvCopy (img, outimg, filter->cvSobel); } else { cvCvtColor (filter->cvSobel, outimg, CV_GRAY2RGB); } return GST_FLOW_OK; }
static GstFlowReturn gst_cv_sobel_transform (GstOpencvVideoFilter * base, GstBuffer * buf, cv::Mat img, GstBuffer * outbuf, cv::Mat outimg) { GstCvSobel *filter = GST_CV_SOBEL (base); cv::cvtColor (img, filter->cvGray, cv::COLOR_RGB2GRAY); cv::Sobel (filter->cvGray, filter->cvSobel, filter->cvGray.depth (), filter->x_order, filter->y_order, filter->aperture_size); outimg.setTo (cv::Scalar::all (0)); if (filter->mask) { img.copyTo (outimg, filter->cvSobel); } else { cv::cvtColor (filter->cvSobel, outimg, cv::COLOR_GRAY2RGB); } return GST_FLOW_OK; }
static void gst_cv_sobel_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstCvSobel *filter = GST_CV_SOBEL (object); switch (prop_id) { case PROP_X_ORDER: g_value_set_int (value, filter->x_order); break; case PROP_Y_ORDER: g_value_set_int (value, filter->y_order); break; case PROP_APERTURE_SIZE: g_value_set_int (value, filter->aperture_size); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static gboolean gst_cv_sobel_handle_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstCvSobel *filter; gint width, height; GstStructure *structure; gboolean res = TRUE; filter = GST_CV_SOBEL (parent); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CAPS: { GstCaps *caps; gst_event_parse_caps (event, &caps); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &width); gst_structure_get_int (structure, "height", &height); if (filter->cvSobel != NULL) { cvReleaseImage (&filter->cvCSobel); cvReleaseImage (&filter->cvGray); cvReleaseImage (&filter->cvSobel); } filter->cvCSobel = cvCreateImage (cvSize (width, height), IPL_DEPTH_8U, 3); filter->cvGray = cvCreateImage (cvSize (width, height), IPL_DEPTH_8U, 1); filter->cvSobel = cvCreateImage (cvSize (width, height), IPL_DEPTH_8U, 1); break; } default: break; } res = gst_pad_event_default (pad, parent, event); return res; }
static GstFlowReturn gst_cv_sobel_transform (GstOpencvVideoFilter * base, GstBuffer * buf, IplImage * img, GstBuffer * outbuf, IplImage * outimg) { GstCvSobel *filter = GST_CV_SOBEL (base); GstMapInfo out_info; cvCvtColor (img, filter->cvGray, CV_RGB2GRAY); cvSobel (filter->cvGray, filter->cvSobel, filter->x_order, filter->y_order, filter->aperture_size); cvZero (filter->cvCSobel); if (filter->mask) { cvCopy (img, filter->cvCSobel, filter->cvSobel); } else { cvCvtColor (filter->cvSobel, filter->cvCSobel, CV_GRAY2RGB); } gst_buffer_map (outbuf, &out_info, GST_MAP_WRITE); memcpy (out_info.data, filter->cvCSobel->imageData, gst_buffer_get_size (outbuf)); return GST_FLOW_OK; }