jf-ruby-opencv 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +28 -0
  3. data/.yardopts +3 -0
  4. data/DEVELOPERS_NOTE.md +137 -0
  5. data/Gemfile +9 -0
  6. data/History.txt +5 -0
  7. data/License.txt +30 -0
  8. data/Manifest.txt +239 -0
  9. data/README.md +94 -0
  10. data/Rakefile +99 -0
  11. data/config.yml +7 -0
  12. data/examples/alpha_blend.rb +21 -0
  13. data/examples/contours/bitmap-contours-with-labels.png +0 -0
  14. data/examples/contours/bitmap-contours.png +0 -0
  15. data/examples/contours/bounding-box-detect-canny.rb +62 -0
  16. data/examples/contours/contour_retrieval_modes.rb +139 -0
  17. data/examples/contours/rotated-boxes.jpg +0 -0
  18. data/examples/convexhull.rb +47 -0
  19. data/examples/face_detect.rb +20 -0
  20. data/examples/facerec/create_csv.rb +43 -0
  21. data/examples/facerec/facerec_eigenfaces.rb +132 -0
  22. data/examples/facerec/facerec_fisherfaces.rb +131 -0
  23. data/examples/facerec/facerec_lbph.rb +116 -0
  24. data/examples/facerec/readme.md +111 -0
  25. data/examples/find_obj.rb +169 -0
  26. data/examples/houghcircle.rb +22 -0
  27. data/examples/images/box.png +0 -0
  28. data/examples/images/box_in_scene.png +0 -0
  29. data/examples/images/inpaint.png +0 -0
  30. data/examples/images/lena-256x256.jpg +0 -0
  31. data/examples/images/lena-eyes.jpg +0 -0
  32. data/examples/images/lenna-rotated.jpg +0 -0
  33. data/examples/images/lenna.jpg +0 -0
  34. data/examples/images/stuff.jpg +0 -0
  35. data/examples/images/tiffany.jpg +0 -0
  36. data/examples/inpaint.rb +57 -0
  37. data/examples/match_kdtree.rb +88 -0
  38. data/examples/match_template.rb +26 -0
  39. data/examples/paint.rb +70 -0
  40. data/examples/snake.rb +43 -0
  41. data/ext/opencv/algorithm.cpp +291 -0
  42. data/ext/opencv/algorithm.h +38 -0
  43. data/ext/opencv/curve.cpp +127 -0
  44. data/ext/opencv/curve.h +34 -0
  45. data/ext/opencv/cvavgcomp.cpp +64 -0
  46. data/ext/opencv/cvavgcomp.h +39 -0
  47. data/ext/opencv/cvbox2d.cpp +195 -0
  48. data/ext/opencv/cvbox2d.h +61 -0
  49. data/ext/opencv/cvcapture.cpp +633 -0
  50. data/ext/opencv/cvcapture.h +82 -0
  51. data/ext/opencv/cvchain.cpp +233 -0
  52. data/ext/opencv/cvchain.h +46 -0
  53. data/ext/opencv/cvcircle32f.cpp +126 -0
  54. data/ext/opencv/cvcircle32f.h +52 -0
  55. data/ext/opencv/cvconnectedcomp.cpp +156 -0
  56. data/ext/opencv/cvconnectedcomp.h +49 -0
  57. data/ext/opencv/cvcontour.cpp +384 -0
  58. data/ext/opencv/cvcontour.h +51 -0
  59. data/ext/opencv/cvcontourtree.cpp +96 -0
  60. data/ext/opencv/cvcontourtree.h +41 -0
  61. data/ext/opencv/cvconvexitydefect.cpp +92 -0
  62. data/ext/opencv/cvconvexitydefect.h +42 -0
  63. data/ext/opencv/cverror.cpp +115 -0
  64. data/ext/opencv/cverror.h +28 -0
  65. data/ext/opencv/cvfeaturetree.cpp +123 -0
  66. data/ext/opencv/cvfeaturetree.h +55 -0
  67. data/ext/opencv/cvfont.cpp +228 -0
  68. data/ext/opencv/cvfont.h +64 -0
  69. data/ext/opencv/cvhaarclassifiercascade.cpp +148 -0
  70. data/ext/opencv/cvhaarclassifiercascade.h +39 -0
  71. data/ext/opencv/cvhistogram.cpp +717 -0
  72. data/ext/opencv/cvhistogram.h +73 -0
  73. data/ext/opencv/cvhumoments.cpp +178 -0
  74. data/ext/opencv/cvhumoments.h +51 -0
  75. data/ext/opencv/cvline.cpp +159 -0
  76. data/ext/opencv/cvline.h +54 -0
  77. data/ext/opencv/cvmat.cpp +6086 -0
  78. data/ext/opencv/cvmat.h +290 -0
  79. data/ext/opencv/cvmemstorage.cpp +73 -0
  80. data/ext/opencv/cvmemstorage.h +50 -0
  81. data/ext/opencv/cvmoments.cpp +293 -0
  82. data/ext/opencv/cvmoments.h +75 -0
  83. data/ext/opencv/cvpoint.cpp +234 -0
  84. data/ext/opencv/cvpoint.h +64 -0
  85. data/ext/opencv/cvpoint2d32f.cpp +216 -0
  86. data/ext/opencv/cvpoint2d32f.h +63 -0
  87. data/ext/opencv/cvpoint3d32f.cpp +252 -0
  88. data/ext/opencv/cvpoint3d32f.h +66 -0
  89. data/ext/opencv/cvrect.cpp +338 -0
  90. data/ext/opencv/cvrect.h +79 -0
  91. data/ext/opencv/cvscalar.cpp +241 -0
  92. data/ext/opencv/cvscalar.h +71 -0
  93. data/ext/opencv/cvseq.cpp +663 -0
  94. data/ext/opencv/cvseq.h +75 -0
  95. data/ext/opencv/cvsize.cpp +227 -0
  96. data/ext/opencv/cvsize.h +65 -0
  97. data/ext/opencv/cvsize2d32f.cpp +215 -0
  98. data/ext/opencv/cvsize2d32f.h +64 -0
  99. data/ext/opencv/cvslice.cpp +126 -0
  100. data/ext/opencv/cvslice.h +61 -0
  101. data/ext/opencv/cvsurfparams.cpp +208 -0
  102. data/ext/opencv/cvsurfparams.h +58 -0
  103. data/ext/opencv/cvsurfpoint.cpp +246 -0
  104. data/ext/opencv/cvsurfpoint.h +52 -0
  105. data/ext/opencv/cvtermcriteria.cpp +198 -0
  106. data/ext/opencv/cvtermcriteria.h +71 -0
  107. data/ext/opencv/cvtwopoints.cpp +122 -0
  108. data/ext/opencv/cvtwopoints.h +51 -0
  109. data/ext/opencv/cvutils.cpp +192 -0
  110. data/ext/opencv/cvutils.h +30 -0
  111. data/ext/opencv/cvvideowriter.cpp +142 -0
  112. data/ext/opencv/cvvideowriter.h +43 -0
  113. data/ext/opencv/eigenfaces.cpp +75 -0
  114. data/ext/opencv/eigenfaces.h +30 -0
  115. data/ext/opencv/extconf.rb +77 -0
  116. data/ext/opencv/facerecognizer.cpp +219 -0
  117. data/ext/opencv/facerecognizer.h +46 -0
  118. data/ext/opencv/fisherfaces.cpp +75 -0
  119. data/ext/opencv/fisherfaces.h +30 -0
  120. data/ext/opencv/gui.cpp +71 -0
  121. data/ext/opencv/gui.h +30 -0
  122. data/ext/opencv/iplconvkernel.cpp +198 -0
  123. data/ext/opencv/iplconvkernel.h +71 -0
  124. data/ext/opencv/iplimage.cpp +651 -0
  125. data/ext/opencv/iplimage.h +73 -0
  126. data/ext/opencv/lbph.cpp +78 -0
  127. data/ext/opencv/lbph.h +30 -0
  128. data/ext/opencv/mouseevent.cpp +186 -0
  129. data/ext/opencv/mouseevent.h +56 -0
  130. data/ext/opencv/opencv.cpp +819 -0
  131. data/ext/opencv/opencv.h +408 -0
  132. data/ext/opencv/pointset.cpp +280 -0
  133. data/ext/opencv/pointset.h +68 -0
  134. data/ext/opencv/trackbar.cpp +127 -0
  135. data/ext/opencv/trackbar.h +69 -0
  136. data/ext/opencv/window.cpp +377 -0
  137. data/ext/opencv/window.h +66 -0
  138. data/images/CvMat_sobel.png +0 -0
  139. data/images/CvMat_sub_rect.png +0 -0
  140. data/images/CvSeq_relationmap.png +0 -0
  141. data/lib/opencv.rb +12 -0
  142. data/lib/opencv/psyched_yaml.rb +22 -0
  143. data/lib/opencv/version.rb +3 -0
  144. data/ruby-opencv.gemspec +44 -0
  145. data/test/eigenfaces_save.xml +7524 -0
  146. data/test/fisherfaces_save.xml +7530 -0
  147. data/test/helper.rb +167 -0
  148. data/test/lbph_save.xml +4304 -0
  149. data/test/runner.rb +30 -0
  150. data/test/samples/airplane.jpg +0 -0
  151. data/test/samples/baboon.jpg +0 -0
  152. data/test/samples/baboon200.jpg +0 -0
  153. data/test/samples/baboon200_rotated.jpg +0 -0
  154. data/test/samples/blank0.jpg +0 -0
  155. data/test/samples/blank1.jpg +0 -0
  156. data/test/samples/blank2.jpg +0 -0
  157. data/test/samples/blank3.jpg +0 -0
  158. data/test/samples/blank4.jpg +0 -0
  159. data/test/samples/blank5.jpg +0 -0
  160. data/test/samples/blank6.jpg +0 -0
  161. data/test/samples/blank7.jpg +0 -0
  162. data/test/samples/blank8.jpg +0 -0
  163. data/test/samples/blank9.jpg +0 -0
  164. data/test/samples/cat.jpg +0 -0
  165. data/test/samples/chessboard.jpg +0 -0
  166. data/test/samples/contours.jpg +0 -0
  167. data/test/samples/fruits.jpg +0 -0
  168. data/test/samples/haarcascade_frontalface_alt.xml.gz +0 -0
  169. data/test/samples/inpaint-mask.bmp +0 -0
  170. data/test/samples/lena-256x256.jpg +0 -0
  171. data/test/samples/lena-32x32.jpg +0 -0
  172. data/test/samples/lena-eyes.jpg +0 -0
  173. data/test/samples/lena-inpaint.jpg +0 -0
  174. data/test/samples/lena.jpg +0 -0
  175. data/test/samples/lines.jpg +0 -0
  176. data/test/samples/messy0.jpg +0 -0
  177. data/test/samples/messy1.jpg +0 -0
  178. data/test/samples/movie_sample.avi +0 -0
  179. data/test/samples/one_way_train_0000.jpg +0 -0
  180. data/test/samples/one_way_train_0001.jpg +0 -0
  181. data/test/samples/partially_blank0.jpg +0 -0
  182. data/test/samples/partially_blank1.jpg +0 -0
  183. data/test/samples/smooth0.jpg +0 -0
  184. data/test/samples/smooth1.jpg +0 -0
  185. data/test/samples/smooth2.jpg +0 -0
  186. data/test/samples/smooth3.jpg +0 -0
  187. data/test/samples/smooth4.jpg +0 -0
  188. data/test/samples/smooth5.jpg +0 -0
  189. data/test/samples/smooth6.jpg +0 -0
  190. data/test/samples/str-cv-rotated.jpg +0 -0
  191. data/test/samples/str-cv.jpg +0 -0
  192. data/test/samples/str-ov.jpg +0 -0
  193. data/test/samples/stuff.jpg +0 -0
  194. data/test/test_curve.rb +43 -0
  195. data/test/test_cvavgcomp.rb +24 -0
  196. data/test/test_cvbox2d.rb +76 -0
  197. data/test/test_cvcapture.rb +191 -0
  198. data/test/test_cvchain.rb +108 -0
  199. data/test/test_cvcircle32f.rb +41 -0
  200. data/test/test_cvconnectedcomp.rb +61 -0
  201. data/test/test_cvcontour.rb +171 -0
  202. data/test/test_cvcontourtree.rb +43 -0
  203. data/test/test_cverror.rb +50 -0
  204. data/test/test_cvfeaturetree.rb +65 -0
  205. data/test/test_cvfont.rb +58 -0
  206. data/test/test_cvhaarclassifiercascade.rb +63 -0
  207. data/test/test_cvhistogram.rb +271 -0
  208. data/test/test_cvhumoments.rb +83 -0
  209. data/test/test_cvline.rb +50 -0
  210. data/test/test_cvmat.rb +3036 -0
  211. data/test/test_cvmat_drawing.rb +349 -0
  212. data/test/test_cvmat_dxt.rb +150 -0
  213. data/test/test_cvmat_imageprocessing.rb +2085 -0
  214. data/test/test_cvmoments.rb +180 -0
  215. data/test/test_cvpoint.rb +75 -0
  216. data/test/test_cvpoint2d32f.rb +75 -0
  217. data/test/test_cvpoint3d32f.rb +93 -0
  218. data/test/test_cvrect.rb +144 -0
  219. data/test/test_cvscalar.rb +113 -0
  220. data/test/test_cvseq.rb +311 -0
  221. data/test/test_cvsize.rb +75 -0
  222. data/test/test_cvsize2d32f.rb +75 -0
  223. data/test/test_cvslice.rb +31 -0
  224. data/test/test_cvsurfparams.rb +57 -0
  225. data/test/test_cvsurfpoint.rb +66 -0
  226. data/test/test_cvtermcriteria.rb +56 -0
  227. data/test/test_cvtwopoints.rb +40 -0
  228. data/test/test_cvvideowriter.rb +58 -0
  229. data/test/test_eigenfaces.rb +93 -0
  230. data/test/test_fisherfaces.rb +93 -0
  231. data/test/test_iplconvkernel.rb +54 -0
  232. data/test/test_iplimage.rb +232 -0
  233. data/test/test_lbph.rb +166 -0
  234. data/test/test_mouseevent.rb +17 -0
  235. data/test/test_opencv.rb +360 -0
  236. data/test/test_pointset.rb +128 -0
  237. data/test/test_preliminary.rb +130 -0
  238. data/test/test_trackbar.rb +47 -0
  239. data/test/test_window.rb +115 -0
  240. data/yard_extension.rb +5 -0
  241. metadata +352 -0
