Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
302 changes: 302 additions & 0 deletions opencv-glib/image.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,274 @@ gcv_drawing_options_new(void)
return GCV_DRAWING_OPTIONS(g_object_new(GCV_TYPE_DRAWING_OPTIONS, NULL));
}

/*************************************/

typedef struct {
gboolean normalize;
// const Scalar &borderValue=morphologyDefaultBorderValue()
// const Size &dstsize=Size()
gdouble delta;
gdouble psi;
gdouble scale;
gdouble sigma_y;
gint border_type;
gint iterations;
gint ksize;
// gint ktype;
gint max_level;
GCVPoint anchor;
// TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5, 1)
} GCVImageFilteringOptionsPrivate;

G_DEFINE_TYPE_WITH_PRIVATE(GCVImageFilteringOptions,
gcv_image_filtering_options,
G_TYPE_OBJECT)

#define GCV_IMAGE_FILTERING_OPTIONS_GET_PRIVATE(object) \
static_cast<GCVImageFilteringOptionsPrivate *>( \
gcv_image_filtering_options_get_instance_private( \
GCV_IMAGE_FILTERING_OPTIONS(object)))

// TODO
enum {
PROP_NORMALIZE = 1,
PROP_BORDER_VALUE,
PROP_DSTSIZE,
PROP_DELTA,
PROP_PSI,
PROP_SCALE,
PROP_SIGMA_Y,
PROP_BORDER_TYPE,
PROP_ITERATIONS,
PROP_KSIZE,
PROP_KTYPE,
PROP_MAX_LEVEL,
PROP_ANCHOR,
};

static void
gcv_image_filtering_options_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
auto priv = GCV_IMAGE_FILTERING_OPTIONS_GET_PRIVATE(object);

switch (prop_id) {
case PROP_NORMALIZE:
g_value_set_boolean(value, priv->normalize);
break;
/* TODO
case PROP_BORDER_VALUE:
g_value_set_XXX(value, priv->border_value);
break;
case PROP_DSTSIZE:
g_value_set_XXX(value, priv->dstsize);
break;
*/
case PROP_DELTA:
g_value_set_double(value, priv->delta);
break;
case PROP_PSI:
g_value_set_double(value, priv->psi);
break;
case PROP_SCALE:
g_value_set_double(value, priv->scale);
break;
case PROP_SIGMA_Y:
g_value_set_double(value, priv->sigma_y);
break;
case PROP_BORDER_TYPE:
g_value_set_enum(value, priv->border_type);
break;
case PROP_ITERATIONS:
g_value_set_int(value, priv->iterations);
break;
case PROP_KSIZE:
g_value_set_int(value, priv->ksize);
break;
/*
case PROP_KTYPE:
g_value_set_int(value, priv->ktype);
break;
*/
case PROP_MAX_LEVEL:
g_value_set_int(value, priv->max_level);
break;
/*
case PROP_ANCHOR:
g_value_set_XXX(value, priv->anchor);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this part, I would like to implement the following.
Could you advise for that?
(Thank you for helping me. I'm not familiar with C++ pointers, by the way.)

options = CV::ImageFilteringOptions.new
options.anchor = CV::Point.new(-1,-1)
#...
options.anchor

break;
*/
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}

}

static void
gcv_image_filtering_options_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GCV_IMAGE_FILTERING_OPTIONS_GET_PRIVATE(object);

switch (prop_id) {
case PROP_NORMALIZE:
priv->normalize = g_value_get_boolean(value);
break;
/* TODO
case PROP_BORDER_VALUE:
priv->border_value = g_value_get_XXX(value);
break;
case PROP_DSTSIZE:
priv->dstsize = g_value_get_XXX(value);
break;
*/
case PROP_DELTA:
priv->delta = g_value_get_double(value);
break;
case PROP_PSI:
priv->psi = g_value_get_double(value);
break;
case PROP_SCALE:
priv->scale = g_value_get_double(value);
break;
case PROP_SIGMA_Y:
priv->sigma_y = g_value_get_double(value);
break;
case PROP_BORDER_TYPE:
priv->border_type = static_cast<GCVBorderType>(g_value_get_enum(value));
break;
case PROP_ITERATIONS:
priv->iterations = g_value_get_int(value);
break;
case PROP_KSIZE:
priv->ksize = g_value_get_int(value);
break;
/*
case PROP_KTYPE:
priv->ktype = g_value_get_int(value);
break;
*/
case PROP_MAX_LEVEL:
priv->max_level = g_value_get_int(value);
break;
/*
case PROP_ANCHOR:
priv->anchor = g_value_get_XXX(value);
break;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this part, I would like to implement the following.
Could you advise for that?
(Thank you for helping me. I'm not familiar with C++ pointers, by the way.)

options = CV::ImageFilteringOptions.new
options.anchor = CV::Point.new(-1,-1)
#...
options.anchor

*/
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}


