opencv-ffi 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/Gemfile +15 -0
- data/README.md +126 -0
- data/Rakefile +52 -0
- data/docs/DocsIndex.md +1 -0
- data/docs/examples/load_image.rb +25 -0
- data/ext/Rakefile +13 -0
- data/ext/aishack-sift/.gitignore +4 -0
- data/ext/aishack-sift/Descriptor.h +34 -0
- data/ext/aishack-sift/KeyPoint.h +38 -0
- data/ext/aishack-sift/README +20 -0
- data/ext/aishack-sift/SIFT.cpp +1036 -0
- data/ext/aishack-sift/SIFT.h +84 -0
- data/ext/aishack-sift/example/.gitignore +2 -0
- data/ext/aishack-sift/example/Makefile +24 -0
- data/ext/aishack-sift/example/MySIFT.cpp +29 -0
- data/ext/aishack-sift/mkrf_conf.rb +13 -0
- data/ext/aishack-sift/siftlib.cpp +85 -0
- data/ext/eigen/.gitignore +4 -0
- data/ext/eigen/eigen_polynomial.cpp +41 -0
- data/ext/eigen/eigen_svd.cpp +100 -0
- data/ext/eigen/mkrf_conf.rb +14 -0
- data/ext/mkrf-monkey.rb +85 -0
- data/ext/mkrf-rakehelper-monkey.rb +52 -0
- data/ext/mkrf_conf.rb +3 -0
- data/ext/opencv-ffi/.gitignore +4 -0
- data/ext/opencv-ffi/matcher_helper.cpp +56 -0
- data/ext/opencv-ffi/mkrf_conf.rb +12 -0
- data/ext/opencv-ffi/vector_math.cpp +39 -0
- data/ext/opensurf/.gitignore +4 -0
- data/ext/opensurf/README +38 -0
- data/ext/opensurf/fasthessian.cpp +376 -0
- data/ext/opensurf/fasthessian.h +108 -0
- data/ext/opensurf/integral.cpp +58 -0
- data/ext/opensurf/integral.h +55 -0
- data/ext/opensurf/ipoint.cpp +108 -0
- data/ext/opensurf/ipoint.h +76 -0
- data/ext/opensurf/kmeans.h +172 -0
- data/ext/opensurf/mkrf_conf.rb +10 -0
- data/ext/opensurf/responselayer.h +92 -0
- data/ext/opensurf/surf.cpp +317 -0
- data/ext/opensurf/surf.h +66 -0
- data/ext/opensurf/surflib.cpp +98 -0
- data/ext/opensurf/surflib.h +96 -0
- data/ext/opensurf/utils.cpp +357 -0
- data/ext/opensurf/utils.h +63 -0
- data/lib/.gitignore +1 -0
- data/lib/opencv-ffi-ext/eigen.rb +84 -0
- data/lib/opencv-ffi-ext/features2d.rb +4 -0
- data/lib/opencv-ffi-ext/matcher_helper.rb +24 -0
- data/lib/opencv-ffi-ext/opensurf.rb +217 -0
- data/lib/opencv-ffi-ext/sift.rb +118 -0
- data/lib/opencv-ffi-ext/vector_math.rb +115 -0
- data/lib/opencv-ffi-wrappers.rb +7 -0
- data/lib/opencv-ffi-wrappers/core.rb +24 -0
- data/lib/opencv-ffi-wrappers/core/iplimage.rb +50 -0
- data/lib/opencv-ffi-wrappers/core/mat.rb +268 -0
- data/lib/opencv-ffi-wrappers/core/misc_draw.rb +44 -0
- data/lib/opencv-ffi-wrappers/core/point.rb +286 -0
- data/lib/opencv-ffi-wrappers/core/rect.rb +40 -0
- data/lib/opencv-ffi-wrappers/core/scalar.rb +104 -0
- data/lib/opencv-ffi-wrappers/core/size.rb +88 -0
- data/lib/opencv-ffi-wrappers/enumerable.rb +10 -0
- data/lib/opencv-ffi-wrappers/features2d.rb +17 -0
- data/lib/opencv-ffi-wrappers/features2d/image_patch.rb +322 -0
- data/lib/opencv-ffi-wrappers/features2d/star.rb +111 -0
- data/lib/opencv-ffi-wrappers/features2d/surf.rb +115 -0
- data/lib/opencv-ffi-wrappers/highgui.rb +10 -0
- data/lib/opencv-ffi-wrappers/imgproc.rb +4 -0
- data/lib/opencv-ffi-wrappers/imgproc/features.rb +35 -0
- data/lib/opencv-ffi-wrappers/imgproc/geometric.rb +39 -0
- data/lib/opencv-ffi-wrappers/matcher.rb +297 -0
- data/lib/opencv-ffi-wrappers/matrix.rb +37 -0
- data/lib/opencv-ffi-wrappers/misc.rb +41 -0
- data/lib/opencv-ffi-wrappers/misc/params.rb +34 -0
- data/lib/opencv-ffi-wrappers/sequence.rb +37 -0
- data/lib/opencv-ffi-wrappers/vectors.rb +38 -0
- data/lib/opencv-ffi.rb +12 -0
- data/lib/opencv-ffi/calib3d.rb +26 -0
- data/lib/opencv-ffi/core.rb +15 -0
- data/lib/opencv-ffi/core/draw.rb +68 -0
- data/lib/opencv-ffi/core/dynamic.rb +13 -0
- data/lib/opencv-ffi/core/library.rb +5 -0
- data/lib/opencv-ffi/core/operations.rb +122 -0
- data/lib/opencv-ffi/core/point.rb +22 -0
- data/lib/opencv-ffi/core/types.rb +172 -0
- data/lib/opencv-ffi/cvffi.rb +8 -0
- data/lib/opencv-ffi/features2d.rb +7 -0
- data/lib/opencv-ffi/features2d/library.rb +6 -0
- data/lib/opencv-ffi/features2d/star.rb +30 -0
- data/lib/opencv-ffi/features2d/surf.rb +38 -0
- data/lib/opencv-ffi/highgui.rb +31 -0
- data/lib/opencv-ffi/imgproc.rb +9 -0
- data/lib/opencv-ffi/imgproc/features.rb +37 -0
- data/lib/opencv-ffi/imgproc/geometric.rb +42 -0
- data/lib/opencv-ffi/imgproc/library.rb +6 -0
- data/lib/opencv-ffi/imgproc/misc.rb +39 -0
- data/lib/opencv-ffi/version.rb +3 -0
- data/opencv-ffi.gemspec +26 -0
- data/test/core/test_draw.rb +46 -0
- data/test/core/test_operations.rb +135 -0
- data/test/core/test_size.rb +14 -0
- data/test/core/test_text.rb +52 -0
- data/test/ext/test_eigen.rb +105 -0
- data/test/ext/test_opensurf.rb +35 -0
- data/test/ext/test_sift.rb +26 -0
- data/test/ext/test_vector_math.rb +85 -0
- data/test/features2d/test_surf.rb +63 -0
- data/test/imgproc/test_goodfeatures.rb +18 -0
- data/test/setup.rb +65 -0
- data/test/test_calib3d.rb +38 -0
- data/test/test_core.rb +26 -0
- data/test/test_ext.rb +8 -0
- data/test/test_features2d.rb +9 -0
- data/test/test_files/images/IMG_7088.JPG +0 -0
- data/test/test_files/images/IMG_7088_small.JPG +0 -0
- data/test/test_files/images/IMG_7089.JPG +0 -0
- data/test/test_highgui.rb +26 -0
- data/test/test_imgproc.rb +35 -0
- data/test/test_wrappers.rb +8 -0
- data/test/wrappers/core/test_draw.rb +41 -0
- data/test/wrappers/core/test_mat.rb +40 -0
- data/test/wrappers/core/test_operations.rb +35 -0
- data/test/wrappers/core/test_types.rb +235 -0
- data/test/wrappers/features2d/test_image_patch.rb +108 -0
- data/test/wrappers/test_imgproc.rb +87 -0
- data/test/wrappers/test_matcher.rb +96 -0
- data/test/wrappers/test_star.rb +28 -0
- data/test/wrappers/test_surf.rb +36 -0
- metadata +234 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
require 'test/setup'
|
3
|
+
require 'opencv-ffi-wrappers/core'
|
4
|
+
|
5
|
+
|
6
|
+
class TestCoreWrapperOperations < Test::Unit::TestCase
|
7
|
+
|
8
|
+
WHITE = CVFFI::CvScalar.new( {:w=>255, :x=>255, :y=>255, :z=>0} )
|
9
|
+
BLACK = CVFFI::CvScalar.new( {:w=>0, :x=>0, :y=>0, :z=>0} )
|
10
|
+
|
11
|
+
def setup
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_solve_cubic
|
15
|
+
# The roots of x^3 - 6x^2 + 11x - 6
|
16
|
+
# are 1,2,3
|
17
|
+
c = Vector[1,-6,11,-6]
|
18
|
+
r = CVFFI::solveCubic( c )
|
19
|
+
|
20
|
+
p r
|
21
|
+
assert r.is_a?(Vector)
|
22
|
+
assert_equal 3, r.size
|
23
|
+
|
24
|
+
# For simplicity, dump to an array I can sort
|
25
|
+
r = r.covector.sort
|
26
|
+
|
27
|
+
3.times { |i|
|
28
|
+
assert_in_delta i+1, r[i], 1e-06
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,235 @@
|
|
1
|
+
|
2
|
+
require 'test/setup'
|
3
|
+
require 'opencv-ffi/core'
|
4
|
+
require 'opencv-ffi-wrappers/core'
|
5
|
+
|
6
|
+
class TestCoreTypesWrappers < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def test_cvSizeWrappers
|
9
|
+
p = CVFFI::CvSize.new( {:width => 1, :height => 2} )
|
10
|
+
|
11
|
+
assert_equal 1, p.x
|
12
|
+
assert_equal 2, p.y
|
13
|
+
|
14
|
+
assert_equal 1, p.width
|
15
|
+
assert_equal 2, p.height
|
16
|
+
|
17
|
+
p.x = 3
|
18
|
+
|
19
|
+
assert_equal 3, p.width
|
20
|
+
assert_equal 2, p.height
|
21
|
+
assert_equal 3, p.x
|
22
|
+
assert_equal 2, p.y
|
23
|
+
|
24
|
+
r = p.to_CvSize
|
25
|
+
assert_equal p,r
|
26
|
+
|
27
|
+
q = p.to_CvSize2D32f
|
28
|
+
assert_in_delta 3.0, q.width, TestSetup::EPSILON
|
29
|
+
assert_in_delta 2.0, q.height, TestSetup::EPSILON
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_point
|
33
|
+
p = CVFFI::Point.new( 4.0, 5.0 )
|
34
|
+
assert_equal 4.0, p.x
|
35
|
+
assert_equal 5.0, p.y
|
36
|
+
|
37
|
+
q = p.to_CvPoint
|
38
|
+
assert_equal 4.0, q.x
|
39
|
+
assert_equal 5.0, q.y
|
40
|
+
|
41
|
+
a = p.to_a
|
42
|
+
assert a.is_a?(Array)
|
43
|
+
assert_equal 3, a.length
|
44
|
+
assert_equal 4.0, a[0]
|
45
|
+
assert_equal 5.0, a[1]
|
46
|
+
assert_equal 1.0, a[2]
|
47
|
+
|
48
|
+
a = p.to_a(false)
|
49
|
+
assert a.is_a?(Array)
|
50
|
+
assert_equal 2, a.length
|
51
|
+
assert_equal 4.0, a[0]
|
52
|
+
assert_equal 5.0, a[1]
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_size
|
57
|
+
p = CVFFI::Size.new( [4.0, 5.0] )
|
58
|
+
|
59
|
+
assert_equal 4.0, p.width
|
60
|
+
assert_equal 5.0, p.height
|
61
|
+
|
62
|
+
assert_in_delta 20.0, p.area, TestSetup::EPSILON
|
63
|
+
|
64
|
+
q = p.to_CvSize2D32f
|
65
|
+
assert q.is_a?( CVFFI::CvSize2D32f )
|
66
|
+
assert_in_delta 4.0, q.width, TestSetup::EPSILON
|
67
|
+
assert_in_delta 5.0, q.height, TestSetup::EPSILON
|
68
|
+
|
69
|
+
r = CVFFI::Size.new p
|
70
|
+
assert_equal 4.0, r.width
|
71
|
+
assert_equal 5.0, r.height
|
72
|
+
|
73
|
+
s = p/2.0
|
74
|
+
assert_equal 2.0, s.width
|
75
|
+
assert_equal 2.5, s.height
|
76
|
+
|
77
|
+
p *= 2.0
|
78
|
+
assert_equal 8.0, p.width
|
79
|
+
assert_equal 10.0, p.height
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_point
|
83
|
+
p = CVFFI::Point.new( 10.0, 0.0 )
|
84
|
+
r = CVFFI::Point.new( 0.0, 0.0 )
|
85
|
+
|
86
|
+
assert_equal 10.0, p.x
|
87
|
+
assert_equal 0.0, p.y
|
88
|
+
|
89
|
+
q = p.rotate( 0.0 )
|
90
|
+
assert_equal 10.0, q.x
|
91
|
+
assert_equal 0.0, q.y
|
92
|
+
|
93
|
+
q = p.rotate( Math::PI/2.0 )
|
94
|
+
assert_in_delta 0.0, q.x, TestSetup::EPSILON
|
95
|
+
assert_in_delta 10.0, q.y, TestSetup::EPSILON
|
96
|
+
|
97
|
+
assert p.neighbor?( r, 10.01 )
|
98
|
+
assert p.neighbor?( r, 9.99 ) == false
|
99
|
+
|
100
|
+
assert p.neighbor_rsquared?( r, 100.01 )
|
101
|
+
assert p.neighbor_rsquared?( r, 99.9 ) == false
|
102
|
+
|
103
|
+
assert_in_delta 10.0, p.l2distance( r ), TestSetup::EPSILON
|
104
|
+
assert_in_delta 100.0, p.l2_squared_distance( r ), TestSetup::EPSILON
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_iplimage
|
109
|
+
img = CVFFI::cvCreateImage( CVFFI::CvSize.new( :width=>100, :height=>100 ), 8, 1 )
|
110
|
+
|
111
|
+
size = img.image_size
|
112
|
+
|
113
|
+
assert_not_nil size
|
114
|
+
assert_equal 100, size.width
|
115
|
+
assert_equal 100, size.height
|
116
|
+
|
117
|
+
clone = img.clone
|
118
|
+
|
119
|
+
|
120
|
+
twin = img.twin
|
121
|
+
assert_equal img.image_size, twin.image_size
|
122
|
+
assert_equal img.depth, twin.depth
|
123
|
+
assert_equal img.nChannels, twin.nChannels
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_rect
|
128
|
+
r = CVFFI::Rect.new( :center => CVFFI::Point.new( 0.0, 0.0 ),
|
129
|
+
:size => CVFFI::Size.new( 10.0, 10.0 ) )
|
130
|
+
|
131
|
+
assert_equal -5.0, r.origin.x
|
132
|
+
assert_equal -5.0, r.origin.y
|
133
|
+
assert_equal 10.0, r.size.width
|
134
|
+
assert_equal 10.0, r.size.height
|
135
|
+
|
136
|
+
cv = r.to_CvRect
|
137
|
+
|
138
|
+
assert_equal -5.0, cv.x
|
139
|
+
assert_equal -5.0, cv.y
|
140
|
+
assert_equal 10.0, cv.width
|
141
|
+
assert_equal 10.0, cv.height
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_mat
|
145
|
+
m = CVFFI::CvMat.eye( 3 )
|
146
|
+
|
147
|
+
3.times { |i|
|
148
|
+
3.times { |j|
|
149
|
+
assert_equal m.at_f(i,j), ( i==j ? 1.0 : 0.0 )
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
mat = m.to_Matrix
|
154
|
+
assert_not_nil mat
|
155
|
+
assert_equal mat[0,0], 1.0
|
156
|
+
assert_equal mat[0,0], m.at_f(0,0)
|
157
|
+
|
158
|
+
r = m.clone
|
159
|
+
assert_equal m.height, r.height
|
160
|
+
assert_equal m.width, r.width
|
161
|
+
assert_equal m.type, r.type
|
162
|
+
assert_equal m.at_f(0,0), r.at_f(0,0)
|
163
|
+
|
164
|
+
q = m.twin
|
165
|
+
assert_equal m.height, q.height
|
166
|
+
assert_equal m.width, q.width
|
167
|
+
assert_equal m.type, q.type
|
168
|
+
assert_not_equal m.at_f(0,0), q.at_f(0,0)
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_vector
|
172
|
+
m = CVFFI::cvCreateMat( 1, 5, :CV_32F )
|
173
|
+
n = CVFFI::cvCreateMat( 5, 1, :CV_32F )
|
174
|
+
|
175
|
+
5.times { |i|
|
176
|
+
m.set_f(0,i,i)
|
177
|
+
n.set_f(i,0,i)
|
178
|
+
}
|
179
|
+
|
180
|
+
mv = m.to_Vector
|
181
|
+
nv = n.to_Vector
|
182
|
+
|
183
|
+
5.times { |i|
|
184
|
+
assert_equal i, mv[i]
|
185
|
+
assert_equal i, nv[i]
|
186
|
+
}
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_mat_transpose
|
190
|
+
m = CVFFI::cvCreateMat( 3,3,:CV_32F)
|
191
|
+
m.zero
|
192
|
+
m.set_f( 0, 2, 1.0 )
|
193
|
+
|
194
|
+
assert_equal m.at_f( 0, 2 ), 1.0
|
195
|
+
assert_equal m.at_f( 2, 0 ), 0.0
|
196
|
+
|
197
|
+
t = m.transpose
|
198
|
+
assert_equal m.at_f( 0, 2 ), 1.0
|
199
|
+
assert_equal m.at_f( 2, 0 ), 0.0
|
200
|
+
|
201
|
+
assert_equal t.at_f( 0, 2 ), 0.0
|
202
|
+
assert_equal t.at_f( 2, 0 ), 1.0
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_mat_coercion
|
206
|
+
a = Matrix.rows( [ [ 1,0,0 ], [0,2,0], [0,0,3] ] )
|
207
|
+
b = CVFFI::CvMat.eye( 3 )
|
208
|
+
|
209
|
+
c = nil
|
210
|
+
assert_nothing_raised {
|
211
|
+
c = a*b
|
212
|
+
}
|
213
|
+
assert c.is_a?(Matrix)
|
214
|
+
assert_equal 1, c[0,0]
|
215
|
+
assert_equal 2, c[1,1]
|
216
|
+
assert_equal 3, c[2,2]
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_scalar
|
220
|
+
# Test each expected initializer pattern
|
221
|
+
# Default ordering is BGRA
|
222
|
+
[ CVFFI::Scalar.new( 1,2,0,4 ),
|
223
|
+
CVFFI::Scalar.new( :w => 1, :x => 2, :z => 4),
|
224
|
+
CVFFI::Scalar.new( :A => 4, :g => 2, :B => 1) ].each { |m|
|
225
|
+
|
226
|
+
[ [1,2,0,4], [:w,:x,:y,:z], [:B,:G,:R,:A], [:b,:g,:r,:a ] ].transpose.each { |i,j,k,p|
|
227
|
+
assert_equal i, m[j], "m[:#{j.to_s}] != #{i} for #{m.to_s}"
|
228
|
+
assert_equal i, m[k], "m[:#{k.to_s}] != #{i} for #{m.to_s}"
|
229
|
+
assert_equal i, m[p], "m[:#{p.to_s}] != #{i} for #{m.to_s}"
|
230
|
+
}
|
231
|
+
}
|
232
|
+
|
233
|
+
|
234
|
+
end
|
235
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
require 'test/setup'
|
4
|
+
|
5
|
+
require 'opencv-ffi'
|
6
|
+
require 'opencv-ffi-wrappers'
|
7
|
+
require 'opencv-ffi-wrappers/features2d/image_patch'
|
8
|
+
|
9
|
+
class TestImagePatch < Test::Unit::TestCase
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@img = TestSetup::test_image
|
13
|
+
|
14
|
+
# Generate an aritificial image, a 300x300 black field
|
15
|
+
# With a 100-wide grey stripe down the center
|
16
|
+
# and a white X corner-to-corner
|
17
|
+
img = CVFFI::cvCreateImage( CVFFI::CvSize.new( [ 300,300 ] ), 8, 1 )
|
18
|
+
CVFFI::cvSet( img, CVFFI::Scalar.new( 0,0,0,0 ).to_CvScalar, nil )
|
19
|
+
CVFFI::cvSetImageROI( img, CVFFI::Rect.new( [100,0,100,300] ).to_CvRect )
|
20
|
+
CVFFI::cvSet( img, CVFFI::Scalar.new( 128,0,0,0 ).to_CvScalar, nil )
|
21
|
+
CVFFI::cvResetImageROI( img )
|
22
|
+
CVFFI::draw_line( img, CVFFI::Point.new(0,0), CVFFI::Point.new(300,300),
|
23
|
+
{ thickness: 2 } )
|
24
|
+
CVFFI::draw_line( img, CVFFI::Point.new(300,0), CVFFI::Point.new(0,300),
|
25
|
+
{ thickness: 2 } )
|
26
|
+
@testimg = img
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def test_cvExtractImagePatch
|
31
|
+
|
32
|
+
params = CVFFI::ImagePatch::Params.new( size: 9 )
|
33
|
+
|
34
|
+
puts "Image size = #{@img.width} x #{@img.height}"
|
35
|
+
# With a 9x9 patch, (4,4) should be OK, but (3,4) shouldn't
|
36
|
+
# Similarly width-5 should be OK, but width-4 shouldn't
|
37
|
+
kp = [ [100,100],
|
38
|
+
[150,150],
|
39
|
+
[100,100],
|
40
|
+
[4,4],
|
41
|
+
[3,4],
|
42
|
+
[@img.width-5,100],
|
43
|
+
[@img.width-4,100] ].map { |i| CVFFI::Point.new i }
|
44
|
+
duds = 2
|
45
|
+
|
46
|
+
patches = CVFFI::ImagePatch::describe( @img, kp, params )
|
47
|
+
assert_not_nil patches
|
48
|
+
|
49
|
+
assert_equal kp.length-duds, patches.length
|
50
|
+
|
51
|
+
# KPs 0 and 2 should be identical
|
52
|
+
assert_equal patches[0], patches[2]
|
53
|
+
|
54
|
+
patch_index = patches.draw_index_image
|
55
|
+
TestSetup::save_image( "test_cvExtractImagePatch", patch_index )
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_cvExtractCircularOrientedImagePatch
|
59
|
+
kp = [ [100,100], [150,150], [199,199] ].map { |i| CVFFI::Point.new i }
|
60
|
+
orientation = [ 5.35, 5.497, 5.35 ]
|
61
|
+
|
62
|
+
params = CVFFI::ImagePatch::Params.new( size: 15,
|
63
|
+
oriented: true,
|
64
|
+
shape: :circle)
|
65
|
+
|
66
|
+
patches = CVFFI::ImagePatch.describe( @testimg, kp, params )
|
67
|
+
|
68
|
+
patches.each_with_index { |patch,i|
|
69
|
+
assert_in_delta patch.angle, orientation[i], 0.1, "For orientation #{i}"
|
70
|
+
}
|
71
|
+
|
72
|
+
# Expect the first and last to be roughly the same
|
73
|
+
assert_in_delta orientation.first, orientation.last, 0.1
|
74
|
+
|
75
|
+
patch_index = patches.draw_index_image
|
76
|
+
TestSetup::save_image( "test_cvExtractCircularOrientedImagePatch", patch_index )
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
def test_cvExtractOrientedImagePatch
|
83
|
+
|
84
|
+
TestSetup::save_image( "oriented_image_patch", @testimg )
|
85
|
+
|
86
|
+
kp = [ [100,100], [150,150], [199,199] ].map { |i| CVFFI::Point.new i }
|
87
|
+
orientation = [ 5.35, 4.712, 5.35 ]
|
88
|
+
|
89
|
+
params = CVFFI::ImagePatch::Params.new( size: 15,
|
90
|
+
oriented: true )
|
91
|
+
|
92
|
+
patches = CVFFI::ImagePatch.describe( @testimg, kp, params )
|
93
|
+
|
94
|
+
patches.each_with_index { |patch,i|
|
95
|
+
assert_in_delta patch.angle, orientation[i], 0.1, "For orientation #{i}"
|
96
|
+
}
|
97
|
+
|
98
|
+
# Expect the first and last to be roughly the same
|
99
|
+
assert_in_delta orientation.first, orientation.last, 0.1
|
100
|
+
|
101
|
+
# First and last should be relatively similar
|
102
|
+
puts "Distance = #{ patches.first.distance_to( patches.last ) }"
|
103
|
+
|
104
|
+
patch_index = patches.draw_index_image
|
105
|
+
TestSetup::save_image( "test_cvOrientedExtractImagePatch", patch_index )
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
require 'test/setup'
|
4
|
+
require 'opencv-ffi-wrappers/core'
|
5
|
+
require 'opencv-ffi-wrappers/imgproc'
|
6
|
+
require 'opencv-ffi-wrappers/misc'
|
7
|
+
|
8
|
+
class TestImgprocWrappers < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@img = TestSetup::test_image
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_getAffineTransform
|
15
|
+
src = Array.new(5) { |i|
|
16
|
+
CVFFI::Point.new( 1.1, i*1.0 )
|
17
|
+
}
|
18
|
+
dst = Array.new(5) { |i|
|
19
|
+
CVFFI::Point.new( i*1.0, i* -1.0 )
|
20
|
+
}
|
21
|
+
|
22
|
+
result = CVFFI::get_affine_transform(src,dst)
|
23
|
+
|
24
|
+
assert_not_nil result
|
25
|
+
|
26
|
+
CVFFI::print_matrix(result, :format => :e)
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_warpAffine
|
31
|
+
warp = CVFFI::CvMat.new CVFFI::cvCreateMat(2,3,:CV_32F)
|
32
|
+
CVFFI::cvSetReal2D(warp, 0,0,1.0)
|
33
|
+
CVFFI::cvSetReal2D(warp, 0,1,0.0)
|
34
|
+
CVFFI::cvSetReal2D(warp, 0,2,0.0)
|
35
|
+
CVFFI::cvSetReal2D(warp, 1,0,0.0)
|
36
|
+
CVFFI::cvSetReal2D(warp, 1,1,1.0)
|
37
|
+
CVFFI::cvSetReal2D(warp, 1,2,0.0)
|
38
|
+
|
39
|
+
dst = CVFFI::cvCreateImage( @img.image_size.to_CvSize, @img.depth, @img.nChannels )
|
40
|
+
|
41
|
+
out = CVFFI::warp_affine( @img.to_IplImage, dst, warp )
|
42
|
+
|
43
|
+
TestSetup::save_image("affineWarped.jpg", dst )
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
def corner_common_tests( corners, img, params = nil )
|
49
|
+
|
50
|
+
if params
|
51
|
+
assert corners.length <= params.max_corners
|
52
|
+
end
|
53
|
+
|
54
|
+
# Hm, what can I test?
|
55
|
+
corners.each { |c|
|
56
|
+
assert c.x >= 0.0
|
57
|
+
assert c.x < img.width
|
58
|
+
assert c.y >= 0.0
|
59
|
+
assert c.y < img.height
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_goodFeaturesToTrack_default_params
|
64
|
+
corners = CVFFI::goodFeaturesToTrack( @img )
|
65
|
+
corner_common_tests( corners, @img )
|
66
|
+
|
67
|
+
params = CVFFI::GoodFeaturesParams.new( use_harris: true )
|
68
|
+
harris_corners = CVFFI::goodFeaturesToTrack( @img, params )
|
69
|
+
corner_common_tests( harris_corners, @img, params )
|
70
|
+
|
71
|
+
assert harris_corners != corners
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_goodFeaturesToTrack_shitomasi_with_params
|
75
|
+
params = CVFFI::GoodFeaturesParams.new( quality_level: 0.7,
|
76
|
+
min_distance: 10 )
|
77
|
+
corners = CVFFI::goodFeaturesToTrack( @img, params )
|
78
|
+
corner_common_tests( corners, @img, params )
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_goodFeaturesToTrack_harris_with_params
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
end
|