opencv-ffi 0.0.1

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 (130) hide show
  1. data/.gitignore +7 -0
  2. data/Gemfile +15 -0
  3. data/README.md +126 -0
  4. data/Rakefile +52 -0
  5. data/docs/DocsIndex.md +1 -0
  6. data/docs/examples/load_image.rb +25 -0
  7. data/ext/Rakefile +13 -0
  8. data/ext/aishack-sift/.gitignore +4 -0
  9. data/ext/aishack-sift/Descriptor.h +34 -0
  10. data/ext/aishack-sift/KeyPoint.h +38 -0
  11. data/ext/aishack-sift/README +20 -0
  12. data/ext/aishack-sift/SIFT.cpp +1036 -0
  13. data/ext/aishack-sift/SIFT.h +84 -0
  14. data/ext/aishack-sift/example/.gitignore +2 -0
  15. data/ext/aishack-sift/example/Makefile +24 -0
  16. data/ext/aishack-sift/example/MySIFT.cpp +29 -0
  17. data/ext/aishack-sift/mkrf_conf.rb +13 -0
  18. data/ext/aishack-sift/siftlib.cpp +85 -0
  19. data/ext/eigen/.gitignore +4 -0
  20. data/ext/eigen/eigen_polynomial.cpp +41 -0
  21. data/ext/eigen/eigen_svd.cpp +100 -0
  22. data/ext/eigen/mkrf_conf.rb +14 -0
  23. data/ext/mkrf-monkey.rb +85 -0
  24. data/ext/mkrf-rakehelper-monkey.rb +52 -0
  25. data/ext/mkrf_conf.rb +3 -0
  26. data/ext/opencv-ffi/.gitignore +4 -0
  27. data/ext/opencv-ffi/matcher_helper.cpp +56 -0
  28. data/ext/opencv-ffi/mkrf_conf.rb +12 -0
  29. data/ext/opencv-ffi/vector_math.cpp +39 -0
  30. data/ext/opensurf/.gitignore +4 -0
  31. data/ext/opensurf/README +38 -0
  32. data/ext/opensurf/fasthessian.cpp +376 -0
  33. data/ext/opensurf/fasthessian.h +108 -0
  34. data/ext/opensurf/integral.cpp +58 -0
  35. data/ext/opensurf/integral.h +55 -0
  36. data/ext/opensurf/ipoint.cpp +108 -0
  37. data/ext/opensurf/ipoint.h +76 -0
  38. data/ext/opensurf/kmeans.h +172 -0
  39. data/ext/opensurf/mkrf_conf.rb +10 -0
  40. data/ext/opensurf/responselayer.h +92 -0
  41. data/ext/opensurf/surf.cpp +317 -0
  42. data/ext/opensurf/surf.h +66 -0
  43. data/ext/opensurf/surflib.cpp +98 -0
  44. data/ext/opensurf/surflib.h +96 -0
  45. data/ext/opensurf/utils.cpp +357 -0
  46. data/ext/opensurf/utils.h +63 -0
  47. data/lib/.gitignore +1 -0
  48. data/lib/opencv-ffi-ext/eigen.rb +84 -0
  49. data/lib/opencv-ffi-ext/features2d.rb +4 -0
  50. data/lib/opencv-ffi-ext/matcher_helper.rb +24 -0
  51. data/lib/opencv-ffi-ext/opensurf.rb +217 -0
  52. data/lib/opencv-ffi-ext/sift.rb +118 -0
  53. data/lib/opencv-ffi-ext/vector_math.rb +115 -0
  54. data/lib/opencv-ffi-wrappers.rb +7 -0
  55. data/lib/opencv-ffi-wrappers/core.rb +24 -0
  56. data/lib/opencv-ffi-wrappers/core/iplimage.rb +50 -0
  57. data/lib/opencv-ffi-wrappers/core/mat.rb +268 -0
  58. data/lib/opencv-ffi-wrappers/core/misc_draw.rb +44 -0
  59. data/lib/opencv-ffi-wrappers/core/point.rb +286 -0
  60. data/lib/opencv-ffi-wrappers/core/rect.rb +40 -0
  61. data/lib/opencv-ffi-wrappers/core/scalar.rb +104 -0
  62. data/lib/opencv-ffi-wrappers/core/size.rb +88 -0
  63. data/lib/opencv-ffi-wrappers/enumerable.rb +10 -0
  64. data/lib/opencv-ffi-wrappers/features2d.rb +17 -0
  65. data/lib/opencv-ffi-wrappers/features2d/image_patch.rb +322 -0
  66. data/lib/opencv-ffi-wrappers/features2d/star.rb +111 -0
  67. data/lib/opencv-ffi-wrappers/features2d/surf.rb +115 -0
  68. data/lib/opencv-ffi-wrappers/highgui.rb +10 -0
  69. data/lib/opencv-ffi-wrappers/imgproc.rb +4 -0
  70. data/lib/opencv-ffi-wrappers/imgproc/features.rb +35 -0
  71. data/lib/opencv-ffi-wrappers/imgproc/geometric.rb +39 -0
  72. data/lib/opencv-ffi-wrappers/matcher.rb +297 -0
  73. data/lib/opencv-ffi-wrappers/matrix.rb +37 -0
  74. data/lib/opencv-ffi-wrappers/misc.rb +41 -0
  75. data/lib/opencv-ffi-wrappers/misc/params.rb +34 -0
  76. data/lib/opencv-ffi-wrappers/sequence.rb +37 -0
  77. data/lib/opencv-ffi-wrappers/vectors.rb +38 -0
  78. data/lib/opencv-ffi.rb +12 -0
  79. data/lib/opencv-ffi/calib3d.rb +26 -0
  80. data/lib/opencv-ffi/core.rb +15 -0
  81. data/lib/opencv-ffi/core/draw.rb +68 -0
  82. data/lib/opencv-ffi/core/dynamic.rb +13 -0
  83. data/lib/opencv-ffi/core/library.rb +5 -0
  84. data/lib/opencv-ffi/core/operations.rb +122 -0
  85. data/lib/opencv-ffi/core/point.rb +22 -0
  86. data/lib/opencv-ffi/core/types.rb +172 -0
  87. data/lib/opencv-ffi/cvffi.rb +8 -0
  88. data/lib/opencv-ffi/features2d.rb +7 -0
  89. data/lib/opencv-ffi/features2d/library.rb +6 -0
  90. data/lib/opencv-ffi/features2d/star.rb +30 -0
  91. data/lib/opencv-ffi/features2d/surf.rb +38 -0
  92. data/lib/opencv-ffi/highgui.rb +31 -0
  93. data/lib/opencv-ffi/imgproc.rb +9 -0
  94. data/lib/opencv-ffi/imgproc/features.rb +37 -0
  95. data/lib/opencv-ffi/imgproc/geometric.rb +42 -0
  96. data/lib/opencv-ffi/imgproc/library.rb +6 -0
  97. data/lib/opencv-ffi/imgproc/misc.rb +39 -0
  98. data/lib/opencv-ffi/version.rb +3 -0
  99. data/opencv-ffi.gemspec +26 -0
  100. data/test/core/test_draw.rb +46 -0
  101. data/test/core/test_operations.rb +135 -0
  102. data/test/core/test_size.rb +14 -0
  103. data/test/core/test_text.rb +52 -0
  104. data/test/ext/test_eigen.rb +105 -0
  105. data/test/ext/test_opensurf.rb +35 -0
  106. data/test/ext/test_sift.rb +26 -0
  107. data/test/ext/test_vector_math.rb +85 -0
  108. data/test/features2d/test_surf.rb +63 -0
  109. data/test/imgproc/test_goodfeatures.rb +18 -0
  110. data/test/setup.rb +65 -0
  111. data/test/test_calib3d.rb +38 -0
  112. data/test/test_core.rb +26 -0
  113. data/test/test_ext.rb +8 -0
  114. data/test/test_features2d.rb +9 -0
  115. data/test/test_files/images/IMG_7088.JPG +0 -0
  116. data/test/test_files/images/IMG_7088_small.JPG +0 -0
  117. data/test/test_files/images/IMG_7089.JPG +0 -0
  118. data/test/test_highgui.rb +26 -0
  119. data/test/test_imgproc.rb +35 -0
  120. data/test/test_wrappers.rb +8 -0
  121. data/test/wrappers/core/test_draw.rb +41 -0
  122. data/test/wrappers/core/test_mat.rb +40 -0
  123. data/test/wrappers/core/test_operations.rb +35 -0
  124. data/test/wrappers/core/test_types.rb +235 -0
  125. data/test/wrappers/features2d/test_image_patch.rb +108 -0
  126. data/test/wrappers/test_imgproc.rb +87 -0
  127. data/test/wrappers/test_matcher.rb +96 -0
  128. data/test/wrappers/test_star.rb +28 -0
  129. data/test/wrappers/test_surf.rb +36 -0
  130. metadata +234 -0