static void
gcv_image_filtering_options_init(GCVImageFilteringOptions *object)
{
}

static void
gcv_image_filtering_options_class_init(GCVImageFilteringOptionsClass *klass)
{
GParamSpec *spec;

auto gobject_class = G_OBJECT_CLASS(klass);

gobject_class->get_property = gcv_image_filtering_options_get_property;
gobject_class->set_property = gcv_image_filtering_options_set_property;

spec = g_param_spec_double("delta",
"Delta",
"Delta TODO",
0, G_MAXDOUBLE, 0,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property(gobject_class, PROP_DELTA, spec);

/*
spec = g_param_spec_double("psi",
"Psi",
"PSI TODO",
0, G_MAXDOUBLE, cv::CV_PI * 0.5,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property(gobject_class, PROP_PSI, spec);
*/

spec = g_param_spec_double("scale",
"Scale",
"Scale TODO",
0, G_MAXDOUBLE, 1.0,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property(gobject_class, PROP_SCALE, spec);

spec = g_param_spec_double("sigmaY",
"Sigma Y",
"sigmaY TODO",
0, G_MAXDOUBLE, 0.0,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property(gobject_class, PROP_SIGMA_Y, spec);

spec = g_param_spec_enum("border-type",
"Border type",
"The type of border to be filter",
GCV_TYPE_BORDER_TYPE,
GCV_BORDER_TYPE_BORDER_DEFAULT,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property(gobject_class, PROP_BORDER_TYPE, spec);

spec = g_param_spec_int("iterations",
"Iterations",
"The number of iterations",
0, G_MAXINT, 1,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property(gobject_class, PROP_ITERATIONS, spec);

spec = g_param_spec_int("ksize",
"Ksize",
"KSize", // TODO
0, G_MAXINT, 1, // TODO
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property(gobject_class, PROP_KSIZE, spec);

spec = g_param_spec_int("max-level",
"Max Level",
"Max Level", // TODO
0, G_MAXINT, 1,
static_cast<GParamFlags>(G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property(gobject_class, PROP_MAX_LEVEL, spec);


}

/**
* gcv_image_filtering_options_new:
*
* Returns a newly created #GCVImageFilteringOptions.
*
* Since: 1.0.2
*/
GCVImageFilteringOptions *
gcv_image_filtering_options_new(void)
{
return GCV_IMAGE_FILTERING_OPTIONS(g_object_new(GCV_TYPE_IMAGE_FILTERING_OPTIONS,
NULL));
}

/***************************** end *******************/

G_DEFINE_TYPE(GCVImage, gcv_image, GCV_TYPE_MATRIX)

static void
Expand Down Expand Up @@ -722,6 +990,40 @@ GCVImage *gcv_image_median_blur(GCVImage *image,
return gcv_image_new_raw(&cv_converted_image);
}

/**
* gcv_image_blur:
* @image: A #GCVImage.
* @ksize: A #GCVSize blurring kernel size.
* @options: (nullable): A #GCVImageFilteringOptions;
* @error: (nullable): Return locatipcn for a #GError or %NULL.
*
* It effects blur image. The converted image is returned as
* a new image.
*
* Returns: (transfer full): A converted #GCVImage.
*
* Since: 1.0.4
*/
GCVImage *gcv_image_blur(GCVImage *image,
GCVSize *ksize,
GCVImageFilteringOptions *options,
GError **error)
{
auto cv_image = gcv_matrix_get_raw(GCV_MATRIX(image));
auto cv_ksize = gcv_size_get_raw(ksize);
auto cv_converted_image = std::make_shared<cv::Mat>();

if ( options != NULL ) {
auto options_priv = GCV_IMAGE_FILTERING_OPTIONS_GET_PRIVATE(options);

cv::blur(*cv_image, *cv_converted_image, *cv_ksize, NULL, options_priv->border_type);
} else {
cv::blur(*cv_image, *cv_converted_image, *cv_ksize);
}

return gcv_image_new_raw(&cv_converted_image);
}

G_END_DECLS

GCVImage *
Expand Down
60 changes: 59 additions & 1 deletion opencv-glib/image.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,60 @@ struct _GCVDrawingOptionsClass

GCVDrawingOptions *gcv_drawing_options_new(void);

/**********************************************/

/**
* GCVBorderTypes:
* @GCV_BORDER_TYPE_BORDER_CONSTANT: See `cv::BorderTypes::BORDER_CONSTANT`.
* @GCV_BORDER_TYPE_BORDER_REPLICATE : See `cv::BorderTypes::BORDER_REPLICATE `.
* @GCV_BORDER_TYPE_BORDER_REFLECT : See `cv::BorderTypes::BORDER_REFLECT `.
* @GCV_BORDER_TYPE_BORDER_WRAP : See `cv::BorderTypes::BORDER_WRAP `.
* @GCV_BORDER_TYPE_BORDER_REFLECT_101 : See `cv::BorderTypes::BORDER_REFLECT_101 `.
* @GCV_BORDER_TYPE_BORDER_TRANSPARENT : See `cv::BorderTypes::BORDER_TRANSPARENT `.
* @GCV_BORDER_TYPE_BORDER_REFLECT101 : See `cv::BorderTypes::BORDER_REFLECT101 `.
* @GCV_BORDER_TYPE_BORDER_DEFAULT : See `cv::BorderTypes::BORDER_DEFAULT `.
* @GCV_BORDER_TYPE_BORDER_ISOLATED : See `cv::BorderTypes::BORDER_ISOLATED `.
*
* Line type for drawing functions corresponding to `cv::BorderTypes`.
*
* See also [OpenCV documents](https://docs.opencv.org/).
*
* We don't have a link to the latest `cv::border_types` document.
* But we can link to a specific version:
* [OpenCV `cv::border_types`]().
*
* Since 1.0.2
*/
typedef enum {
GCV_BORDER_TYPE_BORDER_CONSTANT = 0,
GCV_BORDER_TYPE_BORDER_REPLICATE = 1,
GCV_BORDER_TYPE_BORDER_REFLECT = 2,
GCV_BORDER_TYPE_BORDER_WRAP = 3,
GCV_BORDER_TYPE_BORDER_REFLECT_101 = 4,
GCV_BORDER_TYPE_BORDER_TRANSPARENT = 5,
GCV_BORDER_TYPE_BORDER_REFLECT101 = 6,
GCV_BORDER_TYPE_BORDER_DEFAULT = 7,
GCV_BORDER_TYPE_BORDER_ISOLATED = 8
} GCVBorderType;

#define GCV_TYPE_IMAGE_FILTERING_OPTIONS (gcv_image_filtering_options_get_type())
G_DECLARE_DERIVABLE_TYPE(GCVImageFilteringOptions,
gcv_image_filtering_options,
GCV,
IMAGE_FILTERING_OPTIONS,
GObject)

struct _GCVImageFilteringOptionsClass
{
GObjectClass parent_class;
};

GCVImageFilteringOptions *gcv_image_filtering_options_new(void);


/**********************************************/


/**
* GCVImageReadFlags:
* @GCV_IMAGE_READ_FLAG_UNCHANGED: See `cv::IMREAD_UNCHANGED`.
Expand Down Expand Up @@ -143,7 +197,7 @@ GCVDrawingOptions *gcv_drawing_options_new(void);
* But we can link to a specific version:
* [OpenCV 3.4.1's `cv::ImreadModes`](https://docs.opencv.org/3.4.1/d4/da8/group__imgcodecs.html#ga61d9b0126a3e57d9277ac48327799c80).
*
* Since: 1.0.0
* Since: 1.0.4
*/
typedef enum { /*< flags >*/
GCV_IMAGE_READ_FLAG_UNCHANGED = -1,
Expand Down Expand Up @@ -235,4 +289,8 @@ GCVImage *gcv_image_median_blur(GCVImage *image,
gint ksize,
GError **error);

GCVImage *gcv_image_blur(GCVImage *image,
GCVSize *ksize,
GCVImageFilteringOptions *options,
GError **error);
G_END_DECLS
Loading