opencv 0.0.6
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.
- data/History.txt +5 -0
- data/License.txt +30 -0
- data/Manifest.txt +115 -0
- data/README.txt +47 -0
- data/Rakefile +34 -0
- data/examples/convexhull.rb +41 -0
- data/examples/face_detect.rb +25 -0
- data/examples/houghcircle.rb +23 -0
- data/examples/inpaint.png +0 -0
- data/examples/inpaint.rb +43 -0
- data/examples/paint.rb +72 -0
- data/examples/snake.rb +43 -0
- data/examples/stuff.jpg +0 -0
- data/ext/curve.cpp +103 -0
- data/ext/curve.h +34 -0
- data/ext/cvavgcomp.cpp +67 -0
- data/ext/cvavgcomp.h +39 -0
- data/ext/cvbox2d.cpp +114 -0
- data/ext/cvbox2d.h +53 -0
- data/ext/cvcapture.cpp +276 -0
- data/ext/cvcapture.h +54 -0
- data/ext/cvchain.cpp +184 -0
- data/ext/cvchain.h +43 -0
- data/ext/cvchaincode.cpp +49 -0
- data/ext/cvchaincode.h +43 -0
- data/ext/cvcircle32f.cpp +90 -0
- data/ext/cvcircle32f.h +53 -0
- data/ext/cvcondensation.cpp +230 -0
- data/ext/cvcondensation.h +49 -0
- data/ext/cvconnectedcomp.cpp +115 -0
- data/ext/cvconnectedcomp.h +46 -0
- data/ext/cvcontour.cpp +219 -0
- data/ext/cvcontour.h +47 -0
- data/ext/cvcontourtree.cpp +86 -0
- data/ext/cvcontourtree.h +41 -0
- data/ext/cvconvexitydefect.cpp +103 -0
- data/ext/cvconvexitydefect.h +42 -0
- data/ext/cverror.cpp +140 -0
- data/ext/cverror.h +79 -0
- data/ext/cvfont.cpp +173 -0
- data/ext/cvfont.h +56 -0
- data/ext/cvhaarclassifiercascade.cpp +159 -0
- data/ext/cvhaarclassifiercascade.h +41 -0
- data/ext/cvhistogram.cpp +200 -0
- data/ext/cvhistogram.h +51 -0
- data/ext/cvindex.cpp +73 -0
- data/ext/cvindex.h +40 -0
- data/ext/cvline.cpp +106 -0
- data/ext/cvline.h +52 -0
- data/ext/cvmat.cpp +4809 -0
- data/ext/cvmat.h +286 -0
- data/ext/cvmatnd.cpp +44 -0
- data/ext/cvmatnd.h +28 -0
- data/ext/cvmemstorage.cpp +64 -0
- data/ext/cvmemstorage.h +53 -0
- data/ext/cvmoments.cpp +204 -0
- data/ext/cvmoments.h +48 -0
- data/ext/cvpoint.cpp +229 -0
- data/ext/cvpoint.h +59 -0
- data/ext/cvpoint2d32f.cpp +213 -0
- data/ext/cvpoint2d32f.h +61 -0
- data/ext/cvpoint3d32f.cpp +245 -0
- data/ext/cvpoint3d32f.h +64 -0
- data/ext/cvrect.cpp +340 -0
- data/ext/cvrect.h +79 -0
- data/ext/cvscalar.cpp +227 -0
- data/ext/cvscalar.h +63 -0
- data/ext/cvseq.cpp +583 -0
- data/ext/cvseq.h +71 -0
- data/ext/cvset.cpp +63 -0
- data/ext/cvset.h +39 -0
- data/ext/cvsize.cpp +223 -0
- data/ext/cvsize.h +63 -0
- data/ext/cvsize2d32f.cpp +180 -0
- data/ext/cvsize2d32f.h +59 -0
- data/ext/cvslice.cpp +82 -0
- data/ext/cvslice.h +53 -0
- data/ext/cvsparsemat.cpp +44 -0
- data/ext/cvsparsemat.h +28 -0
- data/ext/cvtermcriteria.cpp +183 -0
- data/ext/cvtermcriteria.h +71 -0
- data/ext/cvtwopoints.cpp +98 -0
- data/ext/cvtwopoints.h +50 -0
- data/ext/cvvector.cpp +206 -0
- data/ext/cvvector.h +54 -0
- data/ext/cvvideowriter.cpp +116 -0
- data/ext/cvvideowriter.h +41 -0
- data/ext/extconf.rb +61 -0
- data/ext/gui.cpp +65 -0
- data/ext/gui.h +33 -0
- data/ext/iplconvkernel.cpp +177 -0
- data/ext/iplconvkernel.h +52 -0
- data/ext/iplimage.cpp +238 -0
- data/ext/iplimage.h +54 -0
- data/ext/mouseevent.cpp +184 -0
- data/ext/mouseevent.h +59 -0
- data/ext/opencv.cpp +481 -0
- data/ext/opencv.h +356 -0
- data/ext/point3dset.cpp +41 -0
- data/ext/point3dset.h +31 -0
- data/ext/pointset.cpp +238 -0
- data/ext/pointset.h +69 -0
- data/ext/trackbar.cpp +122 -0
- data/ext/trackbar.h +65 -0
- data/ext/window.cpp +368 -0
- data/ext/window.h +56 -0
- data/images/CvMat_sobel.png +0 -0
- data/images/CvMat_sub_rect.png +0 -0
- data/images/CvSeq_relationmap.png +0 -0
- data/images/face_detect_from_lena.jpg +0 -0
- data/lib/opencv.rb +3 -0
- data/lib/version.rb +3 -0
- data/setup/setup.cygwin.rb +120 -0
- data/setup/setup.mingw.rb +99 -0
- data/setup/setup.mswin32.rb +103 -0
- data/test/test_opencv.rb +4 -0
- metadata +191 -0
data/ext/cvscalar.cpp
ADDED
@@ -0,0 +1,227 @@
|
|
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
|
+
void
|
46
|
+
define_ruby_class()
|
47
|
+
{
|
48
|
+
if (rb_klass)
|
49
|
+
return;
|
50
|
+
/*
|
51
|
+
* opencv = rb_define_module("OpenCV");
|
52
|
+
*
|
53
|
+
* note: this comment is used by rdoc.
|
54
|
+
*/
|
55
|
+
VALUE opencv = rb_module_opencv();
|
56
|
+
|
57
|
+
rb_klass = rb_define_class_under(opencv, "CvScalar", rb_cObject);
|
58
|
+
/* CvScalar: class */
|
59
|
+
rb_define_const(opencv, "CvColor", rb_klass);
|
60
|
+
rb_define_alloc_func(rb_klass, rb_allocate);
|
61
|
+
rb_define_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
|
62
|
+
rb_define_method(rb_klass, "[]", RUBY_METHOD_FUNC(rb_aref), 1);
|
63
|
+
rb_define_method(rb_klass, "[]=", RUBY_METHOD_FUNC(rb_aset), 2);
|
64
|
+
rb_define_method(rb_klass, "sub", RUBY_METHOD_FUNC(rb_sub), -1);
|
65
|
+
rb_define_alias(rb_klass, "-", "sub");
|
66
|
+
|
67
|
+
rb_define_method(rb_klass, "to_s", RUBY_METHOD_FUNC(rb_to_s), 0);
|
68
|
+
rb_define_method(rb_klass, "to_ary", RUBY_METHOD_FUNC(rb_to_ary), 0);
|
69
|
+
|
70
|
+
rb_define_const(rb_klass, "Black", cCvScalar::new_object(cvScalar(0x0,0x0,0x0)));
|
71
|
+
rb_define_const(rb_klass, "Silver", cCvScalar::new_object(cvScalar(0x0c,0x0c,0x0c)));
|
72
|
+
rb_define_const(rb_klass, "Gray", cCvScalar::new_object(cvScalar(0x80,0x80,0x80)));
|
73
|
+
rb_define_const(rb_klass, "White", cCvScalar::new_object(cvScalar(0xff,0xff,0xff)));
|
74
|
+
rb_define_const(rb_klass, "Maroon", cCvScalar::new_object(cvScalar(0x0,0x0,0x80)));
|
75
|
+
rb_define_const(rb_klass, "Red", cCvScalar::new_object(cvScalar(0x0,0x0,0xff)));
|
76
|
+
rb_define_const(rb_klass, "Purple", cCvScalar::new_object(cvScalar(0x80,0x0,0x80)));
|
77
|
+
rb_define_const(rb_klass, "Fuchsia", cCvScalar::new_object(cvScalar(0xff,0x0,0xff)));
|
78
|
+
rb_define_const(rb_klass, "Green", cCvScalar::new_object(cvScalar(0x0,0x80,0x0)));
|
79
|
+
rb_define_const(rb_klass, "Lime", cCvScalar::new_object(cvScalar(0x0,0xff,0x0)));
|
80
|
+
rb_define_const(rb_klass, "Olive", cCvScalar::new_object(cvScalar(0x0,0x80,0x80)));
|
81
|
+
rb_define_const(rb_klass, "Yellow", cCvScalar::new_object(cvScalar(0x0,0xff,0xff)));
|
82
|
+
rb_define_const(rb_klass, "Navy", cCvScalar::new_object(cvScalar(0x80,0x0,0x0)));
|
83
|
+
rb_define_const(rb_klass, "Blue", cCvScalar::new_object(cvScalar(0xff,0x0,0x0)));
|
84
|
+
rb_define_const(rb_klass, "Teal", cCvScalar::new_object(cvScalar(0x80,0x80,0x0)));
|
85
|
+
rb_define_const(rb_klass, "Aqua", cCvScalar::new_object(cvScalar(0xff,0xff,0x0)));
|
86
|
+
}
|
87
|
+
|
88
|
+
VALUE
|
89
|
+
rb_allocate(VALUE klass)
|
90
|
+
{
|
91
|
+
CvScalar *ptr;
|
92
|
+
return Data_Make_Struct(klass, CvScalar, 0, -1, ptr);
|
93
|
+
}
|
94
|
+
|
95
|
+
/*
|
96
|
+
* call-seq:
|
97
|
+
* new(<i>[d1][,d2][,d3][,d4]</i>)
|
98
|
+
*
|
99
|
+
* Create new Scalar. Argument should be Fixnum (or nil as 0).
|
100
|
+
*/
|
101
|
+
VALUE
|
102
|
+
rb_initialize(int argc, VALUE *argv, VALUE self)
|
103
|
+
{
|
104
|
+
VALUE val[4];
|
105
|
+
rb_scan_args(argc, argv, "04", &val[0], &val[1], &val[2], &val[3]);
|
106
|
+
for (int i = 0; i < 4; i++) {
|
107
|
+
CVSCALAR(self)->val[i] = NIL_P(val[i]) ? 0 : NUM2DBL(val[i]);
|
108
|
+
}
|
109
|
+
return self;
|
110
|
+
}
|
111
|
+
|
112
|
+
/*
|
113
|
+
* call-seq:
|
114
|
+
* [<i>index</i>]
|
115
|
+
*
|
116
|
+
* Return value of <i>index</i> dimension.
|
117
|
+
*/
|
118
|
+
VALUE
|
119
|
+
rb_aref(VALUE self, VALUE index)
|
120
|
+
{
|
121
|
+
int idx = NUM2INT(index);
|
122
|
+
if (!(idx < 0) && idx < 4) {
|
123
|
+
return rb_float_new(CVSCALAR(self)->val[idx]);
|
124
|
+
}else{
|
125
|
+
rb_raise(rb_eIndexError, "scalar index should be 0...4");
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
/*
|
130
|
+
* call-seq:
|
131
|
+
* [<i>index</i>] = <i>value</i>
|
132
|
+
*
|
133
|
+
* Set value of <i>index</i> dimension to <i>value</i>
|
134
|
+
*/
|
135
|
+
VALUE
|
136
|
+
rb_aset(VALUE self, VALUE index, VALUE value)
|
137
|
+
{
|
138
|
+
int idx = NUM2INT(index);
|
139
|
+
if (!(idx < 0) && idx < 4) {
|
140
|
+
CVSCALAR(self)->val[idx] = NUM2DBL(value);
|
141
|
+
return self;
|
142
|
+
}else{
|
143
|
+
rb_raise(rb_eIndexError, "scalar index should be 0...4");
|
144
|
+
}
|
145
|
+
}
|
146
|
+
|
147
|
+
/*
|
148
|
+
* call-seq:
|
149
|
+
* sub(val[,mask])
|
150
|
+
*
|
151
|
+
* Return new CvScalar if <i>val</i> is CvScalar or compatible object.
|
152
|
+
* self[I] - val[I]
|
153
|
+
* Or return new CvMat if <i>val</i> is CvMat or subclass.
|
154
|
+
*/
|
155
|
+
VALUE
|
156
|
+
rb_sub(int argc, VALUE *argv, VALUE self)
|
157
|
+
{
|
158
|
+
VALUE val, mask;
|
159
|
+
rb_scan_args(argc, argv, "11", &val, &mask);
|
160
|
+
if(rb_obj_is_kind_of(val, cCvMat::rb_class())){
|
161
|
+
VALUE dest = cCvMat::new_object(cvGetSize(CVARR(val)), cvGetElemType(CVARR(val)));
|
162
|
+
cvSubRS(CVARR(val), *CVSCALAR(self), CVARR(dest), MASK(mask));
|
163
|
+
return dest;
|
164
|
+
}else{
|
165
|
+
CvScalar *src = CVSCALAR(self), scl = VALUE_TO_CVSCALAR(val);
|
166
|
+
return new_object(cvScalar(src->val[0] - scl.val[0],
|
167
|
+
src->val[1] - scl.val[1],
|
168
|
+
src->val[2] - scl.val[2],
|
169
|
+
src->val[3] - scl.val[3]));
|
170
|
+
}
|
171
|
+
}
|
172
|
+
|
173
|
+
/*
|
174
|
+
* call-seq:
|
175
|
+
* to_s -> "<OpeCV::CvScalar:#{self[0]},#{self[1]},#{self[2]},#{self[3]}>"
|
176
|
+
*
|
177
|
+
* Return values by String.
|
178
|
+
*/
|
179
|
+
VALUE
|
180
|
+
rb_to_s(VALUE self)
|
181
|
+
{
|
182
|
+
const int i = 6;
|
183
|
+
VALUE str[i];
|
184
|
+
str[0] = rb_str_new2("<%s:%d,%d,%d,%d>");
|
185
|
+
str[1] = rb_str_new2(rb_class2name(CLASS_OF(self)));
|
186
|
+
str[2] = rb_aref(self, INT2FIX(0));
|
187
|
+
str[3] = rb_aref(self, INT2FIX(1));
|
188
|
+
str[4] = rb_aref(self, INT2FIX(2));
|
189
|
+
str[5] = rb_aref(self, INT2FIX(3));
|
190
|
+
return rb_f_sprintf(i, str);
|
191
|
+
}
|
192
|
+
|
193
|
+
/*
|
194
|
+
* call-seq:
|
195
|
+
* to_ary -> [self[0],self[1],self[2],self[3]]
|
196
|
+
*
|
197
|
+
* Return values by Array.
|
198
|
+
*/
|
199
|
+
VALUE
|
200
|
+
rb_to_ary(VALUE self)
|
201
|
+
{
|
202
|
+
return rb_ary_new3(4,
|
203
|
+
rb_aref(self, INT2FIX(0)),
|
204
|
+
rb_aref(self, INT2FIX(1)),
|
205
|
+
rb_aref(self, INT2FIX(2)),
|
206
|
+
rb_aref(self, INT2FIX(3)));
|
207
|
+
}
|
208
|
+
|
209
|
+
VALUE
|
210
|
+
new_object()
|
211
|
+
{
|
212
|
+
VALUE object = rb_allocate(rb_klass);
|
213
|
+
*CVSCALAR(object) = cvScalar(0);
|
214
|
+
return object;
|
215
|
+
}
|
216
|
+
|
217
|
+
VALUE
|
218
|
+
new_object(CvScalar scalar)
|
219
|
+
{
|
220
|
+
VALUE object = rb_allocate(rb_klass);
|
221
|
+
*CVSCALAR(object) = scalar;
|
222
|
+
return object;
|
223
|
+
}
|
224
|
+
|
225
|
+
__NAMESPACE_END_CVSCALAR
|
226
|
+
__NAMESPACE_END_OPENCV
|
227
|
+
|
data/ext/cvscalar.h
ADDED
@@ -0,0 +1,63 @@
|
|
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 define_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
|
+
if(FIXNUM_P(object))
|
54
|
+
return cvScalarAll(FIX2INT(object));
|
55
|
+
return cvScalar(NUM2INT(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(0))),
|
56
|
+
NUM2INT(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(1))),
|
57
|
+
NUM2INT(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(2))),
|
58
|
+
NUM2INT(rb_funcall(object, rb_intern("[]"), 1, INT2FIX(3))));
|
59
|
+
}
|
60
|
+
|
61
|
+
__NAMESPACE_END_OPENCV
|
62
|
+
|
63
|
+
#endif // RUBY_OPENCV_CVSCALAR_H
|
data/ext/cvseq.cpp
ADDED
@@ -0,0 +1,583 @@
|
|
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
|
+
* Generic Sequence class. CvSeq has the method like Array (push, pop, select, etc...).
|
15
|
+
* But, CvSeq cannot store the object of a different class.
|
16
|
+
* When storing object in CvSeq, conversion is automatically tried,
|
17
|
+
* and the object occurs the error if it cannot be done.
|
18
|
+
*
|
19
|
+
* e.g.
|
20
|
+
* seq = CvSeq.new(CvPoint) # Argument mean "this sequence contain only this class's object"
|
21
|
+
* seq.push(CvPoint.new(0, 0)) # => it's ok
|
22
|
+
* seq.push("hello") # => try convert "hello" to CvPoint. but can't do it. raise error.
|
23
|
+
*
|
24
|
+
* If the sequecne contain object of class A.
|
25
|
+
* When storing object(named "obj") of class B to the sequence.
|
26
|
+
* Try automatically : A.from_B(obj) => object of class A.
|
27
|
+
*
|
28
|
+
* CvSeq has the circulation structure internally.
|
29
|
+
* That is, when the sequence has three values ("a","b","c"),
|
30
|
+
* seq[0] and seq[3] are same "a", and seq[-1] and seq[2] are same "c".
|
31
|
+
*
|
32
|
+
* The sequence might have another sequence outside. see below.
|
33
|
+
* Each sequece has h_prev, h_next, v_prev, v_next method.
|
34
|
+
* If the adjoining sequence exists, each method return the adjoining sequence.
|
35
|
+
* Otherwise return nil.
|
36
|
+
*
|
37
|
+
* link:../images/CvSeq_relationmap.png
|
38
|
+
*/
|
39
|
+
__NAMESPACE_BEGIN_OPENCV
|
40
|
+
__NAMESPACE_BEGIN_CVSEQ
|
41
|
+
|
42
|
+
// contain sequence-block class
|
43
|
+
st_table *seqblock_klass = st_init_numtable();
|
44
|
+
|
45
|
+
VALUE
|
46
|
+
seqblock_class(void *ptr)
|
47
|
+
{
|
48
|
+
VALUE klass;
|
49
|
+
if(!st_lookup(seqblock_klass, (st_data_t)ptr, (st_data_t*)&klass)){
|
50
|
+
rb_raise(rb_eTypeError, "Invalid sequence error.");
|
51
|
+
}
|
52
|
+
return klass;
|
53
|
+
}
|
54
|
+
|
55
|
+
VALUE rb_klass;
|
56
|
+
|
57
|
+
VALUE
|
58
|
+
rb_class()
|
59
|
+
{
|
60
|
+
return rb_klass;
|
61
|
+
}
|
62
|
+
|
63
|
+
void
|
64
|
+
define_ruby_class()
|
65
|
+
{
|
66
|
+
if(rb_klass)
|
67
|
+
return;
|
68
|
+
/*
|
69
|
+
* opencv = rb_define_module("OpenCV");
|
70
|
+
*
|
71
|
+
* note: this comment is used by rdoc.
|
72
|
+
*/
|
73
|
+
VALUE opencv = rb_module_opencv();
|
74
|
+
rb_klass = rb_define_class_under(opencv, "CvSeq", rb_cObject);
|
75
|
+
rb_define_alloc_func(rb_klass, rb_allocate);
|
76
|
+
rb_define_private_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
|
77
|
+
rb_define_method(rb_klass, "total", RUBY_METHOD_FUNC(rb_total), 0);
|
78
|
+
rb_define_alias(rb_klass, "length", "total");
|
79
|
+
rb_define_alias(rb_klass, "size", "total");
|
80
|
+
rb_define_method(rb_klass, "empty?", RUBY_METHOD_FUNC(rb_empty_q), 0);
|
81
|
+
rb_define_method(rb_klass, "[]", RUBY_METHOD_FUNC(rb_aref), 1);
|
82
|
+
rb_define_method(rb_klass, "first", RUBY_METHOD_FUNC(rb_first), 0);
|
83
|
+
rb_define_method(rb_klass, "last", RUBY_METHOD_FUNC(rb_last), 0);
|
84
|
+
rb_define_method(rb_klass, "index", RUBY_METHOD_FUNC(rb_index), 1);
|
85
|
+
|
86
|
+
rb_define_method(rb_klass, "h_prev", RUBY_METHOD_FUNC(rb_h_prev), 0);
|
87
|
+
rb_define_method(rb_klass, "h_next", RUBY_METHOD_FUNC(rb_h_next), 0);
|
88
|
+
rb_define_method(rb_klass, "v_prev", RUBY_METHOD_FUNC(rb_v_prev), 0);
|
89
|
+
rb_define_method(rb_klass, "v_next", RUBY_METHOD_FUNC(rb_v_next), 0);
|
90
|
+
|
91
|
+
rb_define_method(rb_klass, "push", RUBY_METHOD_FUNC(rb_push), -2);
|
92
|
+
rb_define_alias(rb_klass, "<<", "push");
|
93
|
+
rb_define_method(rb_klass, "pop", RUBY_METHOD_FUNC(rb_pop), 0);
|
94
|
+
rb_define_method(rb_klass, "unshift", RUBY_METHOD_FUNC(rb_unshift), -2);
|
95
|
+
rb_define_alias(rb_klass, "push_front", "unshift");
|
96
|
+
rb_define_method(rb_klass, "shift", RUBY_METHOD_FUNC(rb_shift), 0);
|
97
|
+
rb_define_alias(rb_klass, "pop_front", "shift");
|
98
|
+
rb_define_method(rb_klass, "each", RUBY_METHOD_FUNC(rb_each), 0);
|
99
|
+
rb_define_method(rb_klass, "each_index", RUBY_METHOD_FUNC(rb_each_index), 0);
|
100
|
+
rb_define_method(rb_klass, "each_with_index", RUBY_METHOD_FUNC(rb_each_with_index), 0);
|
101
|
+
rb_define_method(rb_klass, "insert", RUBY_METHOD_FUNC(rb_insert), 2);
|
102
|
+
rb_define_method(rb_klass, "remove", RUBY_METHOD_FUNC(rb_remove), 1);
|
103
|
+
rb_define_method(rb_klass, "clear", RUBY_METHOD_FUNC(rb_clear), 0);
|
104
|
+
|
105
|
+
rb_define_alias(rb_klass, "delete_at", "remove");
|
106
|
+
}
|
107
|
+
|
108
|
+
VALUE
|
109
|
+
rb_allocate(VALUE klass)
|
110
|
+
{
|
111
|
+
return Data_Wrap_Struct(klass, mark_root_object, free, 0);
|
112
|
+
}
|
113
|
+
|
114
|
+
void
|
115
|
+
free(void *ptr)
|
116
|
+
{
|
117
|
+
if(ptr){
|
118
|
+
unresist_object(ptr);
|
119
|
+
st_delete(seqblock_klass, (st_data_t*)&ptr, 0);
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
123
|
+
void
|
124
|
+
resist_class_information_of_sequence(CvSeq *seq, VALUE klass)
|
125
|
+
{
|
126
|
+
st_insert(seqblock_klass, (st_data_t)seq, (st_data_t)klass);
|
127
|
+
}
|
128
|
+
|
129
|
+
/*
|
130
|
+
* call-seq:
|
131
|
+
* CvSeq.new(<i>type[,storage]</i>)
|
132
|
+
*
|
133
|
+
* Return a new CvSeq. <i>type</i> should be following classes.
|
134
|
+
*
|
135
|
+
* * CvIndex
|
136
|
+
* * CvPoint
|
137
|
+
*/
|
138
|
+
VALUE
|
139
|
+
rb_initialize(int argc, VALUE *argv, VALUE self)
|
140
|
+
{
|
141
|
+
VALUE klass, storage;
|
142
|
+
rb_scan_args(argc, argv, "11", &klass, &storage);
|
143
|
+
if(!rb_obj_is_kind_of(klass, rb_cClass))
|
144
|
+
rb_raise(rb_eTypeError, "argument 1 (sequence-block class) should be %s.", rb_class2name(rb_cClass));
|
145
|
+
CvSeq *seq = 0;
|
146
|
+
storage = CHECK_CVMEMSTORAGE(storage);
|
147
|
+
int type = 0, size = 0;
|
148
|
+
if(klass == cCvIndex::rb_class()){
|
149
|
+
type = CV_SEQ_ELTYPE_INDEX;
|
150
|
+
size = sizeof(CvIndex);
|
151
|
+
}else if(klass == cCvPoint::rb_class()){
|
152
|
+
type = CV_SEQ_ELTYPE_POINT;
|
153
|
+
size = sizeof(CvPoint);
|
154
|
+
}else if(klass == cCvPoint2D32f::rb_class()){
|
155
|
+
type = CV_SEQ_ELTYPE_POINT;
|
156
|
+
size = sizeof(CvPoint2D32f);
|
157
|
+
}else if(klass == cCvPoint3D32f::rb_class()){
|
158
|
+
type = CV_SEQ_ELTYPE_POINT3D;
|
159
|
+
size = sizeof(CvPoint3D32f);
|
160
|
+
}
|
161
|
+
auto_extend(self);
|
162
|
+
// todo: more various class will be support.
|
163
|
+
if(!size)
|
164
|
+
rb_raise(rb_eTypeError, "unsupport %s class for sequence-block.", rb_class2name(klass));
|
165
|
+
seq = cvCreateSeq(type, sizeof(CvSeq), size, CVMEMSTORAGE(storage));
|
166
|
+
DATA_PTR(self) = seq;
|
167
|
+
resist_root_object(seq, storage);
|
168
|
+
// resist class information of this sequence.
|
169
|
+
st_insert(seqblock_klass, (st_data_t)seq, (st_data_t)klass);
|
170
|
+
return self;
|
171
|
+
}
|
172
|
+
|
173
|
+
/*
|
174
|
+
* call-seq:
|
175
|
+
* total -> int
|
176
|
+
*
|
177
|
+
* Return total number of sequence-block.
|
178
|
+
*/
|
179
|
+
VALUE
|
180
|
+
rb_total(VALUE self)
|
181
|
+
{
|
182
|
+
return INT2FIX(CVSEQ(self)->total);
|
183
|
+
}
|
184
|
+
|
185
|
+
/*
|
186
|
+
* call-seq:
|
187
|
+
* empty? -> true or false.
|
188
|
+
*
|
189
|
+
* Return <tt>true</tt> if contain no object, otherwize return <tt>false</tt>.
|
190
|
+
*/
|
191
|
+
VALUE
|
192
|
+
rb_empty_q(VALUE self)
|
193
|
+
{
|
194
|
+
return CVSEQ(self)->total == 0 ? Qtrue : Qfalse;
|
195
|
+
}
|
196
|
+
|
197
|
+
/*
|
198
|
+
* call-seq:
|
199
|
+
* [<i>index</i>] -> obj or nil
|
200
|
+
*
|
201
|
+
* Return sequence-block at <i>index</i>.
|
202
|
+
*/
|
203
|
+
VALUE
|
204
|
+
rb_aref(VALUE self, VALUE index)
|
205
|
+
{
|
206
|
+
CvSeq *seq = CVSEQ(self);
|
207
|
+
if(!(seq->total > 0))
|
208
|
+
return Qnil;
|
209
|
+
return REFER_OBJECT(seqblock_class(seq), cvGetSeqElem(seq, NUM2INT(index) % seq->total), self);
|
210
|
+
}
|
211
|
+
|
212
|
+
/*
|
213
|
+
* call-seq:
|
214
|
+
* first -> obj or nil
|
215
|
+
*
|
216
|
+
* Return first sequence-block.
|
217
|
+
*/
|
218
|
+
VALUE
|
219
|
+
rb_first(VALUE self)
|
220
|
+
{
|
221
|
+
CvSeq *seq = CVSEQ(self);
|
222
|
+
if(!(seq->total > 0))
|
223
|
+
return Qnil;
|
224
|
+
return REFER_OBJECT(seqblock_class(seq), cvGetSeqElem(seq, 0), self);
|
225
|
+
}
|
226
|
+
|
227
|
+
/*
|
228
|
+
* call-seq:
|
229
|
+
* last -> obj or nil
|
230
|
+
*
|
231
|
+
* Return last sequence-block.
|
232
|
+
*/
|
233
|
+
VALUE
|
234
|
+
rb_last(VALUE self)
|
235
|
+
{
|
236
|
+
CvSeq *seq = CVSEQ(self);
|
237
|
+
if(!(seq->total > 0))
|
238
|
+
return Qnil;
|
239
|
+
return REFER_OBJECT(seqblock_class(seq), cvGetSeqElem(seq, -1), self);
|
240
|
+
}
|
241
|
+
|
242
|
+
/*when storing it in CvSeq.
|
243
|
+
* call-seq:
|
244
|
+
* index(<i>obj</i>) -> int or nil
|
245
|
+
*
|
246
|
+
* Return the index of the first object in <i>self</i>. Return <tt>nil</tt> if no match is found.
|
247
|
+
*/
|
248
|
+
VALUE
|
249
|
+
rb_index(VALUE self, VALUE object)
|
250
|
+
{
|
251
|
+
CvSeq *seq = CVSEQ(self);
|
252
|
+
int index;
|
253
|
+
if(CLASS_OF(object) == seqblock_class(seq)){
|
254
|
+
index = cvSeqElemIdx(seq, DATA_PTR(object));
|
255
|
+
if(!(index < 0))
|
256
|
+
return INT2FIX(index);
|
257
|
+
}else{
|
258
|
+
rb_warn("sequence-block class unmatch.");
|
259
|
+
}
|
260
|
+
return Qnil;
|
261
|
+
}
|
262
|
+
|
263
|
+
/*
|
264
|
+
* call-seq:
|
265
|
+
* h_prev -> seq or nil
|
266
|
+
*
|
267
|
+
* Return the sequence horizontally located in previous.
|
268
|
+
* Return <tt>nil</tt> if not existing.
|
269
|
+
*/
|
270
|
+
VALUE
|
271
|
+
rb_h_prev(VALUE self)
|
272
|
+
{
|
273
|
+
CvSeq *seq = CVSEQ(self);
|
274
|
+
if (seq->h_prev) {
|
275
|
+
return new_sequence(CLASS_OF(self), seq->h_prev, seqblock_class(seq), lookup_root_object(seq));
|
276
|
+
//new_sequence(seq->h_prev, CLASS_OF(self), seqblock_class(seq), lookup_root_object(seq));
|
277
|
+
} else
|
278
|
+
return Qnil;
|
279
|
+
}
|
280
|
+
|
281
|
+
/*
|
282
|
+
* call-seq:
|
283
|
+
* h_next -> seq or nil
|
284
|
+
*
|
285
|
+
* Return the sequence horizontally located in next.
|
286
|
+
* Return <tt>nil</tt> if not existing.
|
287
|
+
*/
|
288
|
+
VALUE
|
289
|
+
rb_h_next(VALUE self)
|
290
|
+
{
|
291
|
+
CvSeq *seq = CVSEQ(self);
|
292
|
+
if (seq->h_next) {
|
293
|
+
return new_sequence(CLASS_OF(self), seq->h_next, seqblock_class(seq), lookup_root_object(seq));
|
294
|
+
//new_sequence(seq->h_next, CLASS_OF(self), seqblock_class(seq), lookup_root_object(seq));
|
295
|
+
} else
|
296
|
+
return Qnil;
|
297
|
+
}
|
298
|
+
|
299
|
+
/*
|
300
|
+
* call-seq:
|
301
|
+
* v_prev -> seq or nil
|
302
|
+
*
|
303
|
+
* Return the sequence vertically located in previous.
|
304
|
+
* Return <tt>nil</tt> if not existing.
|
305
|
+
*/
|
306
|
+
VALUE
|
307
|
+
rb_v_prev(VALUE self)
|
308
|
+
{
|
309
|
+
CvSeq *seq = CVSEQ(self);
|
310
|
+
if (seq->v_prev) {
|
311
|
+
return new_sequence(CLASS_OF(self), seq->v_prev, seqblock_class(seq), lookup_root_object(seq));
|
312
|
+
} else
|
313
|
+
return Qnil;
|
314
|
+
}
|
315
|
+
|
316
|
+
/*
|
317
|
+
* call-seq:
|
318
|
+
* v_prev -> seq or nil
|
319
|
+
*
|
320
|
+
* Return the sequence vertically located in next.
|
321
|
+
* Return <tt>nil</tt> if not existing.
|
322
|
+
*/
|
323
|
+
VALUE
|
324
|
+
rb_v_next(VALUE self)
|
325
|
+
{
|
326
|
+
CvSeq *seq = CVSEQ(self);
|
327
|
+
if (seq->v_next) {
|
328
|
+
return new_sequence(CLASS_OF(self), seq->v_next, seqblock_class(seq), lookup_root_object(seq));
|
329
|
+
} else
|
330
|
+
return Qnil;
|
331
|
+
}
|
332
|
+
|
333
|
+
/*
|
334
|
+
* call-seq:
|
335
|
+
* push(<i>obj, ...</i>) -> self
|
336
|
+
*
|
337
|
+
* Append - Pushes the given object(s) on the end of this sequence. This expression return the sequence itself,
|
338
|
+
* so several append may be chainded together.
|
339
|
+
*/
|
340
|
+
VALUE
|
341
|
+
rb_push(VALUE self, VALUE args)
|
342
|
+
{
|
343
|
+
CvSeq *seq = CVSEQ(self);
|
344
|
+
VALUE klass = seqblock_class(seq), object;
|
345
|
+
void *buffer = 0;
|
346
|
+
for(int i = 0; i < RARRAY(args)->len; i++){
|
347
|
+
object = RARRAY(args)->ptr[i];
|
348
|
+
if(CLASS_OF(object) == klass){
|
349
|
+
cvSeqPush(seq, DATA_PTR(object));
|
350
|
+
}else if(rb_obj_is_kind_of(object, rb_klass) && CLASS_OF(object) == klass){ // object is CvSeq
|
351
|
+
buffer = cvCvtSeqToArray(CVSEQ(object), cvAlloc(CVSEQ(object)->total * CVSEQ(object)->elem_size));
|
352
|
+
cvSeqPushMulti(seq, buffer, CVSEQ(object)->total);
|
353
|
+
cvFree((void**)&buffer);
|
354
|
+
}else{
|
355
|
+
object = CONVERT(object, klass);
|
356
|
+
cvSeqPush(seq, DATA_PTR(object));
|
357
|
+
}
|
358
|
+
}
|
359
|
+
return self;
|
360
|
+
}
|
361
|
+
|
362
|
+
/*
|
363
|
+
* call-seq:
|
364
|
+
* pop -> obj or nil
|
365
|
+
*
|
366
|
+
* Remove the last sequence-block from <i>self</i> and return it,
|
367
|
+
* or <tt>nil</tt> if the sequence is empty.
|
368
|
+
*/
|
369
|
+
VALUE
|
370
|
+
rb_pop(VALUE self)
|
371
|
+
{
|
372
|
+
CvSeq *seq = CVSEQ(self);
|
373
|
+
if(!(seq->total > 0)){
|
374
|
+
return Qnil;
|
375
|
+
}
|
376
|
+
VALUE object = GENERIC_OBJECT(seqblock_class(seq), malloc(seq->elem_size));
|
377
|
+
cvSeqPop(seq, DATA_PTR(object));
|
378
|
+
return object;
|
379
|
+
}
|
380
|
+
|
381
|
+
/*
|
382
|
+
* call-seq:
|
383
|
+
* clear -> self
|
384
|
+
*
|
385
|
+
* Clears sequence. Removes all elements from the sequence.
|
386
|
+
*/
|
387
|
+
VALUE
|
388
|
+
rb_clear(VALUE self)
|
389
|
+
{
|
390
|
+
cvClearSeq(CVSEQ(self));
|
391
|
+
return self;
|
392
|
+
}
|
393
|
+
|
394
|
+
/*
|
395
|
+
* call-seq:
|
396
|
+
* unshift -> self
|
397
|
+
*
|
398
|
+
* Prepends objects to the front of sequence. other elements up one.
|
399
|
+
*/
|
400
|
+
VALUE
|
401
|
+
rb_unshift(VALUE self, VALUE args)
|
402
|
+
{
|
403
|
+
CvSeq *seq = CVSEQ(self);
|
404
|
+
VALUE klass = seqblock_class(seq), object;
|
405
|
+
void *buffer = 0;
|
406
|
+
for(int i = 0; i < RARRAY(args)->len; i++){
|
407
|
+
object = RARRAY(args)->ptr[i];
|
408
|
+
if(CLASS_OF(object) == klass){
|
409
|
+
cvSeqPushFront(seq, DATA_PTR(object));
|
410
|
+
}else if(rb_obj_is_kind_of(object, rb_klass) && CLASS_OF(object) == klass){
|
411
|
+
buffer = cvCvtSeqToArray(CVSEQ(object), cvAlloc(CVSEQ(object)->total * CVSEQ(object)->elem_size));
|
412
|
+
cvSeqPushMulti(seq, buffer, CVSEQ(object)->total, 1);
|
413
|
+
cvFree((void**)&buffer);
|
414
|
+
}else{
|
415
|
+
object = CONVERT(object, klass);
|
416
|
+
cvSeqPushFront(seq, DATA_PTR(object));
|
417
|
+
}
|
418
|
+
}
|
419
|
+
return self;
|
420
|
+
}
|
421
|
+
|
422
|
+
/*
|
423
|
+
* call-seq:
|
424
|
+
* shift -> obj or nil
|
425
|
+
*
|
426
|
+
* 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.
|
427
|
+
*/
|
428
|
+
VALUE
|
429
|
+
rb_shift(VALUE self)
|
430
|
+
{
|
431
|
+
CvSeq *seq = CVSEQ(self);
|
432
|
+
if(!(seq->total > 0)){
|
433
|
+
return Qnil;
|
434
|
+
}
|
435
|
+
VALUE object = GENERIC_OBJECT(seqblock_class(seq), malloc(seq->elem_size));
|
436
|
+
cvSeqPopFront(seq, DATA_PTR(object));
|
437
|
+
return object;
|
438
|
+
}
|
439
|
+
|
440
|
+
/*
|
441
|
+
* call-seq:
|
442
|
+
* each{|obj| ... } -> self
|
443
|
+
*
|
444
|
+
* Calls block once for each sequence-block in <i>self</i>,
|
445
|
+
* passing that sequence-block as a parameter.
|
446
|
+
* seq = CvSeq.new(CvIndex)
|
447
|
+
* seq.push(5, 6, 7)
|
448
|
+
* seq.each{|x| print x, " -- "
|
449
|
+
* produces:
|
450
|
+
* 5 -- 6 -- 7 --
|
451
|
+
*/
|
452
|
+
VALUE
|
453
|
+
rb_each(VALUE self)
|
454
|
+
{
|
455
|
+
CvSeq *seq = CVSEQ(self);
|
456
|
+
if(seq->total > 0){
|
457
|
+
VALUE klass = seqblock_class(seq);
|
458
|
+
for(int i = 0; i < seq->total; i++){
|
459
|
+
rb_yield(REFER_OBJECT(klass, cvGetSeqElem(seq, i), self));
|
460
|
+
}
|
461
|
+
}
|
462
|
+
return self;
|
463
|
+
}
|
464
|
+
|
465
|
+
/*
|
466
|
+
* call-seq:
|
467
|
+
* each_index{|index| ... } -> self
|
468
|
+
*
|
469
|
+
* Same as CvSeq#each, but passes the index of the element instead of the element itself.
|
470
|
+
*/
|
471
|
+
VALUE
|
472
|
+
rb_each_index(VALUE self)
|
473
|
+
{
|
474
|
+
CvSeq *seq = CVSEQ(self);
|
475
|
+
for(int i = 0; i < seq->total; i++)
|
476
|
+
rb_yield(INT2FIX(i));
|
477
|
+
return self;
|
478
|
+
}
|
479
|
+
|
480
|
+
/*
|
481
|
+
* call-seq:
|
482
|
+
* each_with_index{|obj, i| ... } -> self
|
483
|
+
*
|
484
|
+
* Calls block with two arguments, the sequence-block and its index, for each sequence-block in sequence.
|
485
|
+
*/
|
486
|
+
VALUE
|
487
|
+
rb_each_with_index(VALUE self)
|
488
|
+
{
|
489
|
+
CvSeq *seq = CVSEQ(self);
|
490
|
+
VALUE klass = seqblock_class(seq);
|
491
|
+
for(int i = 0; i < seq->total; i++)
|
492
|
+
rb_yield_values(2, REFER_OBJECT(klass, cvGetSeqElem(seq, i), self), INT2FIX(i));
|
493
|
+
return self;
|
494
|
+
}
|
495
|
+
|
496
|
+
/*
|
497
|
+
* call-seq:
|
498
|
+
* insert(<i>index,obj</i>) -> self
|
499
|
+
*
|
500
|
+
* Inserts the given values before element with the given index (which may be negative).
|
501
|
+
*/
|
502
|
+
VALUE
|
503
|
+
rb_insert(VALUE self, VALUE index, VALUE object)
|
504
|
+
{
|
505
|
+
Check_Type(index, T_FIXNUM);
|
506
|
+
CvSeq *seq = CVSEQ(self);
|
507
|
+
VALUE klass = seqblock_class(seq);
|
508
|
+
if(CLASS_OF(object) != klass)
|
509
|
+
object = CONVERT(object, klass);
|
510
|
+
cvSeqInsert(seq, FIX2INT(index), DATA_PTR(object));
|
511
|
+
return self;
|
512
|
+
}
|
513
|
+
|
514
|
+
/*
|
515
|
+
* call-seq:
|
516
|
+
* remove(<i>index</i>) -> obj or nil
|
517
|
+
*
|
518
|
+
* Deletes the elements at the specified index.
|
519
|
+
*/
|
520
|
+
VALUE
|
521
|
+
rb_remove(VALUE self, VALUE index)
|
522
|
+
{
|
523
|
+
cvSeqRemove(CVSEQ(self), FIX2INT(index));
|
524
|
+
return self;
|
525
|
+
}
|
526
|
+
|
527
|
+
/*
|
528
|
+
* call-seq:
|
529
|
+
* clone
|
530
|
+
*
|
531
|
+
* Return copy of sequence.
|
532
|
+
*/
|
533
|
+
VALUE
|
534
|
+
rb_clone(VALUE self)
|
535
|
+
{
|
536
|
+
CvSeq *seq = CVSEQ(self);
|
537
|
+
VALUE storage = cCvMemStorage::new_object();
|
538
|
+
return new_sequence(CLASS_OF(self), cvCloneSeq(seq), seqblock_class(seq), storage);
|
539
|
+
}
|
540
|
+
|
541
|
+
/*
|
542
|
+
VALUE
|
543
|
+
new_object(CvSeq *seq, VALUE klass)
|
544
|
+
{
|
545
|
+
VALUE storage = cCvMemStorage::new_object();
|
546
|
+
VALUE object = REFER_OBJECT(rb_klass, seq, storage);
|
547
|
+
st_insert(seqblock_klass, (st_data_t)seq, (st_data_t)klass);
|
548
|
+
return object;
|
549
|
+
}
|
550
|
+
|
551
|
+
VALUE
|
552
|
+
new_object(CvSeq *seq, VALUE klass, VALUE storage)
|
553
|
+
{
|
554
|
+
VALUE object = REFER_OBJECT(rb_klass, seq, storage);
|
555
|
+
st_insert(seqblock_klass, (st_data_t)seq, (st_data_t)klass);
|
556
|
+
return object;
|
557
|
+
}
|
558
|
+
*/
|
559
|
+
|
560
|
+
|
561
|
+
VALUE
|
562
|
+
new_sequence(VALUE klass, CvSeq *seq, VALUE element_klass, VALUE storage)
|
563
|
+
{
|
564
|
+
resist_root_object(seq, storage);
|
565
|
+
if (!NIL_P(element_klass))
|
566
|
+
st_insert(seqblock_klass, (st_data_t)seq, (st_data_t)element_klass);
|
567
|
+
VALUE object = Data_Wrap_Struct(klass, mark_root_object, free, seq);
|
568
|
+
auto_extend(object);
|
569
|
+
return object;
|
570
|
+
}
|
571
|
+
|
572
|
+
VALUE
|
573
|
+
auto_extend(VALUE object)
|
574
|
+
{
|
575
|
+
CvSeq *seq = CVSEQ(object);
|
576
|
+
if(CV_IS_SEQ_POINT_SET(seq)){
|
577
|
+
rb_extend_object(object, mPointSet::rb_module());
|
578
|
+
}
|
579
|
+
return object;
|
580
|
+
}
|
581
|
+
|
582
|
+
__NAMESPACE_END_CVSEQ
|
583
|
+
__NAMESPACE_END_OPENCV
|