opencv 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. data/History.txt +5 -0
  2. data/License.txt +30 -0
  3. data/Manifest.txt +115 -0
  4. data/README.txt +47 -0
  5. data/Rakefile +34 -0
  6. data/examples/convexhull.rb +41 -0
  7. data/examples/face_detect.rb +25 -0
  8. data/examples/houghcircle.rb +23 -0
  9. data/examples/inpaint.png +0 -0
  10. data/examples/inpaint.rb +43 -0
  11. data/examples/paint.rb +72 -0
  12. data/examples/snake.rb +43 -0
  13. data/examples/stuff.jpg +0 -0
  14. data/ext/curve.cpp +103 -0
  15. data/ext/curve.h +34 -0
  16. data/ext/cvavgcomp.cpp +67 -0
  17. data/ext/cvavgcomp.h +39 -0
  18. data/ext/cvbox2d.cpp +114 -0
  19. data/ext/cvbox2d.h +53 -0
  20. data/ext/cvcapture.cpp +276 -0
  21. data/ext/cvcapture.h +54 -0
  22. data/ext/cvchain.cpp +184 -0
  23. data/ext/cvchain.h +43 -0
  24. data/ext/cvchaincode.cpp +49 -0
  25. data/ext/cvchaincode.h +43 -0
  26. data/ext/cvcircle32f.cpp +90 -0
  27. data/ext/cvcircle32f.h +53 -0
  28. data/ext/cvcondensation.cpp +230 -0
  29. data/ext/cvcondensation.h +49 -0
  30. data/ext/cvconnectedcomp.cpp +115 -0
  31. data/ext/cvconnectedcomp.h +46 -0
  32. data/ext/cvcontour.cpp +219 -0
  33. data/ext/cvcontour.h +47 -0
  34. data/ext/cvcontourtree.cpp +86 -0
  35. data/ext/cvcontourtree.h +41 -0
  36. data/ext/cvconvexitydefect.cpp +103 -0
  37. data/ext/cvconvexitydefect.h +42 -0
  38. data/ext/cverror.cpp +140 -0
  39. data/ext/cverror.h +79 -0
  40. data/ext/cvfont.cpp +173 -0
  41. data/ext/cvfont.h +56 -0
  42. data/ext/cvhaarclassifiercascade.cpp +159 -0
  43. data/ext/cvhaarclassifiercascade.h +41 -0
  44. data/ext/cvhistogram.cpp +200 -0
  45. data/ext/cvhistogram.h +51 -0
  46. data/ext/cvindex.cpp +73 -0
  47. data/ext/cvindex.h +40 -0
  48. data/ext/cvline.cpp +106 -0
  49. data/ext/cvline.h +52 -0
  50. data/ext/cvmat.cpp +4809 -0
  51. data/ext/cvmat.h +286 -0
  52. data/ext/cvmatnd.cpp +44 -0
  53. data/ext/cvmatnd.h +28 -0
  54. data/ext/cvmemstorage.cpp +64 -0
  55. data/ext/cvmemstorage.h +53 -0
  56. data/ext/cvmoments.cpp +204 -0
  57. data/ext/cvmoments.h +48 -0
  58. data/ext/cvpoint.cpp +229 -0
  59. data/ext/cvpoint.h +59 -0
  60. data/ext/cvpoint2d32f.cpp +213 -0
  61. data/ext/cvpoint2d32f.h +61 -0
  62. data/ext/cvpoint3d32f.cpp +245 -0
  63. data/ext/cvpoint3d32f.h +64 -0
  64. data/ext/cvrect.cpp +340 -0
  65. data/ext/cvrect.h +79 -0
  66. data/ext/cvscalar.cpp +227 -0
  67. data/ext/cvscalar.h +63 -0
  68. data/ext/cvseq.cpp +583 -0
  69. data/ext/cvseq.h +71 -0
  70. data/ext/cvset.cpp +63 -0
  71. data/ext/cvset.h +39 -0
  72. data/ext/cvsize.cpp +223 -0
  73. data/ext/cvsize.h +63 -0
  74. data/ext/cvsize2d32f.cpp +180 -0
  75. data/ext/cvsize2d32f.h +59 -0
  76. data/ext/cvslice.cpp +82 -0
  77. data/ext/cvslice.h +53 -0
  78. data/ext/cvsparsemat.cpp +44 -0
  79. data/ext/cvsparsemat.h +28 -0
  80. data/ext/cvtermcriteria.cpp +183 -0
  81. data/ext/cvtermcriteria.h +71 -0
  82. data/ext/cvtwopoints.cpp +98 -0
  83. data/ext/cvtwopoints.h +50 -0
  84. data/ext/cvvector.cpp +206 -0
  85. data/ext/cvvector.h +54 -0
  86. data/ext/cvvideowriter.cpp +116 -0
  87. data/ext/cvvideowriter.h +41 -0
  88. data/ext/extconf.rb +61 -0
  89. data/ext/gui.cpp +65 -0
  90. data/ext/gui.h +33 -0
  91. data/ext/iplconvkernel.cpp +177 -0
  92. data/ext/iplconvkernel.h +52 -0
  93. data/ext/iplimage.cpp +238 -0
  94. data/ext/iplimage.h +54 -0
  95. data/ext/mouseevent.cpp +184 -0
  96. data/ext/mouseevent.h +59 -0
  97. data/ext/opencv.cpp +481 -0
  98. data/ext/opencv.h +356 -0
  99. data/ext/point3dset.cpp +41 -0
  100. data/ext/point3dset.h +31 -0
  101. data/ext/pointset.cpp +238 -0
  102. data/ext/pointset.h +69 -0
  103. data/ext/trackbar.cpp +122 -0
  104. data/ext/trackbar.h +65 -0
  105. data/ext/window.cpp +368 -0
  106. data/ext/window.h +56 -0
  107. data/images/CvMat_sobel.png +0 -0
  108. data/images/CvMat_sub_rect.png +0 -0
  109. data/images/CvSeq_relationmap.png +0 -0
  110. data/images/face_detect_from_lena.jpg +0 -0
  111. data/lib/opencv.rb +3 -0
  112. data/lib/version.rb +3 -0
  113. data/setup/setup.cygwin.rb +120 -0
  114. data/setup/setup.mingw.rb +99 -0
  115. data/setup/setup.mswin32.rb +103 -0
  116. data/test/test_opencv.rb +4 -0
  117. metadata +191 -0
