diff --git a/ext/cvbox2d.cpp b/ext/cvbox2d.cpp
index 1b07b9a..7a1229c 100644
--- a/ext/cvbox2d.cpp
+++ b/ext/cvbox2d.cpp
@@ -41,9 +41,14 @@ define_ruby_class()
*/
VALUE opencv = rb_module_opencv();
rb_klass = rb_define_class_under(opencv, "CvBox2D", rb_cObject);
+ rb_define_alloc_func(rb_klass, rb_allocate);
+ rb_define_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
rb_define_method(rb_klass, "center", RUBY_METHOD_FUNC(rb_center), 0);
+ rb_define_method(rb_klass, "center=", RUBY_METHOD_FUNC(rb_set_center), 1);
rb_define_method(rb_klass, "size", RUBY_METHOD_FUNC(rb_size), 0);
+ rb_define_method(rb_klass, "size=", RUBY_METHOD_FUNC(rb_set_size), 1);
rb_define_method(rb_klass, "angle", RUBY_METHOD_FUNC(rb_angle), 0);
+ rb_define_method(rb_klass, "angle=", RUBY_METHOD_FUNC(rb_set_angle), 1);
rb_define_method(rb_klass, "points", RUBY_METHOD_FUNC(rb_points), 0);
}
@@ -54,7 +59,32 @@ rb_allocate(VALUE klass)
return Data_Make_Struct(klass, CvBox2D, 0, -1, ptr);
}
+/*
+ * call-seq:
+ * CvBox2D.new([center][, size][, angle]) -> cvbox2d
+ *
+ * Create a box
+ */
+VALUE
+rb_initialize(int argc, VALUE *argv, VALUE self)
+{
+ VALUE center, size, angle;
+ rb_scan_args(argc, argv, "03", ¢er, &size, &angle);
+ if (!NIL_P(center))
+ CVBOX2D(self)->center = VALUE_TO_CVPOINT2D32F(center);
+
+ if (!NIL_P(size))
+ CVBOX2D(self)->size = VALUE_TO_CVSIZE2D32F(size);
+
+ if (!NIL_P(size))
+ CVBOX2D(self)->angle = NUM2DBL(angle);
+
+ return self;
+}
+
/*
+ * call-seq:
+ * center -> cvpoint2d32f
* Return center point of box as CvPoint2D32f.
*/
VALUE
@@ -64,6 +94,23 @@ rb_center(VALUE self)
}
/*
+ * call-seq:
+ * center = value
+ *
+ * Set center to value
+ */
+VALUE
+rb_set_center(VALUE self, VALUE value)
+{
+ if (!cCvPoint2D32f::rb_compatible_q(rb_klass, value))
+ rb_raise(rb_eArgError, "object is not compatible %s.", rb_class2name(cCvPoint2D32f::rb_class()));
+ CVBOX2D(self)->center = VALUE_TO_CVPOINT2D32F(value);
+ return self;
+}
+
+/*
+ * call-seq:
+ * size -> cvsize2d32f
* Return size of box as CvSize2D32f.
*/
VALUE
@@ -73,6 +120,24 @@ rb_size(VALUE self)
}
/*
+ * call-seq:
+ * size = value
+ *
+ * Set size to value
+ */
+VALUE
+rb_set_size(VALUE self, VALUE value)
+{
+ if (!cCvSize2D32f::rb_compatible_q(rb_klass, value))
+ rb_raise(rb_eArgError, "object is not compatible %s.", rb_class2name(cCvSize2D32f::rb_class()));
+ CVBOX2D(self)->size = VALUE_TO_CVSIZE2D32F(value);
+ return self;
+}
+
+/*
+ * call-seq:
+ * angle -> float
+ *
* Return angle of box as Float.
*/
VALUE
@@ -82,6 +147,21 @@ rb_angle(VALUE self)
}
/*
+ * call-seq:
+ * angle = value
+ *
+ * Set angle to value
+ */
+VALUE
+rb_set_angle(VALUE self, VALUE value)
+{
+ CVBOX2D(self)->angle = NUM2DBL(value);
+ return self;
+}
+
+/*
+ * call-seq:
+ * points -> array(include cvpoint2d32f)
* Find box vertices. Return Array contain 4 CvPoint2D32f.
*/
VALUE
diff --git a/ext/cvbox2d.h b/ext/cvbox2d.h
index b069ca7..f87ef21 100644
--- a/ext/cvbox2d.h
+++ b/ext/cvbox2d.h
@@ -24,9 +24,13 @@ void define_ruby_class();
VALUE rb_allocate(VALUE klass);
+VALUE rb_initialize(int argc, VALUE *argv, VALUE self);
VALUE rb_center(VALUE self);
+VALUE rb_set_center(VALUE self, VALUE value);
VALUE rb_size(VALUE self);
+VALUE rb_set_size(VALUE self, VALUE value);
VALUE rb_angle(VALUE self);
+VALUE rb_set_angle(VALUE self, VALUE value);
VALUE rb_points(VALUE self);
VALUE new_object();
diff --git a/test/test_cvbox2d.rb b/test/test_cvbox2d.rb
new file mode 100755
index 0000000..17134c3
--- /dev/null
+++ b/test/test_cvbox2d.rb
@@ -0,0 +1,76 @@
+#!/usr/bin/env ruby
+# -*- mode: ruby; coding: utf-8-unix -*-
+require 'test/unit'
+require 'opencv'
+require File.expand_path(File.dirname(__FILE__)) + '/helper'
+
+include OpenCV
+
+# Tests for OpenCV::CvBox2D
+class TestCvBox2D < OpenCVTestCase
+ class MyPoint; end
+ def test_initialize
+ box = CvBox2D.new
+ assert_in_delta(0, box.center.x, 0.001)
+ assert_in_delta(0, box.center.y, 0.001)
+ assert_in_delta(0, box.size.width, 0.001)
+ assert_in_delta(0, box.size.height, 0.001)
+ assert_in_delta(0, box.angle, 0.001)
+
+ box = CvBox2D.new(CvPoint2D32f.new(1.1, 2.2), CvSize2D32f.new(3.3, 4.4), 5.5)
+ assert_in_delta(1.1, box.center.x, 0.001)
+ assert_in_delta(2.2, box.center.y, 0.001)
+ assert_in_delta(3.3, box.size.width, 0.001)
+ assert_in_delta(4.4, box.size.height, 0.001)
+ assert_in_delta(5.5, box.angle, 0.001)
+ end
+
+ def test_center
+ box = CvBox2D.new
+ box.center = CvPoint2D32f.new(1.1, 2.2)
+ assert_in_delta(1.1, box.center.x, 0.001)
+ assert_in_delta(2.2, box.center.y, 0.001)
+
+ box.center.x = 3.3
+ box.center.y = 4.4
+ assert_in_delta(3.3, box.center.x, 0.001)
+ assert_in_delta(4.4, box.center.y, 0.001)
+ end
+
+ def test_size
+ box = CvBox2D.new
+ box.size = CvSize2D32f.new(1.1, 2.2)
+ assert_in_delta(1.1, box.size.width, 0.001)
+ assert_in_delta(2.2, box.size.height, 0.001)
+
+ box.size.width = 3.3
+ box.size.height = 4.4
+ assert_in_delta(3.3, box.size.width, 0.001)
+ assert_in_delta(4.4, box.size.height, 0.001)
+ end
+
+ def test_angle
+ box = CvBox2D.new
+ box.angle = 1.1
+ assert_in_delta(1.1, box.angle, 0.001)
+ end
+
+ def test_points
+ box = CvBox2D.new
+ box.center = CvPoint2D32f.new(10, 20)
+ box.size = CvSize2D32f.new(5, 7)
+ pt = box.points
+
+ assert_equal(4, pt.size)
+ assert_in_delta(7.5, pt[0].x, 0.001)
+ assert_in_delta(23.5, pt[0].y, 0.001)
+ assert_in_delta(7.5, pt[1].x, 0.001)
+ assert_in_delta(16.5, pt[1].y, 0.001)
+ assert_in_delta(12.5, pt[2].x, 0.001)
+ assert_in_delta(16.5, pt[2].y, 0.001)
+ assert_in_delta(12.5, pt[3].x, 0.001)
+ assert_in_delta(23.5, pt[3].y, 0.001)
+ end
+end
+
+