@@ -0,0 +1,79 @@
1
+ /************************************************************
2
+
3
+ cvrect.h -
4
+
5
+ $Author: lsxi $
6
+
7
+ Copyright (C) 2005-2006 Masakazu Yonekura
8
+
9
+ ************************************************************/
10
+ #ifndef RUBY_OPENCV_CVRECT_H
11
+ #define RUBY_OPENCV_CVRECT_H
12
+
13
+ #include "opencv.h"
14
+
15
+ #define __NAMESPACE_BEGIN_CVRECT namespace cCvRect {
16
+ #define __NAMESPACE_END_CVRECT }
17
+
18
+ __NAMESPACE_BEGIN_OPENCV
19
+ __NAMESPACE_BEGIN_CVRECT
20
+
21
+ VALUE rb_class();
22
+
23
+ void init_ruby_class();
24
+
25
+ VALUE rb_compatible_q(VALUE klass, VALUE object);
26
+ VALUE rb_max_rect(VALUE klass, VALUE rect1, VALUE rect2);
27
+
28
+ VALUE rb_allocate(VALUE klass);
29
+ VALUE rb_initialize(int argc, VALUE *argv, VALUE self);
30
+ VALUE rb_x(VALUE self);
31
+ VALUE rb_set_x(VALUE self, VALUE x);
32
+ VALUE rb_y(VALUE self);
33
+ VALUE rb_set_y(VALUE self, VALUE y);
34
+ VALUE rb_width(VALUE self);
35
+ VALUE rb_set_width(VALUE self, VALUE width);
36
+ VALUE rb_height(VALUE self);
37
+ VALUE rb_set_height(VALUE self, VALUE height);
38
+
39
+ VALUE rb_center(VALUE self);
40
+ VALUE rb_points(VALUE self);
41
+ VALUE rb_top_left(VALUE self);
42
+ VALUE rb_set_top_left(VALUE self, VALUE point);
43
+ VALUE rb_top_right(VALUE self);
44
+ VALUE rb_set_top_right(VALUE self, VALUE point);
45
+ VALUE rb_bottom_left(VALUE self);
46
+ VALUE rb_set_bottom_left(VALUE self, VALUE point);
47
+ VALUE rb_bottom_right(VALUE self);
48
+ VALUE rb_set_bottom_right(VALUE self, VALUE point);
49
+
50
+ VALUE new_object(CvRect rect);
51
+
52
+ __NAMESPACE_END_CVRECT
53
+
54
+ inline CvRect*
55
+ CVRECT(VALUE object)
56
+ {
57
+ CvRect *ptr;
58
+ Data_Get_Struct(object, CvRect, ptr);
59
+ return ptr;
60
+ }
61
+
62
+ inline CvRect
63
+ VALUE_TO_CVRECT(VALUE object)
64
+ {
65
+ if (cCvRect::rb_compatible_q(cCvRect::rb_class(), object)) {
66
+ return cvRect(NUM2INT(rb_funcall(object, rb_intern("x"), 0)),
67
+ NUM2INT(rb_funcall(object, rb_intern("y"), 0)),
68
+ NUM2INT(rb_funcall(object, rb_intern("width"), 0)),
69
+ NUM2INT(rb_funcall(object, rb_intern("height"), 0)));
70
+ }
71
+ else {
72
+ raise_compatible_typeerror(object, cCvRect::rb_class());
73
+ }
74
+ throw "Should never reach here";
75
+ }
76
+
77
+ __NAMESPACE_END_OPENCV
78
+
79
+ #endif // RUBY_OPENCV_CVRECT_H
@@ -0,0 +1,241 @@
1
+ /************************************************************
2
+
3
+ cvscalar.cpp -
4
+
5
+ $Author: lsxi $
6
+
7
+ Copyright (C) 2005 Masakazu Yonekura
8
+
9
+ ************************************************************/
10
+ #include "cvscalar.h"
11
+ /*
12
+ * Document-class: OpenCV::CvScalar
13
+ *
14
+ * Element-value of one pixel.
15
+ * OpenCV supports the image of 4-channels in the maximum.
16
+ * Therefore, CvScalar has 4-values.
17
+ *
18
+ * C structure is here, very simple.
19
+ * typdef struct CvScalar {
20
+ * double val[4];
21
+ * } CvScalar;
22
+ *
23
+ * If obtain CvScalar-object from the method of CvMat(or IplImage),
24
+ * the channel outside the range is obtained as all 0.
25
+ *
26
+ * image = IplImage::load("opencv.jpg") #=> 3-channel 8bit-depth BGR image
27
+ * pixel = image[10, 20] #=> Get pixel value of (10, 20) of image. pixel is CvScalar-object.
28
+ * blue, green, red = pixel[0], pixel[1], pixel[2]
29
+ * # pixel[3] always 0.
30
+ *
31
+ * CvColor is alias of CvScalar.
32
+ */
33
+ __NAMESPACE_BEGIN_OPENCV
34
+ __NAMESPACE_BEGIN_CVSCALAR
35
+
36
+
37
+ VALUE rb_klass;
38
+
39
+ VALUE
40
+ rb_class()
41
+ {
42
+ return rb_klass;
43
+ }
44
+
45
+ VALUE
46
+ rb_allocate(VALUE klass)
47
+ {
48
+ CvScalar *ptr;
49
+ return Data_Make_Struct(klass, CvScalar, 0, -1, ptr);
50
+ }
51
+
52
+ /*
53
+ * call-seq:
54
+ * new([d1][,d2][,d3][,d4])
55
+ *
56
+ * Create new Scalar. Argument should be Integer (or nil as 0).
57
+ */
58
+ VALUE
59
+ rb_initialize(int argc, VALUE *argv, VALUE self)
60
+ {
61
+ VALUE val[4];
62
+ rb_scan_args(argc, argv, "04", &val[0], &val[1], &val[2], &val[3]);
63
+ CvScalar* self_ptr = CVSCALAR(self);
64
+ for (int i = 0; i < 4; ++i) {
65
+ self_ptr->val[i] = NIL_P(val[i]) ? 0 : NUM2DBL(val[i]);
66
+ }
67
+ return self;
68
+ }
69
+
70
+ /*
71
+ * call-seq:
72
+ * [<i>index</i>]
73
+ *
74
+ * Return value of <i>index</i> dimension.
75
+ */
76
+ VALUE
77
+ rb_aref(VALUE self, VALUE index)
78
+ {
79
+ int idx = NUM2INT(index);
80
+ if (idx < 0 || idx >= 4) {
81
+ rb_raise(rb_eIndexError, "scalar index should be 0...4");
82
+ }
83
+ return rb_float_new(CVSCALAR(self)->val[idx]);
84
+ }
85
+
86
+ /*
87
+ * call-seq:
88
+ * [<i>index</i>] = <i>value</i>
89
+ *
90
+ * Set value of <i>index</i> dimension to <i>value</i>
91
+ */
92
+ VALUE
93
+ rb_aset(VALUE self, VALUE index, VALUE value)
94
+ {
95
+ int idx = NUM2INT(index);
96
+ if (idx < 0 || idx >= 4) {
97
+ rb_raise(rb_eIndexError, "scalar index should be 0...4");
98
+ }
99
+ CVSCALAR(self)->val[idx] = NUM2DBL(value);
100
+ return self;
101
+ }
102
+
103
+ /*
104
+ * call-seq:
105
+ * sub(val[,mask])
106
+ *
107
+ * Return new CvScalar if <i>val</i> is CvScalar or compatible object.
108
+ * self[I] - val[I]
109
+ * Or return new CvMat if <i>val</i> is CvMat or subclass.
110
+ */
111
+ VALUE
112
+ rb_sub(int argc, VALUE *argv, VALUE self)
113
+ {
114
+ VALUE val, mask;
115
+ rb_scan_args(argc, argv, "11", &val, &mask);
116
+ if (rb_obj_is_kind_of(val, cCvMat::rb_class())) {
117
+ CvArr *val_ptr = CVARR(val);
118
+ VALUE dest = Qnil;
119
+ try {
120
+ dest = cCvMat::new_object(cvGetSize(val_ptr), cvGetElemType(val_ptr));
121
+ cvSubRS(val_ptr, *CVSCALAR(self), CVARR(dest), MASK(mask));
122
+ }
123
+ catch (cv::Exception& e) {
124
+ raise_cverror(e);
125
+ }
126
+ return dest;
127
+ }
128
+ else {
129
+ CvScalar *src = CVSCALAR(self);
130
+ CvScalar scl = VALUE_TO_CVSCALAR(val);
131
+ return new_object(cvScalar(src->val[0] - scl.val[0],
132
+ src->val[1] - scl.val[1],
133
+ src->val[2] - scl.val[2],
134
+ src->val[3] - scl.val[3]));
135
+ }
136
+ }
137
+
138
+ /*
139
+ * call-seq:
140
+ * to_s -> "<OpeCV::CvScalar:#{self[0]},#{self[1]},#{self[2]},#{self[3]}>"
141
+ *
142
+ * Return values by String.
143
+ */
144
+ VALUE
145
+ rb_to_s(VALUE self)
146
+ {
147
+ const int i = 6;
148
+ VALUE str[i];
149
+ str[0] = rb_str_new2("<%s:%g,%g,%g,%g>");
150
+ str[1] = rb_str_new2(rb_class2name(CLASS_OF(self)));
151
+ str[2] = rb_aref(self, INT2FIX(0));
152
+ str[3] = rb_aref(self, INT2FIX(1));
153
+ str[4] = rb_aref(self, INT2FIX(2));
154
+ str[5] = rb_aref(self, INT2FIX(3));
155
+ return rb_f_sprintf(i, str);
156
+ }
157
+
158
+ /*
159
+ * call-seq:
160
+ * to_ary -> [self[0],self[1],self[2],self[3]]
161
+ *
162
+ * Return values by Array.
163
+ */
164
+ VALUE
165
+ rb_to_ary(VALUE self)
166
+ {
167
+ return rb_ary_new3(4,
168
+ rb_aref(self, INT2FIX(0)),
169
+ rb_aref(self, INT2FIX(1)),
170
+ rb_aref(self, INT2FIX(2)),
171
+ rb_aref(self, INT2FIX(3)));
172
+ }
173
+
174
+ VALUE
175
+ new_object()
176
+ {
177
+ VALUE object = rb_allocate(rb_klass);
178
+ *CVSCALAR(object) = cvScalar(0);
179
+ return object;
180
+ }
181
+
182
+ VALUE
183
+ new_object(CvScalar scalar)
184
+ {
185
+ VALUE object = rb_allocate(rb_klass);
186
+ *CVSCALAR(object) = scalar;
187
+ return object;
188
+ }
189
+
190
+ void
191
+ init_ruby_class()
192
+ {
193
+ #if 0
194
+ // For documentation using YARD
195
+ VALUE opencv = rb_define_module("OpenCV");
196
+ #endif
197
+
198
+ if (rb_klass)
199
+ return;
200
+ /*
201
+ * opencv = rb_define_module("OpenCV");
202
+ *
203
+ * note: this comment is used by rdoc.
204
+ */
205
+ VALUE opencv = rb_module_opencv();
206
+
207
+ rb_klass = rb_define_class_under(opencv, "CvScalar", rb_cObject);
208
+ /* CvScalar: class */
209
+ rb_define_const(opencv, "CvColor", rb_klass);
210
+ rb_define_alloc_func(rb_klass, rb_allocate);
211
+ rb_define_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
212
+ rb_define_method(rb_klass, "[]", RUBY_METHOD_FUNC(rb_aref), 1);
213
+ rb_define_method(rb_klass, "[]=", RUBY_METHOD_FUNC(rb_aset), 2);
214
+ rb_define_method(rb_klass, "sub", RUBY_METHOD_FUNC(rb_sub), -1);
215
+ rb_define_alias(rb_klass, "-", "sub");
216
+
217
+ rb_define_method(rb_klass, "to_s", RUBY_METHOD_FUNC(rb_to_s), 0);
218
+ rb_define_method(rb_klass, "to_ary", RUBY_METHOD_FUNC(rb_to_ary), 0);
219
+ rb_define_alias(rb_klass, "to_a", "to_ary");
220
+
221
+ rb_define_const(rb_klass, "Black", cCvScalar::new_object(cvScalar(0x0,0x0,0x0)));
222
+ rb_define_const(rb_klass, "Silver", cCvScalar::new_object(cvScalar(0x0c,0x0c,0x0c)));
223
+ rb_define_const(rb_klass, "Gray", cCvScalar::new_object(cvScalar(0x80,0x80,0x80)));
224
+ rb_define_const(rb_klass, "White", cCvScalar::new_object(cvScalar(0xff,0xff,0xff)));
225
+ rb_define_const(rb_klass, "Maroon", cCvScalar::new_object(cvScalar(0x0,0x0,0x80)));
226
+ rb_define_const(rb_klass, "Red", cCvScalar::new_object(cvScalar(0x0,0x0,0xff)));
227
+ rb_define_const(rb_klass, "Purple", cCvScalar::new_object(cvScalar(0x80,0x0,0x80)));
228
+ rb_define_const(rb_klass, "Fuchsia", cCvScalar::new_object(cvScalar(0xff,0x0,0xff)));
229
+ rb_define_const(rb_klass, "Green", cCvScalar::new_object(cvScalar(0x0,0x80,0x0)));
230
+ rb_define_const(rb_klass, "Lime", cCvScalar::new_object(cvScalar(0x0,0xff,0x0)));
231
+ rb_define_const(rb_klass, "Olive", cCvScalar::new_object(cvScalar(0x0,0x80,0x80)));
232
+ rb_define_const(rb_klass, "Yellow", cCvScalar::new_object(cvScalar(0x0,0xff,0xff)));
233
+ rb_define_const(rb_klass, "Navy", cCvScalar::new_object(cvScalar(0x80,0x0,0x0)));
234
+ rb_define_const(rb_klass, "Blue", cCvScalar::new_object(cvScalar(0xff,0x0,0x0)));
235
+ rb_define_const(rb_klass, "Teal", cCvScalar::new_object(cvScalar(0x80,0x80,0x0)));
236
+ rb_define_const(rb_klass, "Aqua", cCvScalar::new_object(cvScalar(0xff,0xff,0x0)));
237
+ }
238
+
239
+ __NAMESPACE_END_CVSCALAR
240
+ __NAMESPACE_END_OPENCV
241
+
@@ -0,0 +1,71 @@
1
+ /************************************************************
2
+
3
+ cvscalar.h -
4
+
5
+ $Author: lsxi $
6
+
7
+ Copyright (C) 2005 Masakazu Yonekura
8
+
9
+ ************************************************************/
10
+ #ifndef RUBY_OPENCV_CVSCALAR_H
11
+ #define RUBY_OPENCV_CVSCALAR_H
12
+
13
+ #include "opencv.h"
14
+
15
+ #define __NAMESPACE_BEGIN_CVSCALAR namespace cCvScalar {
16
+ #define __NAMESPACE_END_CVSCALAR }
17
+
18
+ __NAMESPACE_BEGIN_OPENCV
19
+ __NAMESPACE_BEGIN_CVSCALAR
20
+
21
+ VALUE rb_class();
22
+
23
+ void init_ruby_class();
24
+
25
+ VALUE rb_compatible_q(VALUE klass, VALUE object);
26
+
27
+ VALUE rb_allocate(VALUE klass);
28
+ VALUE rb_initialize(int argc, VALUE *argv, VALUE self);
29
+
30
+ VALUE rb_aref(VALUE self, VALUE index);
31
+ VALUE rb_aset(VALUE self, VALUE index, VALUE value);
32
+ VALUE rb_sub(int argc, VALUE *argv, VALUE self);
33
+
34
+ VALUE rb_to_s(VALUE self);
35
+ VALUE rb_to_ary(VALUE self);
36
+
37
+ VALUE new_object();
38
+ VALUE new_object(CvScalar scalar);
39
+
40
+ __NAMESPACE_END_CVSCALAR
41
+
42
+ inline CvScalar*
43
+ CVSCALAR(VALUE object)
44
+ {
45
+ CvScalar *ptr;
46
+ Data_Get_Struct(object, CvScalar, ptr);
47
+ return ptr;
48
+ }
49
+
50
+ inline CvScalar
51
+ VALUE_TO_CVSCALAR(VALUE object)
52
+ {
53
+ ID aref_id;
54
+ if (FIXNUM_P(object)) {
55
+ return cvScalarAll(FIX2INT(object));
56
+ }
57
+ else if (rb_respond_to(object, (aref_id = rb_intern("[]")))) {
58
+ return cvScalar(NUM2DBL(rb_funcall(object, aref_id, 1, INT2FIX(0))),
59
+ NUM2DBL(rb_funcall(object, aref_id, 1, INT2FIX(1))),
60
+ NUM2DBL(rb_funcall(object, aref_id, 1, INT2FIX(2))),
61
+ NUM2DBL(rb_funcall(object, aref_id, 1, INT2FIX(3))));
62
+ }
63
+ else {
64
+ raise_compatible_typeerror(object, cCvScalar::rb_class());
65
+ }
66
+ throw "Should never reach here";
67
+ }
68
+
69
+ __NAMESPACE_END_OPENCV
70
+
71
+ #endif // RUBY_OPENCV_CVSCALAR_H
@@ -0,0 +1,663 @@
1
+ /************************************************************
2
+
3
+ cvseq.cpp -
4
+
5
+ $Author: lsxi $
6
+
7
+ Copyright (C) 2005-2006 Masakazu Yonekura
8
+
9
+ ************************************************************/
10
+ #include "cvseq.h"
11
+ /*
12
+ * Document-class: OpenCV::CvSeq
13
+ */
14
+ __NAMESPACE_BEGIN_OPENCV
15
+ __NAMESPACE_BEGIN_CVSEQ
16
+
17
+ VALUE rb_allocate(VALUE klass);
18
+ void cvseq_free(void *ptr);
19
+
20
+ VALUE rb_klass;
21
+ // contain sequence-block class
22
+ st_table *seqblock_klass_table = st_init_numtable();
23
+
24
+ VALUE
25
+ rb_class()
26
+ {
27
+ return rb_klass;
28
+ }
29
+
30
+ int
31
+ eltype2class(int eltype, VALUE* ret) {
32
+ int found = 1;
33
+
34
+ switch (eltype) {
35
+ case CV_SEQ_ELTYPE_POINT:
36
+ *ret = cCvPoint::rb_class();
37
+ break;
38
+ case CV_32FC2:
39
+ *ret = cCvPoint2D32f::rb_class();
40
+ break;
41
+ case CV_SEQ_ELTYPE_POINT3D:
42
+ *ret = cCvPoint3D32f::rb_class();
43
+ break;
44
+ case CV_SEQ_ELTYPE_CODE:
45
+ case CV_SEQ_ELTYPE_INDEX:
46
+ *ret = rb_cInteger;
47
+ break;
48
+ case CV_SEQ_ELTYPE_PPOINT: // or CV_SEQ_ELTYPE_PTR:
49
+ // Not supported
50
+ rb_raise(rb_eArgError, "seq_flags %d is not supported.", eltype);
51
+ break;
52
+ default:
53
+ found = 0;
54
+ *ret = cCvPoint::rb_class();
55
+ break;
56
+ }
57
+
58
+ return found;
59
+ }
60
+
61
+ VALUE
62
+ seqblock_class(void *ptr)
63
+ {
64
+ VALUE klass = Qnil;
65
+ if (st_lookup(seqblock_klass_table, (st_data_t)ptr, (st_data_t*)&klass)) {
66
+ return klass;
67
+ }
68
+
69
+ int eltype = CV_SEQ_ELTYPE((CvSeq*)ptr);
70
+ eltype2class(eltype, &klass);
71
+
72
+ return klass;
73
+ }
74
+
75
+ void
76
+ register_elem_class(CvSeq *seq, VALUE klass)
77
+ {
78
+ st_insert(seqblock_klass_table, (st_data_t)seq, (st_data_t)klass);
79
+ }
80
+
81
+ void
82
+ unregister_elem_class(void *ptr)
83
+ {
84
+ if (ptr) {
85
+ st_delete(seqblock_klass_table, (st_data_t*)&ptr, NULL);
86
+ unregister_object(ptr);
87
+ }
88
+ }
89
+
90
+ VALUE
91
+ rb_allocate(VALUE klass)
92
+ {
93
+ CvSeq *ptr = ALLOC(CvSeq);
94
+ return Data_Wrap_Struct(klass, mark_root_object, unregister_elem_class, ptr);
95
+ }
96
+
97
+ CvSeq*
98
+ create_seq(int seq_flags, size_t header_size, VALUE storage_value)
99
+ {
100
+ VALUE klass = Qnil;
101
+ int eltype = seq_flags & CV_SEQ_ELTYPE_MASK;
102
+ storage_value = CHECK_CVMEMSTORAGE(storage_value);
103
+
104
+ if (!eltype2class(eltype, &klass)) {
105
+ seq_flags = CV_SEQ_ELTYPE_POINT | CV_SEQ_KIND_GENERIC;
106
+ }
107
+
108
+ int mat_type = CV_MAT_TYPE(seq_flags);
109
+ size_t elem_size = (size_t)(CV_ELEM_SIZE(mat_type));
110
+ CvSeq* seq = NULL;
111
+ try {
112
+ seq = cvCreateSeq(seq_flags, header_size, elem_size, CVMEMSTORAGE(storage_value));
113
+ }
114
+ catch (cv::Exception& e) {
115
+ raise_cverror(e);
116
+ }
117
+ register_elem_class(seq, klass);
118
+ register_root_object(seq, storage_value);
119
+
120
+ return seq;
121
+ }
122
+
123
+ VALUE
124
+ class2seq_flags_value(VALUE klass) {
125
+ int seq_flags;
126
+ if (klass == cCvPoint::rb_class()) {
127
+ seq_flags = CV_SEQ_ELTYPE_POINT;
128
+ }
129
+ else if (klass == cCvPoint2D32f::rb_class()) {
130
+ seq_flags = CV_32FC2;
131
+ }
132
+ else if (klass == cCvPoint3D32f::rb_class()) {
133
+ seq_flags = CV_SEQ_ELTYPE_POINT3D;
134
+ }
135
+ else if (klass == rb_cInteger) {
136
+ seq_flags = CV_SEQ_ELTYPE_INDEX;
137
+ }
138
+ else {
139
+ rb_raise(rb_eTypeError, "unexpected type: %s", rb_class2name(klass));
140
+ }
141
+
142
+ return INT2NUM(seq_flags | CV_SEQ_KIND_GENERIC);
143
+ }
144
+
145
+ /*
146
+ * Constructor
147
+ *
148
+ * @overload new(seq_flags, storage = nil)
149
+ * @param [Integer] seq_flags Flags of the created sequence, which are combinations of
150
+ * the element types and sequence types.
151
+ * - Element type:
152
+ * - <tt>CV_SEQ_ELTYPE_POINT</tt>: {CvPoint}
153
+ * - <tt>CV_32FC2</tt>: {CvPoint2D32f}
154
+ * - <tt>CV_SEQ_ELTYPE_POINT3D</tt>: {CvPoint3D32f}
155
+ * - <tt>CV_SEQ_ELTYPE_INDEX</tt>: Integer
156
+ * - <tt>CV_SEQ_ELTYPE_CODE</tt>: Integer (Freeman code)
157
+ * - Sequence type:
158
+ * - <tt>CV_SEQ_KIND_GENERIC</tt>: Generic sequence
159
+ * - <tt>CV_SEQ_KIND_CURVE</tt>: Curve
160
+ * @param [CvMemStorage] storage Sequence location
161
+ * @return [CvSeq] self
162
+ * @opencv_func cvCreateSeq
163
+ * @example
164
+ * seq1 = CvSeq.new(CV_SEQ_ELTYPE_INDEX)
165
+ * seq1 << 1
166
+ * seq1 << CvPoint.new(1, 2) #=> TypeError
167
+ *
168
+ * seq2 = CvSeq.new(CV_SEQ_ELTYPE_POINT | CV_SEQ_KIND_CURVE)
169
+ * seq2 << CvPoint.new(1, 2)
170
+ * seq2 << 3 #=> TypeError
171
+ */
172
+ VALUE
173
+ rb_initialize(int argc, VALUE *argv, VALUE self)
174
+ {
175
+ VALUE seq_flags_value, storage_value;
176
+ rb_scan_args(argc, argv, "11", &seq_flags_value, &storage_value);
177
+ int seq_flags = 0;
178
+
179
+ if (TYPE(seq_flags_value) == T_CLASS) { // To maintain backward compatibility
180
+ seq_flags_value = class2seq_flags_value(seq_flags_value);
181
+ }
182
+ Check_Type(seq_flags_value, T_FIXNUM);
183
+ seq_flags = FIX2INT(seq_flags_value);
184
+
185
+ DATA_PTR(self) = create_seq(seq_flags, sizeof(CvSeq), storage_value);
186
+
187
+ return self;
188
+ }
189
+
190
+ /*
191
+ * call-seq:
192
+ * total -> int
193
+ *
194
+ * Return total number of sequence-block.
195
+ */
196
+ VALUE
197
+ rb_total(VALUE self)
198
+ {
199
+ return INT2NUM(CVSEQ(self)->total);
200
+ }
201
+
202
+ /*
203
+ * call-seq:
204
+ * empty? -> true or false.
205
+ *
206
+ * Return <tt>true</tt> if contain no object, otherwize return <tt>false</tt>.
207
+ */
208
+ VALUE
209
+ rb_empty_q(VALUE self)
210
+ {
211
+ return CVSEQ(self)->total == 0 ? Qtrue : Qfalse;
212
+ }
213
+
214
+ /*
215
+ * call-seq:
216
+ * [<i>index</i>] -> obj or nil
217
+ *
218
+ * Return sequence-block at <i>index</i>.
219
+ */
220
+ VALUE
221
+ rb_aref(VALUE self, VALUE index)
222
+ {
223
+ CvSeq *seq = CVSEQ(self);
224
+ int idx = NUM2INT(index);
225
+ if (seq->total == 0) {
226
+ return Qnil;
227
+ }
228
+ if (idx >= seq->total) {
229
+ rb_raise(rb_eIndexError, "index %d out of sequence", idx);
230
+ }
231
+
232
+ VALUE result = Qnil;
233
+ try {
234
+ VALUE klass = seqblock_class(seq);
235
+ if (RTEST(rb_class_inherited_p(klass, rb_cInteger))) {
236
+ result = INT2NUM(*CV_GET_SEQ_ELEM(int, seq, idx));
237
+ }
238
+ else {
239
+ result = REFER_OBJECT(klass, cvGetSeqElem(seq, idx), self);
240
+ }
241
+ }
242
+ catch (cv::Exception& e) {
243
+ raise_cverror(e);
244
+ }
245
+ return result;
246
+ }
247
+
248
+ /*
249
+ * call-seq:
250
+ * first -> obj or nil
251
+ *
252
+ * Return first sequence-block.
253
+ */
254
+ VALUE
255
+ rb_first(VALUE self)
256
+ {
257
+ return rb_aref(self, INT2FIX(0));
258
+ }
259
+
260
+ /*
261
+ * call-seq:
262
+ * last -> obj or nil
263
+ *
264
+ * Return last sequence-block.
265
+ */
266
+ VALUE
267
+ rb_last(VALUE self)
268
+ {
269
+ return rb_aref(self, INT2FIX(-1));
270
+ }
271
+
272
+ /*
273
+ * call-seq:
274
+ * h_prev -> seq or nil
275
+ *
276
+ * Return the sequence horizontally located in previous.
277
+ * Return <tt>nil</tt> if not existing.
278
+ */
279
+ VALUE
280
+ rb_h_prev(VALUE self)
281
+ {
282
+ CvSeq *seq = CVSEQ(self);
283
+ if (seq->h_prev)
284
+ return new_sequence(CLASS_OF(self), seq->h_prev, seqblock_class(seq), lookup_root_object(seq));
285
+ else
286
+ return Qnil;
287
+ }
288
+
289
+ /*
290
+ * call-seq:
291
+ * h_next -> seq or nil
292
+ *
293
+ * Return the sequence horizontally located in next.
294
+ * Return <tt>nil</tt> if not existing.
295
+ */
296
+ VALUE
297
+ rb_h_next(VALUE self)
298
+ {
299
+ CvSeq *seq = CVSEQ(self);
300
+ if (seq->h_next)
301
+ return new_sequence(CLASS_OF(self), seq->h_next, seqblock_class(seq), lookup_root_object(seq));
302
+ else
303
+ return Qnil;
304
+ }
305
+
306
+ /*
307
+ * call-seq:
308
+ * v_prev -> seq or nil
309
+ *
310
+ * Return the sequence vertically located in previous.
311
+ * Return <tt>nil</tt> if not existing.
312
+ */
313
+ VALUE
314
+ rb_v_prev(VALUE self)
315
+ {
316
+ CvSeq *seq = CVSEQ(self);
317
+ if (seq->v_prev)
318
+ return new_sequence(CLASS_OF(self), seq->v_prev, seqblock_class(seq), lookup_root_object(seq));
319
+ else
320
+ return Qnil;
321
+ }
322
+
323
+ /*
324
+ * call-seq:
325
+ * v_next -> seq or nil
326
+ *
327
+ * Return the sequence vertically located in next.
328
+ * Return <tt>nil</tt> if not existing.
329
+ */
330
+ VALUE
331
+ rb_v_next(VALUE self)
332
+ {
333
+ CvSeq *seq = CVSEQ(self);
334
+ if (seq->v_next)
335
+ return new_sequence(CLASS_OF(self), seq->v_next, seqblock_class(seq), lookup_root_object(seq));
336
+ else
337
+ return Qnil;
338
+ }
339
+
340
+ VALUE
341
+ rb_seq_push(VALUE self, VALUE args, int flag)
342
+ {
343
+ CvSeq *seq = CVSEQ(self);
344
+ VALUE klass = seqblock_class(seq);
345
+ volatile void *elem = NULL;
346
+ int len = RARRAY_LEN(args);
347
+ for (int i = 0; i < len; i++) {
348
+ VALUE object = RARRAY_PTR(args)[i];
349
+ if (rb_obj_is_kind_of(object, klass)) {
350
+ if (rb_obj_is_kind_of(object, rb_cInteger)) {
351
+ volatile int int_elem = NUM2INT(object);
352
+ elem = &int_elem;
353
+ }
354
+ else if (rb_obj_is_kind_of(object, rb_cNumeric)) {
355
+ volatile double double_elem = NUM2DBL(object);
356
+ elem = &double_elem;
357
+ }
358
+ else {
359
+ elem = (void*)DATA_PTR(object);
360
+ }
361
+ try {
362
+ if (flag == CV_FRONT)
363
+ cvSeqPushFront(seq, (const void*)elem);
364
+ else
365
+ cvSeqPush(seq, (const void*)elem);
366
+ }
367
+ catch (cv::Exception& e) {
368
+ raise_cverror(e);
369
+ }
370
+ }
371
+ else if ((rb_obj_is_kind_of(object, rb_klass) == Qtrue) &&
372
+ RTEST(rb_class_inherited_p(seqblock_class(CVSEQ(object)), klass))) { // object is CvSeq
373
+ void *buffer = NULL;
374
+ try {
375
+ buffer = cvCvtSeqToArray(CVSEQ(object), rb_cvAlloc(CVSEQ(object)->total * CVSEQ(object)->elem_size));
376
+ cvSeqPushMulti(seq, buffer, CVSEQ(object)->total, flag);
377
+ cvFree(&buffer);
378
+ }
379
+ catch (cv::Exception& e) {
380
+ if (buffer != NULL)
381
+ cvFree(&buffer);
382
+ raise_cverror(e);
383
+ }
384
+ }
385
+ else {
386
+ rb_raise(rb_eTypeError, "arguments should be %s or %s which includes %s.",
387
+ rb_class2name(klass), rb_class2name(rb_klass), rb_class2name(klass));
388
+ }
389
+ }
390
+
391
+ return self;
392
+ }
393
+
394
+ /*
395
+ * call-seq:
396
+ * push(obj, ...) -> self
397
+ *
398
+ * Append - Pushes the given object(s) on the end of this sequence. This expression return the sequence itself,
399
+ * so several append may be chained together.
400
+ */
401
+ VALUE
402
+ rb_push(VALUE self, VALUE args)
403
+ {
404
+ return rb_seq_push(self, args, CV_BACK);
405
+ }
406
+
407
+ /*
408
+ * call-seq:
409
+ * pop -> obj or nil
410
+ *
411
+ * Remove the last sequence-block from <i>self</i> and return it,
412
+ * or <tt>nil</tt> if the sequence is empty.
413
+ */
414
+ VALUE
415
+ rb_pop(VALUE self)
416
+ {
417
+ CvSeq *seq = CVSEQ(self);
418
+ if (seq->total == 0)
419
+ return Qnil;
420
+
421
+ VALUE object = Qnil;
422
+ VALUE klass = seqblock_class(seq);
423
+ try {
424
+ if (klass == rb_cInteger) {
425
+ int n = 0;
426
+ cvSeqPop(seq, &n);
427
+ object = INT2FIX(n);
428
+ }
429
+ else {
430
+ object = GENERIC_OBJECT(klass, malloc(seq->elem_size));
431
+ cvSeqPop(seq, DATA_PTR(object));
432
+ }
433
+ }
434
+ catch (cv::Exception& e) {
435
+ raise_cverror(e);
436
+ }
437
+ return object;
438
+ }
439
+
440
+ /*
441
+ * call-seq:
442
+ * clear -> self
443
+ *
444
+ * Clears sequence. Removes all elements from the sequence.
445
+ */
446
+ VALUE
447
+ rb_clear(VALUE self)
448
+ {
449
+ try {
450
+ cvClearSeq(CVSEQ(self));
451
+ }
452
+ catch (cv::Exception& e) {
453
+ raise_cverror(e);
454
+ }
455
+ return self;
456
+ }
457
+
458
+ /*
459
+ * call-seq:
460
+ * unshift -> self
461
+ *
462
+ * Prepends objects to the front of sequence. other elements up one.
463
+ */
464
+ VALUE
465
+ rb_unshift(VALUE self, VALUE args)
466
+ {
467
+ VALUE result = Qnil;
468
+ try {
469
+ result = rb_seq_push(self, args, CV_FRONT);
470
+ }
471
+ catch (cv::Exception& e) {
472
+ raise_cverror(e);
473
+ }
474
+ return result;
475
+ }
476
+
477
+ /*
478
+ * call-seq:
479
+ * shift -> obj or nil
480
+ *
481
+ * Returns the first element of <i>self</i> and removes it (shifting all other elements down by one). Returns <tt>nil</tt> if the array is empty.
482
+ */
483
+ VALUE
484
+ rb_shift(VALUE self)
485
+ {
486
+ CvSeq *seq = CVSEQ(self);
487
+ if (seq->total == 0)
488
+ return Qnil;
489
+
490
+ VALUE object = Qnil;
491
+ try {
492
+ if (seqblock_class(seq) == rb_cInteger) {
493
+ int n = 0;
494
+ cvSeqPopFront(seq, &n);
495
+ object = INT2NUM(n);
496
+ }
497
+ else {
498
+ object = GENERIC_OBJECT(seqblock_class(seq), malloc(seq->elem_size));
499
+ cvSeqPopFront(seq, DATA_PTR(object));
500
+ }
501
+ }
502
+ catch (cv::Exception& e) {
503
+ raise_cverror(e);
504
+ }
505
+
506
+ return object;
507
+ }
508
+
509
+ /*
510
+ * call-seq:
511
+ * each {|obj| ... } -> self
512
+ *
513
+ * Calls block once for each sequence-block in <i>self</i>,
514
+ * passing that sequence-block as a parameter.
515
+ * seq = CvSeq.new(CvIndex)
516
+ * seq.push(5, 6, 7)
517
+ * seq.each {|x| print x, " -- " }
518
+ * produces:
519
+ * 5 -- 6 -- 7 --
520
+ */
521
+ VALUE
522
+ rb_each(VALUE self)
523
+ {
524
+ CvSeq *seq = CVSEQ(self);
525
+ if (seq->total > 0) {
526
+ VALUE klass = seqblock_class(seq);
527
+ try {
528
+ if (klass == rb_cInteger)
529
+ for (int i = 0; i < seq->total; ++i)
530
+ rb_yield(INT2NUM(*CV_GET_SEQ_ELEM(int, seq, i)));
531
+ else
532
+ for (int i = 0; i < seq->total; ++i)
533
+ rb_yield(REFER_OBJECT(klass, cvGetSeqElem(seq, i), self));
534
+ }
535
+ catch (cv::Exception& e) {
536
+ raise_cverror(e);
537
+ }
538
+ }
539
+ return self;
540
+ }
541
+
542
+ /*
543
+ * call-seq:
544
+ * each_index {|index| ... } -> self
545
+ *
546
+ * Same as CvSeq#each, but passes the index of the element instead of the element itself.
547
+ */
548
+ VALUE
549
+ rb_each_index(VALUE self)
550
+ {
551
+ CvSeq *seq = CVSEQ(self);
552
+ for(int i = 0; i < seq->total; ++i)
553
+ rb_yield(INT2NUM(i));
554
+ return self;
555
+ }
556
+
557
+
558
+ /*
559
+ * call-seq:
560
+ * insert(index,obj) -> self
561
+ *
562
+ * Inserts the given values before element with the given index (which may be negative).
563
+ */
564
+ VALUE
565
+ rb_insert(VALUE self, VALUE index, VALUE object)
566
+ {
567
+ Check_Type(index, T_FIXNUM);
568
+ CvSeq *seq = CVSEQ(self);
569
+ VALUE klass = seqblock_class(seq);
570
+ if (!rb_obj_is_kind_of(object, klass))
571
+ rb_raise(rb_eTypeError, "arguments should be %s.", rb_class2name(klass));
572
+ try {
573
+ if (klass == rb_cInteger) {
574
+ int n = NUM2INT(object);
575
+ cvSeqInsert(seq, NUM2INT(index), &n);
576
+ }
577
+ else
578
+ cvSeqInsert(seq, NUM2INT(index), DATA_PTR(object));
579
+ }
580
+ catch (cv::Exception& e) {
581
+ raise_cverror(e);
582
+ }
583
+ return self;
584
+ }
585
+
586
+ /*
587
+ * call-seq:
588
+ * remove(index) -> obj or nil
589
+ *
590
+ * Deletes the elements at the specified index.
591
+ */
592
+ VALUE
593
+ rb_remove(VALUE self, VALUE index)
594
+ {
595
+ try {
596
+ cvSeqRemove(CVSEQ(self), NUM2INT(index));
597
+ }
598
+ catch (cv::Exception& e) {
599
+ raise_cverror(e);
600
+ }
601
+ return self;
602
+ }
603
+
604
+ VALUE
605
+ new_sequence(VALUE klass, CvSeq *seq, VALUE element_klass, VALUE storage)
606
+ {
607
+ register_root_object(seq, storage);
608
+ if (!NIL_P(element_klass))
609
+ register_elem_class(seq, element_klass);
610
+ return Data_Wrap_Struct(klass, mark_root_object, unregister_elem_class, seq);
611
+ }
612
+
613
+ void
614
+ init_ruby_class()
615
+ {
616
+ #if 0
617
+ // For documentation using YARD
618
+ VALUE opencv = rb_define_module("OpenCV");
619
+ #endif
620
+
621
+ if (rb_klass)
622
+ return;
623
+ /*
624
+ * opencv = rb_define_module("OpenCV");
625
+ *
626
+ * note: this comment is used by rdoc.
627
+ */
628
+ VALUE opencv = rb_module_opencv();
629
+ rb_klass = rb_define_class_under(opencv, "CvSeq", rb_cObject);
630
+ rb_include_module(rb_klass, rb_mEnumerable);
631
+ rb_define_alloc_func(rb_klass, rb_allocate);
632
+ rb_define_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
633
+ rb_define_method(rb_klass, "total", RUBY_METHOD_FUNC(rb_total), 0);
634
+ rb_define_alias(rb_klass, "length", "total");
635
+ rb_define_alias(rb_klass, "size", "total");
636
+ rb_define_method(rb_klass, "empty?", RUBY_METHOD_FUNC(rb_empty_q), 0);
637
+ rb_define_method(rb_klass, "[]", RUBY_METHOD_FUNC(rb_aref), 1);
638
+ rb_define_method(rb_klass, "first", RUBY_METHOD_FUNC(rb_first), 0);
639
+ rb_define_method(rb_klass, "last", RUBY_METHOD_FUNC(rb_last), 0);
640
+
641
+ rb_define_method(rb_klass, "h_prev", RUBY_METHOD_FUNC(rb_h_prev), 0);
642
+ rb_define_method(rb_klass, "h_next", RUBY_METHOD_FUNC(rb_h_next), 0);
643
+ rb_define_method(rb_klass, "v_prev", RUBY_METHOD_FUNC(rb_v_prev), 0);
644
+ rb_define_method(rb_klass, "v_next", RUBY_METHOD_FUNC(rb_v_next), 0);
645
+
646
+ rb_define_method(rb_klass, "push", RUBY_METHOD_FUNC(rb_push), -2);
647
+ rb_define_alias(rb_klass, "<<", "push");
648
+ rb_define_method(rb_klass, "pop", RUBY_METHOD_FUNC(rb_pop), 0);
649
+ rb_define_method(rb_klass, "unshift", RUBY_METHOD_FUNC(rb_unshift), -2);
650
+ rb_define_alias(rb_klass, "push_front", "unshift");
651
+ rb_define_method(rb_klass, "shift", RUBY_METHOD_FUNC(rb_shift), 0);
652
+ rb_define_alias(rb_klass, "pop_front", "shift");
653
+ rb_define_method(rb_klass, "each", RUBY_METHOD_FUNC(rb_each), 0);
654
+ rb_define_method(rb_klass, "each_index", RUBY_METHOD_FUNC(rb_each_index), 0);
655
+ rb_define_method(rb_klass, "insert", RUBY_METHOD_FUNC(rb_insert), 2);
656
+ rb_define_method(rb_klass, "remove", RUBY_METHOD_FUNC(rb_remove), 1);
657
+ rb_define_alias(rb_klass, "delete_at", "remove");
658
+ rb_define_method(rb_klass, "clear", RUBY_METHOD_FUNC(rb_clear), 0);
659
+ }
660
+
661
+ __NAMESPACE_END_CVSEQ
662
+ __NAMESPACE_END_OPENCV
663
+