@@ -0,0 +1,69 @@
1
+ /************************************************************
2
+
3
+ pointset.h -
4
+
5
+ $Author: lsxi $
6
+
7
+ Copyright (C) 2005-2006 Masakazu Yonekura
8
+
9
+ ************************************************************/
10
+ #ifndef RUBY_OPENCV_POINTSET_H
11
+ #define RUBY_OPENCV_POINTSET_H
12
+
13
+ #define __NAMESPACE_BEGIN_POINT_SET namespace mPointSet{
14
+ #define __NAMESPACE_END_POINT_SET }
15
+
16
+ #include"opencv.h"
17
+
18
+ __NAMESPACE_BEGIN_OPENCV
19
+ __NAMESPACE_BEGIN_POINT_SET
20
+
21
+ VALUE rb_module();
22
+
23
+ void define_ruby_module();
24
+ VALUE rb_contour_area(int argc, VALUE *argv, VALUE self);
25
+ VALUE rb_fit_ellipse(VALUE self);
26
+ VALUE rb_fit_line(int argc, VALUE *argv, VALUE self);
27
+ VALUE rb_convex_hull(int argc, VALUE *argv, VALUE self);
28
+ VALUE rb_check_contour_convexity(VALUE self);
29
+ VALUE rb_convexity_defects(int argc, VALUE *argv, VALUE self);
30
+ VALUE rb_min_area_rect(VALUE self);
31
+ VALUE rb_min_enclosing_circle(VALUE self);
32
+ VALUE rb_calc_pgh(VALUE self);
33
+
34
+ __NAMESPACE_END_POINT_SET
35
+
36
+ #define POINT_SET_P(object) rb_obj_is_kind_of(object, cCvSeq::rb_class()) && CV_IS_SEQ_POINT_SET(CVSEQ(object))
37
+
38
+ /*
39
+ inline CvPoint*
40
+ POINTSET(VALUE object)
41
+ {
42
+ CvPoint *pointset = (CvPoint*)cvAlloc(CVSEQ(object)->total * sizeof(CvPoint));
43
+ cvCvtSeqToArray(CVSEQ(object), pointset, CV_WHOLE_SEQ);
44
+ if (cCvSeq::seqblock_class(CVSEQ(object)) == cCvPoint2D32f::rb_class()) {
45
+ for(int i =0; i < CVSEQ(object)->total; i++)
46
+ pointset[i] = cvPointFrom32f(((CvPoint2D32f*)pointset)[i]);
47
+ }
48
+ return pointset;
49
+ }
50
+
51
+ inline CvPoint2D32f*
52
+ POINTSET2D32f(VALUE object)
53
+ {
54
+ CvPoint2D32f *pointset = (CvPoint2D32f*)cvAlloc(CVSEQ(object)->total * sizeof(CvPoint2D32f));
55
+ cvCvtSeqToArray(CVSEQ(object), pointset, CV_WHOLE_SEQ);
56
+ if (cCvSeq::seqblock_class(CVSEQ(object)) == cCvPoint::rb_class()) {
57
+ for(int i = 0; i < CVSEQ(object)->total; i++)
58
+ pointset[i] = cvPointTo32f(((CvPoint*)pointset)[i]);
59
+ }
60
+ return pointset;
61
+ }
62
+ */
63
+
64
+ int CVPOINTS_FROM_POINT_SET(VALUE object, CvPoint **pointset);
65
+ CvSeq* VALUE_TO_POINT_SET(VALUE object);
66
+
67
+ __NAMESPACE_END_OPENCV
68
+
69
+ #endif // RUBY_OPENCV_POINTSET_H
@@ -0,0 +1,122 @@
1
+ /************************************************************
2
+
3
+ trackbar.cpp -
4
+
5
+ $Author: lsxi $
6
+
7
+ Copyright (C) 2005 Masakazu Yonekura
8
+
9
+ ************************************************************/
10
+ #ifdef HAVE_CALLBACK_H
11
+
12
+ #include"trackbar.h"
13
+ /*
14
+ * Document-class: OpenCV::GUI::Trackbar
15
+ *
16
+ * Simple Trackbar wedget. OpenCV::GUI::Window can treat trackbar.
17
+ * Trackbar can treat only positive-integer value.
18
+ */
19
+
20
+ __NAMESPACE_BEGIN_OPENCV
21
+ __NAMESPACE_BEGIN_GUI
22
+ __NAMESPACE_BEGIN_TRACKBAR
23
+
24
+ VALUE rb_klass;
25
+
26
+ VALUE rb_class(){
27
+ return rb_klass;
28
+ }
29
+
30
+ void define_ruby_class(){
31
+ if(rb_klass)
32
+ return;
33
+ /*
34
+ * opencv = rb_define_module("OpenCV");
35
+ * GUI = rb_define_module_under(opencv, "GUI");
36
+ *
37
+ * note: this comment is used by rdoc.
38
+ */
39
+ VALUE GUI = rb_module_GUI();
40
+ rb_klass = rb_define_class_under(GUI, "Trackbar", rb_cObject);
41
+ rb_define_alloc_func(rb_klass, rb_allocate);
42
+ rb_define_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
43
+ rb_define_method(rb_klass, "name", RUBY_METHOD_FUNC(rb_name), 0);
44
+ rb_define_method(rb_klass, "max", RUBY_METHOD_FUNC(rb_max), 0);
45
+ rb_define_method(rb_klass, "value", RUBY_METHOD_FUNC(rb_value), 0);
46
+ rb_define_method(rb_klass, "value=", RUBY_METHOD_FUNC(rb_set_value), 1);
47
+ }
48
+
49
+ VALUE rb_allocate(VALUE klass){
50
+ Trackbar *ptr;
51
+ return Data_Make_Struct(klass, Trackbar, mark, free, ptr);
52
+ }
53
+
54
+ void mark(void *ptr){
55
+ rb_gc_mark(((Trackbar*)ptr)->block);
56
+ }
57
+
58
+ void free(void *ptr){
59
+ //::free(((Trackbar*)ptr)->name);
60
+ ::free(ptr);
61
+ }
62
+
63
+ /*
64
+ * call-seq:
65
+ * new(<i>name,maxval[,val],&block</i>)
66
+ * new(<i>name,maxval[,val]</i>){|value| ... }
67
+ *
68
+ * Create new Trackbar.
69
+ * <i>name</i> should be String.
70
+ * <i>maxval</i> and <i>val</i> should be Fixnum.
71
+ * When Trackbar adjuster changed, block will be called.
72
+ */
73
+ VALUE rb_initialize(int argc, VALUE *argv, VALUE self){
74
+ VALUE name, maxval, val, block;
75
+ rb_scan_args(argc, argv, "21&", &name, &maxval, &val, &block);
76
+ if(NIL_P(block)){rb_raise(rb_eArgError, "block not given.");}
77
+ Check_Type(name, T_STRING);
78
+ Trackbar *trackbar = TRACKBAR(self);
79
+ trackbar->name = strcpy(ALLOC_N(char, RSTRING(name)->len), StringValueCStr(name));
80
+ trackbar->maxval = NUM2INT(maxval);
81
+ trackbar->val = IF_INT(val, 0);
82
+ trackbar->block = block;
83
+ return self;
84
+ }
85
+
86
+ /*
87
+ * Return trackbar name.
88
+ */
89
+ VALUE rb_name(VALUE self){
90
+ return rb_str_new2(TRACKBAR(self)->name);
91
+ }
92
+
93
+ /*
94
+ * Return the maximum value that can be taken this trackbar.
95
+ */
96
+ VALUE rb_max(VALUE self){
97
+ return INT2FIX(TRACKBAR(self)->maxval);
98
+ }
99
+
100
+ /*
101
+ * Return the value of this trackbar.
102
+ */
103
+ VALUE rb_value(VALUE self){
104
+ return INT2FIX(TRACKBAR(self)->val);
105
+ }
106
+
107
+ /*
108
+ * call-seq:
109
+ * value = <i>val</i>
110
+ *
111
+ * Set trackbar value.
112
+ */
113
+ VALUE rb_set_value(VALUE self, VALUE val){
114
+ TRACKBAR(self)->val = NUM2INT(val);
115
+ return self;
116
+ }
117
+
118
+ __NAMESPACE_END_TRACKBAR
119
+ __NAMESPACE_END_GUI
120
+ __NAMESPACE_END_OPENCV
121
+
122
+ #endif // HAVE_CALLBACK_H
@@ -0,0 +1,65 @@
1
+ /************************************************************
2
+
3
+ trackbar.h -
4
+
5
+ $Author: lsxi $
6
+
7
+ Copyright (C) 2005 Masakazu Yonekura
8
+
9
+ ************************************************************/
10
+ #ifdef HAVE_CALLBACK_H
11
+
12
+ #ifndef RUBY_OPENCV_GUI_H
13
+ #include "gui.h"
14
+ #endif
15
+
16
+ #ifndef RUBY_OPENCV_GUI_TRACKBAR_H
17
+ #define RUBY_OPENCV_GUI_TRACKBAR_H
18
+
19
+ #include"opencv.h"
20
+
21
+ #define __NAMESPACE_BEGIN_TRACKBAR namespace cTrackbar{
22
+ #define __NAMESPACE_END_TRACKBAR }
23
+
24
+ __NAMESPACE_BEGIN_OPENCV
25
+ __NAMESPACE_BEGIN_GUI
26
+
27
+ typedef struct Trackbar{
28
+ char *name;
29
+ int maxval;
30
+ int val;
31
+ VALUE block;
32
+ }Trackbar;
33
+
34
+ __NAMESPACE_BEGIN_TRACKBAR
35
+
36
+ VALUE rb_class();
37
+
38
+ void define_ruby_class();
39
+ VALUE rb_allocate(VALUE klass);
40
+
41
+ void mark(void *ptr);
42
+ void free(void *ptr);
43
+
44
+ VALUE rb_initialize(int argc, VALUE *argv, VALUE self);
45
+ VALUE rb_name(VALUE self);
46
+ VALUE rb_max(VALUE self);
47
+ VALUE rb_value(VALUE self);
48
+ VALUE rb_set_value(VALUE self, VALUE val);
49
+
50
+ __NAMESPACE_END_TRACKBAR
51
+
52
+
53
+ inline Trackbar *TRACKBAR(VALUE object){
54
+ Trackbar *ptr;
55
+ Data_Get_Struct(object, Trackbar, ptr);
56
+ return ptr;
57
+ }
58
+
59
+ __NAMESPACE_END_GUI
60
+
61
+ __NAMESPACE_END_OPENCV
62
+
63
+ #endif // RUBY_OPENCV_GUI_TRACKBAR_H
64
+
65
+ #endif // HAVE_CALLBACK_H
@@ -0,0 +1,368 @@
1
+ /************************************************************
2
+
3
+ window.cpp -
4
+
5
+ $Author: lsxi $
6
+
7
+ Copyright (C) 2005-2006 Masakazu Yonekura
8
+
9
+ ************************************************************/
10
+ #ifdef HAVE_CALLBACK_H
11
+
12
+ #include "window.h"
13
+ /*
14
+ * Document-class: OpenCV::GUI::Window
15
+ *
16
+ * Simple Window wedget. Window can show image(CvMat/IplImage).
17
+ *
18
+ * view image sample:
19
+ * image = OpenCV::IplImage::load("opencv.bmp") #=> load image
20
+ * window = OpenCV::GUI::Window.new("simple viewer")#=> create new window named "simaple viewer"
21
+ * window.show(image) #=> show image
22
+ */
23
+ __NAMESPACE_BEGIN_OPENCV
24
+ __NAMESPACE_BEGIN_GUI
25
+ __NAMESPACE_BEGIN_WINDOW
26
+
27
+ const char*
28
+ GET_WINDOW_NAME(VALUE object)
29
+ {
30
+ void *handle = DATA_PTR(object);
31
+ if (!handle)
32
+ rb_raise(rb_eStandardError, "window handle error");
33
+ const char *window_name = cvGetWindowName(handle);
34
+ return window_name;
35
+ }
36
+
37
+ st_table *windows = st_init_numtable();
38
+
39
+ VALUE rb_klass;
40
+
41
+ VALUE
42
+ rb_class()
43
+ {
44
+ return rb_klass;
45
+ }
46
+
47
+ void
48
+ define_ruby_class()
49
+ {
50
+ if (rb_klass)
51
+ return;
52
+ /*
53
+ * opencv = rb_define_module("OpenCV");
54
+ * GUI = rb_define_module_under(opencv, "GUI");
55
+ *
56
+ * note: this comment is used by rdoc.
57
+ */
58
+ VALUE GUI = rb_module_GUI();
59
+ rb_klass = rb_define_class_under(GUI, "Window", rb_cObject);
60
+ rb_define_singleton_method(rb_klass, "[]", RUBY_METHOD_FUNC(rb_aref), 1);
61
+ rb_define_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
62
+ rb_define_method(rb_klass, "alive?", RUBY_METHOD_FUNC(rb_alive_q), 0);
63
+ rb_define_method(rb_klass, "destroy", RUBY_METHOD_FUNC(rb_destroy), 0);
64
+ rb_define_singleton_method(rb_klass, "destroy_all", RUBY_METHOD_FUNC(rb_destroy_all), 0);
65
+ rb_define_method(rb_klass, "resize", RUBY_METHOD_FUNC(rb_resize), -1);
66
+ rb_define_method(rb_klass, "move", RUBY_METHOD_FUNC(rb_move), -1);
67
+ rb_define_method(rb_klass, "show_image", RUBY_METHOD_FUNC(rb_show_image), 1);
68
+ rb_define_alias(rb_klass, "show", "show_image");
69
+ rb_define_method(rb_klass, "set_trackbar", RUBY_METHOD_FUNC(rb_set_trackbar), -1);
70
+ rb_define_method(rb_klass, "set_mouse_callback", RUBY_METHOD_FUNC(rb_set_mouse_callback), 0);
71
+ rb_define_alias(rb_klass, "on_mouse", "set_mouse_callback");
72
+ }
73
+
74
+ VALUE
75
+ rb_allocate(VALUE klass)
76
+ {
77
+ return Data_Wrap_Struct(klass, mark, free, 0);
78
+ }
79
+
80
+ void
81
+ mark(void *ptr)
82
+ {
83
+ st_table *holder;
84
+ if (st_lookup(windows, (st_data_t)ptr, (st_data_t*)&holder)) {
85
+ st_foreach(holder, (int (*)(ANYARGS))each_protect, 0);
86
+ }
87
+ }
88
+
89
+ VALUE
90
+ each_protect(VALUE key, VALUE value)
91
+ {
92
+ rb_gc_mark(value);
93
+ return ST_CONTINUE;
94
+ }
95
+
96
+ void
97
+ free(void *ptr)
98
+ {
99
+ cvFree(&ptr);
100
+ }
101
+
102
+ /*
103
+ * call-seq:
104
+ * [<i>name</i>]
105
+ *
106
+ * Return window named <i>name</i> if exist, otherwise nil.
107
+ */
108
+ VALUE
109
+ rb_aref(VALUE klass, VALUE name)
110
+ {
111
+ VALUE window;
112
+ Check_Type(name, T_STRING);
113
+ void *handle = cvGetWindowHandle(StringValueCStr(name));
114
+ st_table *holder;
115
+ if (st_lookup(windows, (st_data_t)handle, (st_data_t*)&holder) &&
116
+ st_lookup(holder, 0, (st_data_t*)&window)) {
117
+ return window;
118
+ }
119
+ return Qnil;
120
+ }
121
+
122
+ /*
123
+ * call-seq:
124
+ * new(<i>name[,autosize]</i>)
125
+ *
126
+ * Create new window named <i>name</i>.
127
+ * If <i>autoresize</i> is true(default), window size automatically resize when image given.
128
+ */
129
+ VALUE
130
+ rb_initialize(int argc, VALUE *argv, VALUE self)
131
+ {
132
+ VALUE name, autosize;
133
+ rb_scan_args(argc, argv, "11", &name, &autosize);
134
+ Check_Type(name, T_STRING);
135
+ int mode;
136
+ if (argc < 2)
137
+ mode = CV_WINDOW_AUTOSIZE;
138
+ else{
139
+ switch (TYPE(autosize)) {
140
+ case T_TRUE:
141
+ mode = CV_WINDOW_AUTOSIZE;
142
+ break;
143
+ case T_FALSE:
144
+ mode = 0;
145
+ break;
146
+ default:
147
+ rb_raise(rb_eTypeError, "argument 2 (auto-size) should be true or false.");
148
+ }
149
+ }
150
+ cvNamedWindow(StringValueCStr(name), mode);
151
+ void *handle = cvGetWindowHandle(StringValueCStr(name));
152
+ if (st_lookup(windows, (st_data_t)handle, 0)) {
153
+ rb_raise(rb_eStandardError, "window name should be unique.");
154
+ }
155
+ DATA_PTR(self) = handle;
156
+ st_table *holder = st_init_numtable();
157
+ st_insert(holder, (st_data_t)0, (st_data_t)self);
158
+ st_insert(windows, (st_data_t)handle, (st_data_t)holder);
159
+ return self;
160
+ }
161
+
162
+ /*
163
+ * Return alive status of window. Return true if alive, otherwise return false.
164
+ */
165
+ VALUE
166
+ rb_alive_q(VALUE self)
167
+ {
168
+ if (st_lookup(windows, (st_data_t)DATA_PTR(self), 0)) {
169
+ return Qtrue;
170
+ }
171
+ return Qfalse;
172
+ }
173
+
174
+ /*
175
+ * Destroys a window. alive status of window be false.
176
+ */
177
+ VALUE
178
+ rb_destroy(VALUE self)
179
+ {
180
+ void *handle = DATA_PTR(self);
181
+ st_table *holder;
182
+ if (st_delete(windows, (st_data_t*)&handle, (st_data_t*)&holder)) {
183
+ st_free_table(holder);
184
+ }
185
+ cvDestroyWindow(GET_WINDOW_NAME(self));
186
+ return self;
187
+ }
188
+
189
+ /*
190
+ * Destorys all the windows.
191
+ */
192
+ VALUE
193
+ rb_destroy_all(VALUE klass)
194
+ {
195
+ st_free_table(windows);
196
+ windows = st_init_numtable();
197
+ cvDestroyAllWindows();
198
+ return Qnil;
199
+ }
200
+
201
+ /*
202
+ * call-seq:
203
+ * resize(<i>size</i>)
204
+ * resize(<i>width, height</i>)
205
+ *
206
+ * Set window size.
207
+ */
208
+ VALUE
209
+ rb_resize(int argc, VALUE *argv, VALUE self)
210
+ {
211
+ CvSize size;
212
+ switch (argc) {
213
+ case 1:
214
+ size = VALUE_TO_CVSIZE(argv[0]);
215
+ break;
216
+ case 2:
217
+ size = cvSize(FIX2INT(argv[0]), FIX2INT(argv[1]));
218
+ break;
219
+ default:
220
+ rb_raise(rb_eArgError, "wrong number of arguments (1 or 2)");
221
+ }
222
+ cvResizeWindow(GET_WINDOW_NAME(self), size.width, size.height);
223
+ return self;
224
+ }
225
+
226
+ /*
227
+ * call-seq:
228
+ * move(<i>point</i>)
229
+ * move(<i>x, y</i>)
230
+ *
231
+ * Set window position.
232
+ */
233
+ VALUE
234
+ rb_move(int argc, VALUE *argv, VALUE self)
235
+ {
236
+ CvPoint point;
237
+ switch (argc) {
238
+ case 1:
239
+ point = VALUE_TO_CVPOINT(argv[0]);
240
+ break;
241
+ case 2:
242
+ point = cvPoint(FIX2INT(argv[0]), FIX2INT(argv[1]));
243
+ break;
244
+ default:
245
+ rb_raise(rb_eArgError, "wrong number of arguments (1 or 2)");
246
+ }
247
+ cvMoveWindow(GET_WINDOW_NAME(self), point.x, point.y);
248
+ return self;
249
+ }
250
+
251
+ /*
252
+ * call-seq:
253
+ * show_image(<i>image</i>)
254
+ *
255
+ * Show the image. If the window was created with <i>autosize</i> = true then the image is shown
256
+ * with its original size, otherwize the image is scaled to fit the window.
257
+ */
258
+ VALUE
259
+ rb_show_image(VALUE self, VALUE image)
260
+ {
261
+ if (!rb_obj_is_kind_of(image, cCvMat::rb_class())) {
262
+ rb_raise(rb_eTypeError, "argument should be %s.", rb_class2name(cCvMat::rb_class()));
263
+ }
264
+ cvShowImage(GET_WINDOW_NAME(self), CVARR(image));
265
+ st_table *holder;
266
+ if (st_lookup(windows, (st_data_t)DATA_PTR(self), (st_data_t*)&holder)) {
267
+ st_insert(holder, cCvMat::rb_class(), image);
268
+ return self;
269
+ }else
270
+ rb_raise(rb_eFatal, "invalid window operation.");
271
+ return self;
272
+ }
273
+
274
+ /*
275
+ * call-seq:
276
+ * set_trackbar(<i>trackbar</i>)
277
+ * set_trackbar(<i>name,maxval[,val],&block</i>)
278
+ * set_trackbar(<i>name,maxval[,val]</i>){|value| ... }
279
+ *
280
+ * Create Trackbar on this window. Return new Trackbar.
281
+ * see Trackbar.new
282
+ */
283
+ VALUE
284
+ rb_set_trackbar(int argc, VALUE *argv, VALUE self)
285
+ {
286
+ VALUE instance;
287
+ if (argc == 1 && rb_obj_is_kind_of(argv[0], cTrackbar::rb_class())) {
288
+ instance = argv[0];
289
+ }else{
290
+ instance = cTrackbar::rb_initialize(argc, argv, cTrackbar::rb_allocate(cTrackbar::rb_class()));
291
+ }
292
+ Trackbar *trackbar = TRACKBAR(instance);
293
+ void *callback = (void *)alloc_callback(&trackbar_callback, trackbar->block);
294
+ cvCreateTrackbar(trackbar->name, GET_WINDOW_NAME(self), &trackbar->val, trackbar->maxval, (CvTrackbarCallback)callback);
295
+ st_table *holder;
296
+ if (st_lookup(windows, (st_data_t)DATA_PTR(self), (st_data_t*)&holder)) {
297
+ st_insert(holder, (st_data_t)&trackbar->name, (st_data_t)instance);
298
+ }
299
+ return instance;
300
+ }
301
+
302
+ /*
303
+ * call-seq:
304
+ * set_mouse_callback(&block)
305
+ * set_mouse_callback{|| ... }
306
+ *
307
+ * Set mouse callback.
308
+ * When the mouse is operated on the window, block will be called.
309
+ * Return Proc object.
310
+ * block given mouse event object, see GUI::Window::MouseEvent
311
+ *
312
+ * e.g. display mouse event on console.
313
+ * window = OpenCV::GUI::Window.new "sample window"
314
+ * image = OpenCV::IplImage::load "sample.png"
315
+ * window.show(image)
316
+ * window.set_mouse_callback{|mouse|
317
+ * e = "#{mouse.x}, #{mouse.y} : #{mouse.event} : "
318
+ * e << "<L>" if mouse.left_button?
319
+ * e << "<R>" if mouse.right_button?
320
+ * e << "<M>" if mouse.middle_button?
321
+ * e << "[CTRL]" if mouse.ctrl_key?
322
+ * e << "[SHIFT]" if mouse.shift_key?
323
+ * e << "[ALT]" if mouse.alt_key?
324
+ * puts e
325
+ * }
326
+ * OpenCV::GUI::wait_key
327
+ */
328
+ VALUE
329
+ rb_set_mouse_callback(VALUE self)
330
+ {
331
+ VALUE block = rb_block_given_p() ? rb_block_proc() : 0;
332
+ if (!block) {rb_raise(rb_eArgError, "block not given.");}
333
+ void *callback = (void *)alloc_callback(&mouse_callback, block);
334
+ cvSetMouseCallback(GET_WINDOW_NAME(self), (CvMouseCallback)callback);
335
+ st_table *holder;
336
+ if (st_lookup(windows, (st_data_t)DATA_PTR(self), (st_data_t*)&holder)) {
337
+ st_insert(holder, rb_cProc, block);
338
+ }else{
339
+ rb_raise(rb_eStandardError, "window is destroied.");
340
+ }
341
+ return block;
342
+ }
343
+
344
+ void
345
+ trackbar_callback(VALUE block, va_alist ap)
346
+ {
347
+ va_start_void(ap);
348
+ rb_funcall(block, rb_intern("call"), 1, INT2FIX(va_arg_int(ap)));
349
+ va_return_void(ap);
350
+ }
351
+
352
+ void
353
+ mouse_callback(VALUE block, va_alist ap)
354
+ {
355
+ va_start_void(ap);
356
+ //VALUE ary = rb_ary_new2(4);
357
+ //for (int i = 0; i < 4; i++)
358
+ // rb_ary_store(ary, i, INT2FIX(va_arg_int(ap)));
359
+ //rb_apply(block, rb_intern("call"), ary);
360
+ rb_funcall(block, rb_intern("call"), 1, cMouseEvent::new_object(va_arg_int(ap),va_arg_int(ap),va_arg_int(ap),va_arg_int(ap)));
361
+ va_return_void(ap);
362
+ }
363
+
364
+ __NAMESPACE_END_WINDOW
365
+ __NAMESPACE_END_GUI
366
+ __NAMESPACE_END_OPENCV
367
+
368
+ #endif // HAVE_CALLBACK_H