@@ -0,0 +1,44 @@
1
+
2
+ require 'opencv-ffi-wrappers/core'
3
+ require 'opencv-ffi-wrappers/core/point'
4
+
5
+ module CVFFI
6
+
7
+ def self.draw_circle( img, point, opts={} )
8
+ color = opts[:color] || CVFFI::CvScalar.new( {:w=>255, :x=>255, :y=>255, :z=>0} )
9
+ thickness = opts[:thickness] || 5
10
+ radius = opts[:radius] || 1
11
+
12
+ CVFFI::cvCircle( img.to_IplImage, point.to_CvPoint, radius, color, thickness,8,0 )
13
+ end
14
+
15
+ def self.draw_point( img, point, opts={} )
16
+ opts[:thickness] = -1
17
+ draw_circle( img, point, opts )
18
+ end
19
+
20
+
21
+ def self.draw_line( img, aPoint, bPoint, opts )
22
+ color = opts[:color] || CVFFI::CvScalar.new( {:w=>255, :x=>255, :y=>255, :z=>0} )
23
+ thickness = opts[:thickness] || 5
24
+
25
+ CVFFI::cvLine( img.to_IplImage, aPoint.to_CvPoint, bPoint.to_CvPoint, color, thickness, 8, 0 )
26
+ end
27
+
28
+ def self.put_text( img, text, point, opts = {} )
29
+ color = opts[:color] || CVFFI::Scalar.new( 255,255,255,0 )
30
+ thickness = opts[:thickness] || 2
31
+ face = opts[:face] || opts[:typeface] || :CV_FONT_HERSHEY_SIMPLEX
32
+ font = opts[:font] || nil
33
+ hscale = opts[:hscale] || opts[:scale] || 1.0
34
+ vscale = opts[:vscale] || opts[:scale] || hscale
35
+ shear = opts[:shear] || 0.0
36
+
37
+ unless font
38
+ font = CVFFI::CvFont.new '\0'
39
+ CVFFI::cvInitFont( font, face, hscale, vscale, shear, thickness, :CV_AA )
40
+ end
41
+
42
+ CVFFI::cvPutText( img.to_IplImage, text, point.to_CvPoint, font, color.to_CvScalar )
43
+ end
44
+ end
@@ -0,0 +1,286 @@
1
+
2
+ require 'opencv-ffi/core/types'
3
+
4
+ module CVFFI
5
+
6
+ module CvPointMethods
7
+ def got_what_i_need(a)
8
+ a.class.method_defined?(:x) and a.class.method_defined?(:y)
9
+ end
10
+
11
+ def /(a)
12
+ if got_what_i_need a
13
+ self.class.new( [ x.to_f/a.x.to_f, y.to_f/a.y.to_f ] )
14
+ else
15
+ self.class.new( [ x.to_f/a, y.to_f/a ] )
16
+ end
17
+ end
18
+
19
+ def *(a)
20
+ if got_what_i_need a
21
+ self.class.new( [ x*a.x, y*a.y ] )
22
+ else
23
+ self.class.new( [ x*a, y*a ] )
24
+ end
25
+ end
26
+
27
+ def -(a)
28
+ if got_what_i_need a
29
+ self.class.new( [ x.to_f-a.x, y.to_f-a.y ] )
30
+ else
31
+ self.class.new( [ x.to_f-a, y.to_f-a ] )
32
+ end
33
+ end
34
+
35
+ def +(a)
36
+ if got_what_i_need a
37
+ self.class.new( [ x+a.x, y+a.y ] )
38
+ else
39
+ self.class.new( [ x+a, y+a ] )
40
+ end
41
+ end
42
+
43
+ def rotate( rads )
44
+ sa = Math::sin rads
45
+ ca = Math::cos rads
46
+ self.class.new( x*ca - y*sa,
47
+ x*sa + y*ca )
48
+ end
49
+
50
+ def ==(b)
51
+ @x == b.x and @y == b.y
52
+ end
53
+ def ===(b)
54
+ @x === b.x and @y === b.y
55
+ end
56
+
57
+ def to_Vector( homogeneous = true )
58
+ Vector.elements( to_a( homogeneous ) )
59
+ end
60
+ alias :to_vector :to_Vector
61
+
62
+ def to_a(homogeneous=true)
63
+ if homogeneous
64
+ [ @x/@w, @y/@w, 1.0 ]
65
+ else
66
+ [ @x, @y ]
67
+ end
68
+ end
69
+
70
+ def neighbor?( p, radius )
71
+ return false if (x-p.x).abs > radius or (y-p.y).abs > radius
72
+ return false if l2distance(p) > radius
73
+ true
74
+ end
75
+
76
+ def neighbor_rsquared?( p, rsquared )
77
+ return false if l2_squared_distance(p) > rsquared
78
+ true
79
+ end
80
+
81
+ def l2distance( b )
82
+ Math::sqrt( l2_squared_distance(b) )
83
+ end
84
+ alias :distance_to :l2distance
85
+
86
+ def l2_squared_distance( b )
87
+ (x-b.x)**2 + (y-b.y)**2
88
+ end
89
+ end
90
+
91
+ module CvPointCastMethods
92
+ def to_CvPoint2D64f
93
+ CvPoint2D64f.new( :x => x, :y => y )
94
+ end
95
+
96
+ def to_CvPoint2D32f
97
+ CvPoint2D32f.new( :x => x, :y => y )
98
+ end
99
+
100
+ def to_CvPoint
101
+ CvPoint.new( :x => x.to_i, :y => y.to_i )
102
+ end
103
+
104
+ def to_Point
105
+ Point.new( x, y )
106
+ end
107
+
108
+ def to_a(homogeneous=true)
109
+ if homogeneous
110
+ [ x, y, 1 ]
111
+ else
112
+ [x,y]
113
+ end
114
+ end
115
+ end
116
+
117
+ class CvPointBase
118
+ include CvPointMethods
119
+ include CvPointCastMethods
120
+ end
121
+
122
+ class CvPoint; def to_CvPoint; self; end; end
123
+ class CvPoint2D32f; def to_CvPoint2D32f; self; end; end
124
+ class CvPoint2D64f; def to_CvPoint2D64f; self; end; end
125
+
126
+ class Point
127
+ include CvPointCastMethods
128
+ include CvPointMethods
129
+
130
+ attr_accessor :w, :y, :x
131
+
132
+ def initialize( *args )
133
+ if args.length == 2 and args[1] != nil
134
+ @x = args[0]
135
+ @y = args[1]
136
+ else
137
+ args = args.shift
138
+
139
+ case args
140
+ when Hash
141
+ @y = args[:y]
142
+ @x = args[:x]
143
+ when Array
144
+ @x = args[0]
145
+ @y = args[1]
146
+ else
147
+ @x = args.x
148
+ @y = args.y
149
+ end
150
+ end
151
+
152
+ @x = @x.to_f
153
+ @y = @y.to_f
154
+ @w = 1
155
+ end
156
+
157
+ def area
158
+ @y*@x
159
+ end
160
+ end
161
+
162
+ #===========================================================
163
+ module CvPoint3DMethods
164
+ def got_what_i_need(a)
165
+ a.method_defined?(:x) and a.method_defined?(:y) and a.method_defined(:z)
166
+ end
167
+
168
+ def /(a)
169
+ if a.is_a? Point3D
170
+ self.class.new( [ x.to_f/a.x.to_f, y.to_f/a.y.to_f, z.to_f/a.z.to_f ] )
171
+ else
172
+ self.class.new( [ x.to_f/a, y.to_f/a, z.to_f/z ] )
173
+ end
174
+ end
175
+
176
+ def *(a)
177
+ if a.is_a? Point3D
178
+ self.class.new( [ x*a.x, y*a.y, z*a.z ] )
179
+ else
180
+ self.class.new( [ x*a, y*a, z*a.z ] )
181
+ end
182
+ end
183
+
184
+ def -(a)
185
+ if a.is_a? Point3D
186
+ self.class.new( [ x.to_f-a.x, y.to_f-a.y, z.to_f-a.z ] )
187
+ else
188
+ self.class.new( [ x.to_f-a, y.to_f-a, z.to_f-a ] )
189
+ end
190
+ end
191
+
192
+ def +(a)
193
+ if a.is_a? Point3D
194
+ self.class.new( [ x+a.x, y+a.y, z+a.z ] )
195
+ else
196
+ self.class.new( [ x+a, y+a, z+a ] )
197
+ end
198
+ end
199
+
200
+ def ==(b)
201
+ @x == b.x and @y == b.y and @z == b.z
202
+ end
203
+ def ===(b)
204
+ @x === b.x and @y === b.y and @z === b.z
205
+ end
206
+
207
+ def to_Vector( homogeneous = true )
208
+ Vector.elements( to_a(homogeneous) )
209
+ end
210
+ alias :to_vector :to_Vector
211
+
212
+ def to_a(homogeneous=true)
213
+ if homogeneous
214
+ [@x/@w, @y/@w, @z/@w, 1]
215
+ else
216
+ [@x, @y, @z]
217
+ end
218
+ end
219
+
220
+ end
221
+
222
+ module CvPoint3DCastMethods
223
+ def to_CvPoint3D64f
224
+ CvPoint3D64f.new( :x => x, :y => y, :z => z )
225
+ end
226
+
227
+ def to_CvPoint3D32f
228
+ CvPoint3D32f.new( :x => x, :y => y, :z => z )
229
+ end
230
+
231
+ def to_a( homogeneous = true )
232
+ if homogeneous
233
+ [x,y,z,1]
234
+ else
235
+ [x,y,z]
236
+ end
237
+ end
238
+ end
239
+
240
+ class CvPoint3DBase
241
+ include CvPoint3DMethods
242
+ include CvPoint3DCastMethods
243
+ end
244
+
245
+ class CvPoint3D32f; def to_CvPoint3D32f; self; end; end
246
+ class CvPoint3D64f; def to_CvPoint3D64f; self; end; end
247
+
248
+ class Point3D
249
+ include CvPoint3DCastMethods
250
+ include CvPoint3DMethods
251
+
252
+ attr_accessor :w, :z, :y, :x
253
+
254
+ def initialize( *args )
255
+ if args.length == 3
256
+ @x = args[0]
257
+ @y = args[1]
258
+ @z = args[2]
259
+ else
260
+ args = args.shift
261
+
262
+ case args
263
+ when Hash
264
+ @z = args[:z]
265
+ @y = args[:y]
266
+ @x = args[:x]
267
+ when Array
268
+ @x = args[0]
269
+ @y = args[1]
270
+ @z = args[2]
271
+ else
272
+ @x = args.x
273
+ @y = args.y
274
+ @z = args.z
275
+ end
276
+ end
277
+
278
+ @w = 1
279
+ end
280
+
281
+ end
282
+
283
+
284
+
285
+
286
+ end
@@ -0,0 +1,40 @@
1
+
2
+ require 'opencv-ffi-wrappers/core'
3
+
4
+ module CVFFI
5
+
6
+ class Rect
7
+ attr_accessor :size, :origin
8
+
9
+ def initialize( args )
10
+ case args
11
+ when Array
12
+ @origin = Point.new( args[0..1] )
13
+ @size = Size.new( args[2..3] )
14
+ when Hash
15
+ if args[:size]
16
+ @size = Size.new args[:size]
17
+ else
18
+ @size = Size.new(args)
19
+ end
20
+
21
+ if args[:origin]
22
+ @origin = Point.new( args[:origin] )
23
+ elsif args[:center]
24
+ @origin = Point.new( args[:center] - @size/2.0 )
25
+ else
26
+ @origin = Point.new(args)
27
+ end
28
+
29
+ else
30
+ @size = Size.new args.size
31
+ @origin = Point.new args.origin
32
+ end
33
+ end
34
+
35
+ def to_CvRect
36
+ CvRect.new( :x => @origin.x, :y => @origin.y,
37
+ :width => @size.width, :height => @size.height )
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,104 @@
1
+
2
+ require 'opencv-ffi/core/types'
3
+ require 'opencv-ffi-wrappers/core'
4
+
5
+
6
+ module CVFFI
7
+
8
+ module CvScalarFunctions
9
+ def self.included(base)
10
+ base.extend(ClassMethods)
11
+ end
12
+
13
+ def to_CvScalar
14
+ self
15
+ end
16
+
17
+ module ClassMethods
18
+ end
19
+
20
+
21
+ end
22
+
23
+ class CvMat
24
+ include CvMatFunctions
25
+ end
26
+
27
+
28
+
29
+ class Scalar
30
+
31
+ def initialize( *args )
32
+ @order = :BGR
33
+ w=x=y=z=0
34
+
35
+ if args[0].is_a?( Hash )
36
+ args = args[0]
37
+
38
+ @order = args[:channel_order] if args[:channel_order]
39
+ a,b,c,d = color_symbols
40
+
41
+ w = args[:w] || args[a] || args[a.upcase] || 0
42
+ x = args[:x] || args[b] || args[b.upcase] || 0
43
+ y = args[:y] || args[c] || args[c.upcase] || 0
44
+ z = args[:z] || args[d] || args[d.upcase] || 0
45
+ else
46
+ w,x,y,z = args
47
+ end
48
+
49
+ @s = CVFFI::CvScalar.new( :w => w, :x => x, :y => y, :z => z )
50
+ end
51
+
52
+ def color_symbols
53
+ case @order
54
+ when :BGR then
55
+ [ :b, :g, :r, :a ]
56
+ else
57
+ raise "Hm, the Scalar::order is undefined"
58
+ end
59
+ end
60
+
61
+ def to_CvScalar
62
+ @s
63
+ end
64
+
65
+ def []=(i,x)
66
+ a,b,c,d = color_symbols
67
+
68
+ case i.downcase
69
+ when :w,a then
70
+ @s.w = x
71
+ when :x,b then
72
+ @s.x = x
73
+ when :y,c then
74
+ @s.y = x
75
+ when :z,d then
76
+ @s.z = x
77
+ else
78
+ raise "Hm, don't understand index to CVFFI::Scalar[]="
79
+ end
80
+ end
81
+
82
+
83
+ def [](i)
84
+ a,b,c,d = color_symbols
85
+
86
+ case i.downcase
87
+ when :w,a then
88
+ @s.w
89
+ when :x,b then
90
+ @s.x
91
+ when :y,c then
92
+ @s.y
93
+ when :z,d then
94
+ @s.z
95
+ else
96
+ nil
97
+ end
98
+ end
99
+
100
+ def to_s
101
+ "CvScalar(#{ [@s.w, @s.w, @s.y, @s.z].join(',') })"
102
+ end
103
+ end
104
+ end