opencv-ffi 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,3 @@
1
+ module CVFFI
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "opencv-ffi/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "opencv-ffi"
7
+ s.version = CVFFI::VERSION
8
+ s.authors = ["Aaron Marburg"]
9
+ s.email = ["aaron.marburg@pg.canterbury.ac.nz"]
10
+ s.homepage = "http://github.com/amarburg/opencv-ffi"
11
+ s.summary = %q{A wrapper around OpenCV's C interface using Ruby FFI. Very preliminary.}
12
+ s.description = %q{A wrapper around OpenCV's C interface using Ruby FFI.}
13
+
14
+ s.rubyforge_project = "opencv-ffi"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.extensions = "ext/mkrf_conf.rb"
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.has_rdoc = true
23
+
24
+ s.add_dependency "nice-ffi"
25
+ s.add_dependency "mkrf"
26
+ end
@@ -0,0 +1,46 @@
1
+
2
+
3
+ require 'test/setup'
4
+
5
+ class TestcvCircle < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @img = TestSetup::test_image
9
+ end
10
+
11
+
12
+ def test_cvCircle
13
+ center = CVFFI::CvPoint.new( :x => 500, :y => 500 )
14
+ radius = 100
15
+ color = CVFFI::CvScalar.new( {:w=>255, :x=>255, :y=>255, :z=>0} )
16
+
17
+ CVFFI::cvCircle( @img, center, radius, color, -1, 8, 0 )
18
+
19
+ # Spot check a few points within the radius
20
+ pts = [ [500,500], [550,500], [450, 500] ]
21
+ pts.each { |pt|
22
+ c = CVFFI::cvGet2D( @img, pt[0],pt[1] )
23
+
24
+ assert_equal 255, c.w
25
+ assert_equal 255, c.x
26
+ assert_equal 255, c.y
27
+ assert_equal 0, c.z
28
+ }
29
+
30
+ TestSetup::save_image( "test_cvCircle", @img )
31
+ end
32
+
33
+ def test_cvLine
34
+
35
+ pointA = CVFFI::CvPoint.new( :x => 50, :y => 50 )
36
+ pointB = CVFFI::CvPoint.new( :x => @img.width-50, :y => @img.height-50 )
37
+
38
+ color = CVFFI::CvScalar.new( {:w=>255, :x=>0, :y=>255, :z=>0} )
39
+
40
+ CVFFI::cvLine( @img, pointA, pointB, color, 10, 8, 0 )
41
+
42
+ TestSetup::save_image( "text_cvLine", @img )
43
+ end
44
+
45
+
46
+ end
@@ -0,0 +1,135 @@
1
+
2
+ require 'test/setup'
3
+ require 'opencv-ffi/core'
4
+ require 'opencv-ffi/highgui'
5
+
6
+
7
+ class TestCoreOperations < Test::Unit::TestCase
8
+
9
+ WHITE = CVFFI::CvScalar.new( {:w=>255, :x=>255, :y=>255, :z=>0} )
10
+ BLACK = CVFFI::CvScalar.new( {:w=>0, :x=>0, :y=>0, :z=>0} )
11
+
12
+ def setup
13
+ @center = CVFFI::CvPoint.new( :x => 50, :y => 50 )
14
+ @radius = 50
15
+ end
16
+
17
+
18
+ def assert_color_at_point( img, point, color )
19
+ c = CVFFI::cvGet2D( img, point.x, point.y )
20
+ assert_equal color.w, c.w, "First channel mismatch"
21
+ assert_equal color.x, c.x, "Second channel mismatch" if img.nChannels > 1
22
+ assert_equal color.y, c.y, "Third channel mismatch" if img.nChannels > 2
23
+ assert_equal color.z, c.z, "Fourth channel mismatch" if img.nChannels > 3
24
+ end
25
+
26
+ def test_cvReleaseImage
27
+ imgOne = CVFFI::cvCreateImage( CVFFI::CvSize.new( :width=>100, :height=>100 ), 8, 1 )
28
+ CVFFI::cvReleaseImage( imgOne )
29
+ end
30
+
31
+
32
+ def test_imageOperations
33
+ imgOne = CVFFI::cvCreateImage( CVFFI::CvSize.new( :width=>100, :height=>100 ), 8, 1 )
34
+ CVFFI::cvSet( imgOne, BLACK, nil )
35
+
36
+ imgTwo = CVFFI::cvCloneImage( imgOne )
37
+
38
+ assert_equal imgOne.nChannels, imgTwo.nChannels
39
+ assert_equal imgOne.depth, imgTwo.depth
40
+ assert_equal imgOne.width, imgTwo.width
41
+ assert_equal imgOne.height, imgTwo.height
42
+
43
+ assert_color_at_point imgOne, @center, BLACK
44
+ assert_color_at_point imgTwo, @center, BLACK
45
+
46
+ # Draw a circle on one
47
+ CVFFI::cvCircle( imgOne, @center, @radius, WHITE, -1, 8, 0 )
48
+
49
+ assert_color_at_point imgOne, @center, WHITE
50
+ assert_color_at_point imgTwo, @center, BLACK
51
+
52
+ # Now copy
53
+ CVFFI::cvCopy( imgOne, imgTwo, nil )
54
+
55
+ assert_color_at_point imgOne, @center, WHITE
56
+ assert_color_at_point imgTwo, @center, WHITE
57
+ end
58
+
59
+ def test_roiOperations
60
+ imgOne = CVFFI::cvCreateImage( CVFFI::CvSize.new( :width=>100, :height=>100 ), 8, 1 )
61
+ CVFFI::cvSet( imgOne, BLACK, nil )
62
+ CVFFI::cvCircle( imgOne, @center, @radius, WHITE, -1, 8, 0 )
63
+
64
+ imgTwo = CVFFI::cvCreateImage( CVFFI::CvSize.new( :width=>200, :height=>200 ), 8, 1 )
65
+ CVFFI::cvSet( imgTwo, BLACK, nil )
66
+
67
+ 0.upto(100) { |i|
68
+ if i%25 == 0
69
+
70
+ roi = CVFFI::CvRect.new( :width => 100, :height => 100, :x => i, :y => i )
71
+ CVFFI::cvSetImageROI( imgTwo, roi )
72
+
73
+ r = CVFFI::CvRect.new CVFFI::cvGetImageROI( imgTwo )
74
+
75
+ assert_equal r.width, roi.width
76
+ assert_equal r.height, roi.height
77
+ assert_equal r.x, roi.x
78
+ assert_equal r.y, roi.y
79
+
80
+ CVFFI::cvCopy( imgOne, imgTwo, nil )
81
+
82
+ end
83
+ }
84
+
85
+ CVFFI::cvResetImageROI( imgTwo )
86
+
87
+ TestSetup::save_image( "test_roi", imgTwo )
88
+
89
+ end
90
+
91
+ def test_transpose
92
+ m = CVFFI::cvCreateMat( 3,3, :CV_32F )
93
+ CVFFI::cvSetZero( m )
94
+ CVFFI::cvSetReal2D( m, 0, 2, 1.0 )
95
+
96
+ assert_equal CVFFI::cvGetReal2D( m, 0, 2 ), 1.0
97
+ assert_equal CVFFI::cvGetReal2D( m, 2, 0 ), 0.0
98
+
99
+ t = CVFFI::cvCreateMat( 3,3, :CV_32F )
100
+ CVFFI::cvTranspose( m, t )
101
+
102
+ assert_equal CVFFI::cvGetReal2D( m, 0, 2 ), 1.0
103
+ assert_equal CVFFI::cvGetReal2D( m, 2, 0 ), 0.0
104
+
105
+ assert_equal CVFFI::cvGetReal2D( t, 0, 2 ), 0.0
106
+ assert_equal CVFFI::cvGetReal2D( t, 2, 0 ), 1.0
107
+ end
108
+
109
+ def test_solve_cubic
110
+ c = CVFFI::cvCreateMat( 1,4, :CV_32F )
111
+ r = CVFFI::cvCreateMat( 1,3, :CV_32F )
112
+ CVFFI::cvSetZero( r )
113
+
114
+ # The roots of x^3 - 6x^2 + 11x - 6
115
+ # are 1,2,3
116
+ [1,-6,11,-6].each_with_index { |x,i|
117
+ CVFFI::cvSetReal1D(c,i,x)
118
+ }
119
+
120
+ CVFFI::cvSolveCubic( c, r )
121
+
122
+ # For siplicity, dump to an array I can sort
123
+ r = Array.new(3) { |i|
124
+ CVFFI::cvGetReal1D(r,i)
125
+ }.sort
126
+
127
+ 3.times { |i|
128
+ assert_in_delta i+1, r[i], 1e-06
129
+ }
130
+ end
131
+
132
+
133
+
134
+
135
+ end
@@ -0,0 +1,14 @@
1
+
2
+ require 'test/setup'
3
+
4
+ class TestCoreSize < Test::Unit::TestCase
5
+
6
+ def test_cvSize
7
+ p = CVFFI::CvSize.new( {:width => 1, :height => 1} )
8
+
9
+ assert_not_nil p
10
+ assert_equal 1, p.width
11
+ assert_equal 1, p.height
12
+ end
13
+
14
+ end
@@ -0,0 +1,52 @@
1
+
2
+ require 'test/setup'
3
+ require 'lib/opencv-ffi/core'
4
+
5
+ class TestCoreTextFunctions < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @img = CVFFI::cvLoadImageM( TEST_IMAGE_FILE, CVFFI::CV_LOAD_IMAGE_COLOR )
9
+ end
10
+
11
+
12
+ def test_cvInitFont
13
+ font = CVFFI::CvFont.new '\0'
14
+ CVFFI::cvInitFont( font, :CV_FONT_HERSHEY_PLAIN, 2.0, 2.0, 0.0, 1, 8 )
15
+
16
+ assert_equal CVFFI::CvFontDefines[:CV_FONT_HERSHEY_PLAIN], font.font_face
17
+ assert_equal 2.0, font.hscale
18
+ assert_equal 2.0, font.vscale
19
+ assert_equal 1, font.thickness
20
+ assert_equal 0.0, font.shear
21
+ assert_equal 8, font.line_type
22
+ end
23
+
24
+ def test_putText
25
+ font = CVFFI::CvFont.new '\0'
26
+ CVFFI::cvInitFont( font, :CV_FONT_HERSHEY_PLAIN, 2.0, 2.0, 0.0, 5, 8 )
27
+
28
+ img = CVFFI::cvCreateImage( CVFFI::CvSize.new( :height=>480, :width=>640), :IPL_DEPTH_32F, 3 )
29
+
30
+ color = CVFFI::CvScalar.new( :w => 0 , :x => 255, :y => 0, :z => 0 )
31
+ point = CVFFI::CvPoint.new( :x => 100, :y => 100 )
32
+
33
+ a = "TEST TEST!"
34
+ CVFFI::cvPutText( img, a, point, font, color )
35
+
36
+ CVFFI::cvSaveImage( TestSetup::output_filename("fontTest.tif"), img )
37
+
38
+
39
+ size = CVFFI::CvSize.new :height => 0, :width => 0
40
+ objptr = FFI::MemoryPointer.new :int
41
+ CVFFI::cvGetTextSize( a, font, size, objptr )
42
+ baseline = objptr.read_int
43
+
44
+ ## These are pre-calculated values
45
+ assert_equal 12, baseline
46
+ assert_equal 191, size.width
47
+ assert_equal 21, size.height
48
+ end
49
+
50
+
51
+
52
+ end
@@ -0,0 +1,105 @@
1
+
2
+ require 'test/setup'
3
+ require 'opencv-ffi/core'
4
+ require 'opencv-ffi-ext/eigen'
5
+ require 'matrix'
6
+
7
+ class TestEigen < Test::Unit::TestCase
8
+
9
+ def setup
10
+ @a = CVFFI::cvCreateMat( 3,3, :CV_32F )
11
+ 3.times {|i| 3.times {|j|
12
+ @a.set_f( i,j,3*i+j+1)
13
+ }}
14
+ @epsilon = 1e-3
15
+ end
16
+
17
+ def random_matrix( x, y )
18
+ a = CVFFI::CvMat.new CVFFI::cvCreateMat( x, y, :CV_32F )
19
+ x.times { |i|
20
+ y.times { |j|
21
+ CVFFI::cvSetReal2D( a, i, j, rand )
22
+ }
23
+ }
24
+ a
25
+ end
26
+
27
+ def test_svd
28
+ # Test matrix [ 1,2,3
29
+ # 4,5,6
30
+ # 7,8,9 ]
31
+ a = @a
32
+ u,d,v = CVFFI::Eigen::svd( a )
33
+
34
+ CVFFI::print_matrix a, {:caption => "a"}
35
+ CVFFI::print_matrix u, {:caption => "w"}
36
+ CVFFI::print_matrix d, {:caption => "u"}
37
+ CVFFI::print_matrix v, {:caption => "v"}
38
+
39
+
40
+ ## Test results from alpha
41
+ uans = Matrix.rows( [ [0.214837 , 0.887231 , 0.408248 ],
42
+ [0.520587 , 0.249644 , -0.816497 ],
43
+ [0.826338 , -0.387943 , 0.408248 ] ] )
44
+ dans = [16.8481 , 1.06837 , 0.0 ]
45
+ vans = Matrix.rows( [ [0.479671 , -0.776691 , 0.408248 ],
46
+ [0.572368 , -0.0756865 , -0.816497],
47
+ [0.665064 , 0.625318 , 0.408248] ] )
48
+
49
+ # Check the SVDs
50
+ dans.each_with_index { |dans,i| assert_in_delta d.at_f(i,0), dans, @epsilon }
51
+
52
+ 3.times{ |j|
53
+ # Check the original matrix
54
+ 3.times { |i|
55
+ assert_equal a.at_f( i,j ), 3*i+j+1
56
+ }
57
+ 2.times { |i|
58
+ # Because there's scalar ambiguity in the third column
59
+ # check ratios instead
60
+ assert_in_delta u.at_f(i,j)/u.at_f(i+1,j), uans[i,j]/uans[i+1,j], @epsilon
61
+ assert_in_delta v.at_f(i,j)/v.at_f(i+1,j), vans[i,j]/vans[i+1,j], @epsilon
62
+ }
63
+ }
64
+ end
65
+
66
+ def test_eigen
67
+ a = @a
68
+ d,v = CVFFI::Eigen::eigen(a)
69
+
70
+ CVFFI::print_matrix d, {:caption=>"d"}
71
+ CVFFI::print_matrix v, {:caption=>"v"}
72
+
73
+ # From Wolfram alpha
74
+ dans = [ 16.1168, -1.11684, 0 ]
75
+ vans = [[0.283349, 0.641675, 1.0], [-1.28335, -0.141675, 1.0], [1.0, -2.0, 1.0 ] ]
76
+
77
+ 3.times { |i|
78
+ assert_in_delta d.at_f(i,0), dans[i], @epsilon
79
+
80
+ # Ratio test on elements of eigenvectors
81
+ assert_in_delta v.at_f(0,i)/v.at_f(1,i), vans[i][0]/vans[i][1], @epsilon
82
+ assert_in_delta v.at_f(0,i)/v.at_f(2,i), vans[i][0]/vans[i][2], @epsilon
83
+ }
84
+
85
+
86
+
87
+ end
88
+
89
+ def test_poly
90
+
91
+ # Should be coefficients for (t-1)(t-2)...(t-6) in ascending
92
+ # coefficient order...
93
+ coeffs = [ 720.0, -1764.0, 1624.0, -735.0, 175.0, -21.0, 1.0 ]
94
+ # Eigen expects polynomial in ascending order
95
+ roots = CVFFI::Eigen::polySolver( coeffs )
96
+ roots.sort!
97
+
98
+
99
+ 6.times { |i|
100
+ assert_in_delta roots[i], (i+1).to_f, @epsilon
101
+ }
102
+
103
+ end
104
+
105
+ end
@@ -0,0 +1,35 @@
1
+
2
+
3
+ require 'test/setup'
4
+
5
+ require 'opencv-ffi'
6
+ require 'opencv-ffi-ext/opensurf'
7
+
8
+ class TestOpenSURF < Test::Unit::TestCase
9
+
10
+ def setup
11
+ end
12
+
13
+
14
+ def test_openSurfDetect
15
+ img = TestSetup::test_image
16
+
17
+ params = CVFFI::OpenSURF::Params.new
18
+
19
+ # This should test the auto=conversion to greyscale
20
+ surf = CVFFI::OpenSURF::detect( img, params )
21
+
22
+ assert_not_nil surf
23
+
24
+ surf.mark_on_image( img, {:radius=>5, :thickness=>-1} )
25
+ CVFFI::cvSaveImage( TestSetup::output_filename("openSurfPts.jpg"), img )
26
+
27
+ puts "OpenSURF detected #{surf.length} points"
28
+
29
+
30
+ descriptors = CVFFI::OpenSURF::describe( img, surf, params )
31
+
32
+ puts "After description #{descriptors.length} points"
33
+ end
34
+
35
+ end
@@ -0,0 +1,26 @@
1
+
2
+ require 'test/setup'
3
+
4
+ require 'opencv-ffi'
5
+ require 'opencv-ffi-ext/sift'
6
+
7
+ class TestSIFT < Test::Unit::TestCase
8
+
9
+ def setup
10
+ end
11
+
12
+
13
+ def test_siftDetect
14
+ img = TestSetup::small_test_image
15
+
16
+ params = CVFFI::SIFT::Params.new( octaves: 1 )
17
+
18
+ # This should test the auto=conversion to greyscale
19
+ sift = CVFFI::SIFT::detect( img, params )
20
+
21
+ assert_not_nil sift
22
+
23
+ puts "SIFT detected #{sift.length} points."
24
+ end
25
+
26
+ end