jf-ruby-opencv 0.0.18

Sign up to get free protection for your applications and to get access to all the features.
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,83 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- mode: ruby; coding: utf-8 -*-
3
+ require 'test/unit'
4
+ require 'opencv'
5
+ require File.expand_path(File.dirname(__FILE__)) + '/helper'
6
+
7
+ include OpenCV
8
+
9
+ # Tests for OpenCV::CvHuMoment
10
+ class TestCvHuMoments < OpenCVTestCase
11
+ def setup
12
+ @mat = create_cvmat(128, 128, :cv8u, 1) { |j, i|
13
+ if j >= 32 and j < 96 and i >= 16 and i < 112
14
+ CvScalar.new(0)
15
+ elsif j >= 16 and j < 112 and i >= 16 and i < 112
16
+ CvScalar.new(128)
17
+ else
18
+ CvScalar.new(255)
19
+ end
20
+ }
21
+ @moment1 = CvMoments.new
22
+ @moment2 = CvMoments.new(nil, true)
23
+ @moment3 = CvMoments.new(@mat)
24
+ @moment4 = CvMoments.new(@mat, true)
25
+
26
+ @hu_moments1 = CvHuMoments.new(@moment1)
27
+ @hu_moments2 = CvHuMoments.new(@moment2)
28
+ @hu_moments3 = CvHuMoments.new(@moment3)
29
+ @hu_moments4 = CvHuMoments.new(@moment4)
30
+ end
31
+
32
+ def test_initialize
33
+ [@hu_moments1, @hu_moments2, @hu_moments3, @hu_moments4].each { |m|
34
+ assert_not_nil(m)
35
+ assert_equal(CvHuMoments, m.class)
36
+ }
37
+
38
+ assert_raise(TypeError) {
39
+ CvHuMoments.new('foo')
40
+ }
41
+ end
42
+
43
+ def test_huX
44
+ hu_moments = [@hu_moments1.hu1, @hu_moments1.hu2, @hu_moments1.hu3, @hu_moments1.hu4,
45
+ @hu_moments1.hu5, @hu_moments1.hu6, @hu_moments1.hu7]
46
+ hu_moments.each { |hu|
47
+ assert_in_delta(0.0, hu, 0.000001)
48
+ }
49
+
50
+ hu_moments = [@hu_moments2.hu1, @hu_moments2.hu2, @hu_moments2.hu3, @hu_moments2.hu4,
51
+ @hu_moments2.hu5, @hu_moments2.hu6, @hu_moments2.hu7]
52
+ hu_moments.each { |hu|
53
+ assert_in_delta(0.0, hu, 0.000001)
54
+ }
55
+
56
+ hu_moments = [@hu_moments3.hu2, @hu_moments3.hu3, @hu_moments3.hu4,
57
+ @hu_moments3.hu5, @hu_moments3.hu6, @hu_moments3.hu7]
58
+ assert_in_delta(0.001771, @hu_moments3.hu1, 0.000001)
59
+ hu_moments.each { |hu|
60
+ assert_in_delta(0.0, hu, 0.000001)
61
+ }
62
+
63
+ hu_moments = [@hu_moments4.hu3, @hu_moments4.hu4,
64
+ @hu_moments4.hu5, @hu_moments4.hu6, @hu_moments4.hu7]
65
+ assert_in_delta(0.361650, @hu_moments4.hu1, 0.000001)
66
+ assert_in_delta(0.000625, @hu_moments4.hu2, 0.000001)
67
+ hu_moments.each { |hu|
68
+ assert_in_delta(0.0, hu, 0.000001)
69
+ }
70
+ end
71
+
72
+ def test_to_ary
73
+ [@hu_moments4.to_ary, @hu_moments4.to_a].each { |hu_moments|
74
+ assert_equal(7, hu_moments.size)
75
+ assert_in_delta(0.361650, hu_moments[0], 0.000001)
76
+ assert_in_delta(0.000625, hu_moments[1], 0.000001)
77
+ hu_moments[2..7].each { |hu|
78
+ assert_in_delta(0.0, hu, 0.000001)
79
+ }
80
+ }
81
+ end
82
+ end
83
+
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- mode: ruby; coding: utf-8 -*-
3
+ require 'test/unit'
4
+ require 'opencv'
5
+ require File.expand_path(File.dirname(__FILE__)) + '/helper'
6
+
7
+ include OpenCV
8
+
9
+ # Tests for OpenCV::CvLine
10
+ class TestCvLine < OpenCVTestCase
11
+ def setup
12
+ @line = CvLine.new
13
+ end
14
+
15
+ def test_initialize
16
+ assert_not_nil(@line)
17
+ assert_equal(CvLine, @line.class)
18
+ end
19
+
20
+ def test_rho
21
+ @line.rho = 0.0
22
+ assert_in_delta(0.0, @line.rho, 0.001)
23
+ @line.rho = 3.14
24
+ assert_in_delta(3.14, @line.rho, 0.001)
25
+ end
26
+
27
+ def test_theta
28
+ @line.theta = 0.0
29
+ assert_in_delta(0.0, @line.theta, 0.001)
30
+ @line.theta = 3.14
31
+ assert_in_delta(3.14, @line.theta, 0.001)
32
+ end
33
+
34
+ def test_aref_aset
35
+ @line[0] = 0.0
36
+ @line[1] = 0.0
37
+ assert_in_delta(0.0, @line[0], 0.001)
38
+ assert_in_delta(0.0, @line[1], 0.001)
39
+
40
+ @line[0] = 3.14
41
+ @line[1] = 2.71
42
+ assert_in_delta(3.14, @line[0], 0.001)
43
+ assert_in_delta(2.71, @line[1], 0.001)
44
+
45
+ assert_raise(IndexError) {
46
+ @line[2] = 1
47
+ }
48
+ end
49
+ end
50
+
@@ -0,0 +1,3036 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- mode: ruby; coding: utf-8 -*-
3
+ require 'test/unit'
4
+ require 'opencv'
5
+ require File.expand_path(File.dirname(__FILE__)) + '/helper'
6
+
7
+ include OpenCV
8
+
9
+ # Tests for OpenCV::CvMat
10
+ class TestCvMat < OpenCVTestCase
11
+ def test_initialize
12
+ m = CvMat.new(10, 20)
13
+ assert_equal(10, m.rows)
14
+ assert_equal(20, m.cols)
15
+ assert_equal(:cv8u, m.depth)
16
+ assert_equal(3, m.channel)
17
+
18
+ depth_table = {
19
+ CV_8U => :cv8u,
20
+ CV_8S => :cv8s,
21
+ CV_16U => :cv16u,
22
+ CV_16S => :cv16s,
23
+ CV_32S => :cv32s,
24
+ CV_32F => :cv32f,
25
+ CV_64F => :cv64f
26
+ }
27
+
28
+ [CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F,
29
+ :cv8u, :cv8s, :cv16u, :cv16s, :cv32s, :cv32f, :cv64f].each { |depth|
30
+ [1, 2, 3, 4].each { |ch|
31
+ m = CvMat.new(10, 20, depth, ch)
32
+ assert_equal(10, m.rows)
33
+ assert_equal(20, m.cols)
34
+ depth = depth_table[depth] unless depth.is_a? Symbol
35
+ assert_equal(depth, m.depth)
36
+ assert_equal(ch, m.channel)
37
+ }
38
+ }
39
+
40
+ assert_raise(TypeError) {
41
+ m = CvMat.new(DUMMY_OBJ, 20, :cv8u, 1)
42
+ }
43
+ assert_raise(TypeError) {
44
+ m = CvMat.new(10, DUMMY_OBJ, :cv8u, 1)
45
+ }
46
+ assert_raise(TypeError) {
47
+ m = CvMat.new(10, 20, :cv8u, DUMMY_OBJ)
48
+ }
49
+ end
50
+
51
+ def test_load
52
+ mat = CvMat.load(FILENAME_CAT)
53
+ assert_equal(CvMat, mat.class)
54
+ assert_equal(375, mat.cols)
55
+ assert_equal(500, mat.rows)
56
+ assert_equal(:cv8u, mat.depth)
57
+ assert_equal(3, mat.channel)
58
+ assert_equal('ebc0b85d3ac44ea60181c997f35d13df', hash_img(mat))
59
+
60
+ mat = CvMat.load(FILENAME_CAT, CV_LOAD_IMAGE_GRAYSCALE)
61
+ assert_equal(CvMat, mat.class)
62
+ assert_equal(375, mat.cols)
63
+ assert_equal(500, mat.rows)
64
+ assert_equal(:cv8u, mat.depth)
65
+ assert_equal(1, mat.channel)
66
+ assert_equal('f0ae1d7f2d6b3a64d093e3181361f3a4', hash_img(mat))
67
+
68
+ mat = CvMat.load(FILENAME_CAT, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR)
69
+ assert_equal(CvMat, mat.class)
70
+ assert_equal(375, mat.cols)
71
+ assert_equal(500, mat.rows)
72
+ assert_equal(:cv8u, mat.depth)
73
+ assert_equal(3, mat.channel)
74
+ assert_equal('ebc0b85d3ac44ea60181c997f35d13df', hash_img(mat))
75
+
76
+ assert_raise(ArgumentError) {
77
+ CvMat.load
78
+ }
79
+ assert_raise(TypeError) {
80
+ CvMat.load(DUMMY_OBJ)
81
+ }
82
+ assert_raise(TypeError) {
83
+ CvMat.load(FILENAME_CAT, DUMMY_OBJ)
84
+ }
85
+ assert_raise(StandardError) {
86
+ CvMat.load('file/does/not/exist')
87
+ }
88
+ end
89
+
90
+ def test_save_image
91
+ filename_jpg = 'save_image_test.jpg'
92
+ filename_png = 'save_image_test.png'
93
+ m = CvMat.new(20, 20, :cv8u, 1)
94
+
95
+ File.delete filename_jpg if File.exists? filename_jpg
96
+ m.save_image filename_jpg
97
+ assert(File.exists? filename_jpg)
98
+
99
+ File.delete filename_jpg if File.exists? filename_jpg
100
+ m.save_image(filename_jpg, CV_IMWRITE_JPEG_QUALITY => 10)
101
+ assert(File.exists? filename_jpg)
102
+
103
+ File.delete filename_png if File.exists? filename_png
104
+ m.save_image(filename_png, CV_IMWRITE_PNG_COMPRESSION => 9)
105
+ assert(File.exists? filename_png)
106
+
107
+ # Alias
108
+ File.delete filename_jpg if File.exists? filename_jpg
109
+ m.save filename_jpg
110
+ assert(File.exists? filename_jpg)
111
+
112
+ assert_raise(TypeError) {
113
+ m.save_image(DUMMY_OBJ)
114
+ }
115
+ assert_raise(TypeError) {
116
+ m.save_image(filename_jpg, DUMMY_OBJ)
117
+ }
118
+
119
+ File.delete filename_jpg if File.exists? filename_jpg
120
+ File.delete filename_png if File.exists? filename_png
121
+ end
122
+
123
+ def test_encode
124
+ mat = CvMat.load(FILENAME_CAT);
125
+
126
+ jpg = mat.encode('.jpg')
127
+ assert_equal('JFIF', jpg[6, 4].map(&:chr).join) # Is jpeg format?
128
+
129
+ jpg = mat.encode('.jpg', CV_IMWRITE_JPEG_QUALITY => 10)
130
+ assert_equal('JFIF', jpg[6, 4].map(&:chr).join)
131
+
132
+ png = mat.encode('.png')
133
+ assert_equal('PNG', png[1, 3].map(&:chr).join) # Is png format?
134
+
135
+ png = mat.encode('.png', CV_IMWRITE_PNG_COMPRESSION => 9)
136
+ assert_equal('PNG', png[1, 3].map(&:chr).join)
137
+
138
+ assert_raise(TypeError) {
139
+ mat.encode(DUMMY_OBJ)
140
+ }
141
+ assert_raise(TypeError) {
142
+ mat.encode('.jpg', DUMMY_OBJ)
143
+ }
144
+
145
+ # Uncomment the following lines to see the result images
146
+ #
147
+ # open('test-jpeg.jpg', 'wb') { |f|
148
+ # f.write jpg.pack("c*")
149
+ # }
150
+ # open('test-png.png', 'wb') { |f|
151
+ # f.write png.pack("c*")
152
+ # }
153
+ end
154
+
155
+ def test_decode
156
+ data = nil
157
+ open(FILENAME_CAT, 'rb') { |f|
158
+ data = f.read
159
+ }
160
+ data_ary = data.unpack("c*")
161
+ data_mat = CvMat.new(1, data_ary.size).set_data(data_ary)
162
+ expected = CvMat.load(FILENAME_CAT)
163
+
164
+ mat1 = CvMat.decode(data)
165
+ mat2 = CvMat.decode(data_ary)
166
+ mat3 = CvMat.decode(data_mat)
167
+ mat4 = CvMat.decode(data, CV_LOAD_IMAGE_COLOR)
168
+ mat5 = CvMat.decode(data_ary, CV_LOAD_IMAGE_COLOR)
169
+ mat6 = CvMat.decode(data_mat, CV_LOAD_IMAGE_COLOR)
170
+ expected_hash = hash_img(expected)
171
+
172
+ [mat1, mat2, mat3, mat4, mat5, mat6].each { |mat|
173
+ assert_equal(CvMat, mat.class)
174
+ assert_equal(expected.rows, mat.rows)
175
+ assert_equal(expected.cols, mat.cols)
176
+ assert_equal(expected.channel, mat.channel)
177
+ assert_equal(expected_hash, hash_img(mat))
178
+ }
179
+
180
+ expected_c1 = CvMat.load(FILENAME_CAT, CV_LOAD_IMAGE_GRAYSCALE)
181
+ mat1c1 = CvMat.decode(data, CV_LOAD_IMAGE_GRAYSCALE)
182
+ mat2c1 = CvMat.decode(data_ary, CV_LOAD_IMAGE_GRAYSCALE)
183
+ mat3c1 = CvMat.decode(data_mat, CV_LOAD_IMAGE_GRAYSCALE)
184
+ expected_hash_c1 = hash_img(expected_c1)
185
+
186
+ [mat1c1, mat2c1, mat3c1].each { |mat|
187
+ assert_equal(CvMat, mat.class)
188
+ assert_equal(expected_c1.rows, mat.rows)
189
+ assert_equal(expected_c1.cols, mat.cols)
190
+ assert_equal(expected_c1.channel, mat.channel)
191
+ assert_equal(expected_hash_c1, hash_img(mat))
192
+ }
193
+
194
+ assert_raise(TypeError) {
195
+ CvMat.decode(DUMMY_OBJ)
196
+ }
197
+ assert_raise(TypeError) {
198
+ CvMat.decode(data, DUMMY_OBJ)
199
+ }
200
+
201
+ # Uncomment the following line to show the result images
202
+ # snap mat1, mat2, mat3
203
+ end
204
+
205
+ def test_GOOD_FEATURES_TO_TRACK_OPTION
206
+ assert_equal(0xff, CvMat::GOOD_FEATURES_TO_TRACK_OPTION[:max])
207
+ assert_nil(CvMat::GOOD_FEATURES_TO_TRACK_OPTION[:mask])
208
+ assert_equal(3, CvMat::GOOD_FEATURES_TO_TRACK_OPTION[:block_size])
209
+ assert((not CvMat::GOOD_FEATURES_TO_TRACK_OPTION[:use_harris]))
210
+ assert_in_delta(0.04, CvMat::GOOD_FEATURES_TO_TRACK_OPTION[:k], 0.01)
211
+ end
212
+
213
+ def test_FIND_CONTOURS_OPTION
214
+ assert_equal(1, CvMat::FIND_CONTOURS_OPTION[:mode])
215
+ assert_equal(2, CvMat::FIND_CONTOURS_OPTION[:method])
216
+ assert_equal(0, CvMat::FIND_CONTOURS_OPTION[:offset].x)
217
+ assert_equal(0, CvMat::FIND_CONTOURS_OPTION[:offset].y)
218
+ end
219
+
220
+ def test_OPTICAL_FLOW_HS_OPTION
221
+ assert_in_delta(0.0005, CvMat::OPTICAL_FLOW_HS_OPTION[:lambda], 0.000001)
222
+ assert_equal(1, CvMat::OPTICAL_FLOW_HS_OPTION[:criteria].max)
223
+ assert_in_delta(0.001, CvMat::OPTICAL_FLOW_HS_OPTION[:criteria].eps, 0.00001)
224
+ end
225
+
226
+ def test_OPTICAL_FLOW_BM_OPTION
227
+ assert_equal(4, CvMat::OPTICAL_FLOW_BM_OPTION[:block_size].width)
228
+ assert_equal(4, CvMat::OPTICAL_FLOW_BM_OPTION[:block_size].height)
229
+ assert_equal(1, CvMat::OPTICAL_FLOW_BM_OPTION[:shift_size].width)
230
+ assert_equal(1, CvMat::OPTICAL_FLOW_BM_OPTION[:shift_size].height)
231
+ assert_equal(4, CvMat::OPTICAL_FLOW_BM_OPTION[:max_range].width)
232
+ assert_equal(4, CvMat::OPTICAL_FLOW_BM_OPTION[:max_range].height)
233
+ end
234
+
235
+ def test_FIND_FUNDAMENTAL_MAT_OPTION
236
+ assert((not CvMat::FIND_FUNDAMENTAL_MAT_OPTION[:with_status]))
237
+ assert_in_delta(1.0, CvMat::FIND_FUNDAMENTAL_MAT_OPTION[:maximum_distance], 0.01)
238
+ assert_in_delta(0.99, CvMat::FIND_FUNDAMENTAL_MAT_OPTION[:desirable_level], 0.01)
239
+ end
240
+
241
+ def test_to_s
242
+ m = CvMat.new(10, 20)
243
+ assert_equal('<OpenCV::CvMat:20x10,depth=cv8u,channel=3>', m.to_s)
244
+ m = CvMat.new(10, 20, :cv16s)
245
+ assert_equal('<OpenCV::CvMat:20x10,depth=cv16s,channel=3>', m.to_s)
246
+ m = CvMat.new(10, 20, :cv32f, 1)
247
+ assert_equal('<OpenCV::CvMat:20x10,depth=cv32f,channel=1>', m.to_s)
248
+ end
249
+
250
+ def test_inside
251
+ m = CvMat.new(20, 10)
252
+ assert(m.inside? CvPoint.new(0, 0))
253
+ assert(m.inside? CvPoint.new(9, 19))
254
+ assert((not m.inside? CvPoint.new(10, 0)))
255
+ assert((not m.inside? CvPoint.new(0, 20)))
256
+ assert((not m.inside? CvPoint.new(10, 20)))
257
+ end
258
+
259
+ def test_to_IplConvKernel
260
+ kernel = CvMat.new(10, 20).to_IplConvKernel(CvPoint.new(2, 3))
261
+ assert_equal(10, kernel.rows)
262
+ assert_equal(20, kernel.cols)
263
+ assert_equal(2, kernel.anchor.x)
264
+ assert_equal(3, kernel.anchor.y)
265
+ assert_equal(2, kernel.anchor_x)
266
+ assert_equal(3, kernel.anchor_y)
267
+ end
268
+
269
+ def test_create_mask
270
+ mask = CvMat.new(10, 20).create_mask
271
+ assert_equal(20, mask.width)
272
+ assert_equal(10, mask.height)
273
+ assert_equal(:cv8u, mask.depth)
274
+ assert_equal(1, mask.channel)
275
+ end
276
+
277
+ def test_fields
278
+ m = CvMat.new(20, 10)
279
+ assert_equal(10, m.width)
280
+ assert_equal(10, m.columns)
281
+ assert_equal(10, m.cols)
282
+ assert_equal(20, m.height)
283
+ assert_equal(20, m.rows)
284
+ assert_equal(:cv8u, m.depth)
285
+ assert_equal(3, m.channel)
286
+
287
+ m = CvMat.new(20, 10, :cv16s, 1)
288
+ assert_equal(10, m.width)
289
+ assert_equal(10, m.columns)
290
+ assert_equal(10, m.cols)
291
+ assert_equal(20, m.height)
292
+ assert_equal(20, m.rows)
293
+ assert_equal(:cv16s, m.depth)
294
+ assert_equal(1, m.channel)
295
+ end
296
+
297
+ def test_clone
298
+ m1 = create_cvmat(10, 20)
299
+ m2 = m1.clone
300
+ assert_equal(m1.data, m2.data)
301
+ end
302
+
303
+ def test_copy
304
+ m1 = create_cvmat(10, 20, CV_32F, 1) { |j, i, c| CvScalar.new(c) }
305
+
306
+ m2 = m1.copy
307
+ assert_equal(m1.data, m2.data)
308
+
309
+ m2 = create_cvmat(10, 20, CV_32F, 1).zero
310
+ m3 = m1.copy(m2)
311
+ assert_equal(m1.data, m2.data)
312
+ assert_equal(m1.data, m3.data)
313
+
314
+ rows, cols = m1.rows, m1.cols
315
+ mask = create_cvmat(rows, cols, CV_8U, 1) { |j, i, c|
316
+ val = (i > cols / 2) ? 0 : 255
317
+ CvScalar.new(val)
318
+ }
319
+
320
+ m2_orig = m2.copy
321
+ m3 = m1.copy(m2, mask)
322
+ rows.times { |j|
323
+ cols.times { |i|
324
+ expected = (mask[j, i][0] == 0) ? m2_orig[j, i] : m1[j, i]
325
+ assert_cvscalar_equal(expected, m2[j, i])
326
+ assert_cvscalar_equal(expected, m3[j, i])
327
+ }
328
+ }
329
+
330
+ assert_raise(TypeError) {
331
+ m1.copy(DUMMY_OBJ)
332
+ }
333
+ end
334
+
335
+ def test_convert_depth
336
+ m = CvMat.new(10, 20, :cv32f)
337
+ assert_equal(:cv8u, m.to_8u.depth)
338
+ assert_equal(:cv8s, m.to_8s.depth)
339
+ assert_equal(:cv16u, m.to_16u.depth)
340
+ assert_equal(:cv16s, m.to_16s.depth)
341
+ assert_equal(:cv32s, m.to_32s.depth)
342
+ assert_equal(:cv32f, m.to_32f.depth)
343
+ assert_equal(:cv64f, m.to_64f.depth)
344
+ end
345
+
346
+ def test_vector
347
+ m = CvMat.new(1, 2)
348
+ assert(m.vector?)
349
+
350
+ m = CvMat.new(2, 2)
351
+ assert((not m.vector?))
352
+ end
353
+
354
+ def test_square
355
+ m = CvMat.new(2, 2)
356
+ assert(m.square?)
357
+ m = CvMat.new(1, 2)
358
+ assert((not m.square?))
359
+ end
360
+
361
+ def test_to_CvMat
362
+ m1 = CvMat.new(2, 3, :cv32f, 4)
363
+ m2 = m1.to_CvMat
364
+ assert_equal(CvMat, m2.class)
365
+ assert_equal(m1.rows, m2.rows)
366
+ assert_equal(m1.cols, m2.cols)
367
+ assert_equal(m1.depth, m2.depth)
368
+ assert_equal(m1.channel, m2.channel)
369
+ assert_equal(m1.data, m2.data)
370
+ end
371
+
372
+ def test_sub_rect
373
+ m1 = create_cvmat(10, 10)
374
+
375
+ assert_raise(ArgumentError) {
376
+ m1.sub_rect
377
+ }
378
+
379
+ m2 = m1.sub_rect(CvRect.new(0, 0, 2, 3))
380
+ assert_equal(2, m2.width)
381
+ assert_equal(3, m2.height)
382
+ m2.height.times { |j|
383
+ m2.width.times { |i|
384
+ assert_cvscalar_equal(m1[j, i], m2[j, i])
385
+ }
386
+ }
387
+
388
+ topleft = CvPoint.new(2, 3)
389
+ m2 = m1.sub_rect(topleft, CvSize.new(4, 5))
390
+ assert_equal(4, m2.width)
391
+ assert_equal(5, m2.height)
392
+ m2.height.times { |j|
393
+ m2.width.times { |i|
394
+ assert_cvscalar_equal(m1[topleft.y + j, topleft.x + i], m2[j, i])
395
+ }
396
+ }
397
+
398
+ topleft = CvPoint.new(1, 2)
399
+ m2 = m1.sub_rect(topleft.x, topleft.y, 3, 4)
400
+ assert_equal(3, m2.width)
401
+ assert_equal(4, m2.height)
402
+ m2.height.times { |j|
403
+ m2.width.times { |i|
404
+ assert_cvscalar_equal(m1[topleft.y + j, topleft.x + i], m2[j, i])
405
+ }
406
+ }
407
+
408
+ # Alias
409
+ m2 = m1.subrect(CvRect.new(0, 0, 2, 3))
410
+ assert_equal(2, m2.width)
411
+ assert_equal(3, m2.height)
412
+ m2.height.times { |j|
413
+ m2.width.times { |i|
414
+ assert_cvscalar_equal(m1[j, i], m2[j, i])
415
+ }
416
+ }
417
+
418
+ assert_raise(TypeError) {
419
+ m1.sub_rect(DUMMY_OBJ)
420
+ }
421
+ assert_raise(TypeError) {
422
+ m1.sub_rect(DUMMY_OBJ, CvSize.new(1, 2))
423
+ }
424
+ assert_raise(TypeError) {
425
+ m1.sub_rect(CvPoint.new(1, 2), DUMMY_OBJ)
426
+ }
427
+ assert_raise(TypeError) {
428
+ m1.sub_rect(DUMMY_OBJ, 2, 3, 4)
429
+ }
430
+ assert_raise(TypeError) {
431
+ m1.sub_rect(1, DUMMY_OBJ, 3, 4)
432
+ }
433
+ assert_raise(TypeError) {
434
+ m1.sub_rect(1, 2, DUMMY_OBJ, 4)
435
+ }
436
+ assert_raise(TypeError) {
437
+ m1.sub_rect(1, 2, 3, DUMMY_OBJ)
438
+ }
439
+ end
440
+
441
+ def test_get_rows
442
+ m1 = create_cvmat(10, 20) { |j, i, c| CvScalar.new(c) }
443
+
444
+ row = 2
445
+ m2 = m1.get_rows(row)
446
+ assert_equal(1, m2.rows)
447
+ assert_equal(m1.cols, m2.cols)
448
+ m1.cols.times { |i|
449
+ assert_cvscalar_equal(m1[row, i], m2[i])
450
+ }
451
+
452
+ row1 = 3..7
453
+ row2 = 2...8
454
+ [row1, row2].each { |row|
455
+ m3 = m1.get_rows(row)
456
+ w = (row.exclude_end?) ? row.last - row.begin : row.last - row.begin + 1
457
+ assert_equal(w, m3.rows)
458
+ assert_equal(m1.cols, m3.cols)
459
+
460
+ m3.rows.times { |j|
461
+ m3.cols.times { |i|
462
+ assert_cvscalar_equal(m1[row.begin + j, i], m3[j, i])
463
+ }
464
+ }
465
+ }
466
+
467
+ [row1, row2].each { |row|
468
+ delta = 2
469
+ m3 = m1.get_rows(row, 2)
470
+ w = (((row.exclude_end?) ? row.last - row.begin : row.last - row.begin + 1).to_f / delta).ceil
471
+ assert_equal(w, m3.rows)
472
+ assert_equal(m1.cols, m3.cols)
473
+
474
+ m3.rows.times { |j|
475
+ m3.cols.times { |i|
476
+ assert_cvscalar_equal(m1[row.begin + j * delta, i], m3[j, i])
477
+ }
478
+ }
479
+ }
480
+
481
+ assert_raise(TypeError) {
482
+ m1.get_rows(DUMMY_OBJ)
483
+ }
484
+ assert_raise(TypeError) {
485
+ m1.get_rows(1, DUMMY_OBJ)
486
+ }
487
+ end
488
+
489
+ def test_get_cols
490
+ m1 = create_cvmat(10, 20) { |j, i, c| CvScalar.new(c) }
491
+
492
+ col = 2
493
+ m2 = m1.get_cols(col)
494
+ assert_equal(m1.rows, m2.rows)
495
+ assert_equal(1, m2.cols)
496
+ m1.height.times { |j|
497
+ assert_cvscalar_equal(m1[j, col], m2[j])
498
+ }
499
+
500
+ col1 = 3..7
501
+ col2 = 2...8
502
+ [col1, col2].each { |col|
503
+ m3 = m1.get_cols(col)
504
+ w = (col.exclude_end?) ? col.last - col.begin : col.last - col.begin + 1
505
+ assert_equal(m1.rows, m3.rows)
506
+ assert_equal(w, m3.cols)
507
+
508
+ m3.rows.times { |j|
509
+ m3.cols.times { |i|
510
+ assert_cvscalar_equal(m1[j, col.begin + i], m3[j, i])
511
+ }
512
+ }
513
+ }
514
+
515
+ assert_raise(TypeError) {
516
+ m1.get_cols(DUMMY_OBJ)
517
+ }
518
+ end
519
+
520
+ def test_each_row
521
+ m1 = create_cvmat(2, 3)
522
+ a = [[1, 2, 3], [4, 5, 6]]
523
+ a.map! { |a1|
524
+ a1.map! { |a2|
525
+ CvScalar.new(a2, a2, a2, a2).to_ary
526
+ }
527
+ }
528
+
529
+ j = 0
530
+ m1.each_row { |r|
531
+ a[j].size.times { |i|
532
+ assert_cvscalar_equal(a[j][i], r[i])
533
+ }
534
+ j += 1
535
+ }
536
+ end
537
+
538
+ def test_each_col
539
+ m1 = create_cvmat(2, 3)
540
+ a = [[1, 4], [2, 5], [3, 6]]
541
+ a.map! { |a1|
542
+ a1.map! { |a2|
543
+ CvScalar.new(a2, a2, a2, a2).to_ary
544
+ }
545
+ }
546
+
547
+ j = 0
548
+ m1.each_col { |c|
549
+ a[j].size.times { |i|
550
+ assert_cvscalar_equal(a[j][i], c[i])
551
+ }
552
+ j += 1
553
+ }
554
+
555
+ # Alias
556
+ j = 0
557
+ m1.each_column { |c|
558
+ a[j].size.times { |i|
559
+ assert_cvscalar_equal(a[j][i], c[i])
560
+ }
561
+ j += 1
562
+ }
563
+ end
564
+
565
+ def test_diag
566
+ m = create_cvmat(5, 5)
567
+ a = [1, 7, 13, 19, 25].map { |x| CvScalar.new(x, x, x, x) }
568
+ d = m.diag
569
+
570
+ a.each_with_index { |s, i|
571
+ assert_cvscalar_equal(s, d[i])
572
+ }
573
+
574
+ a = [2, 8, 14, 20].map { |x| CvScalar.new(x, x, x, x) }
575
+ d = m.diag(1)
576
+ a.each_with_index { |s, i|
577
+ assert_cvscalar_equal(s, d[i])
578
+ }
579
+
580
+ a = [6, 12, 18, 24].map { |x| CvScalar.new(x, x, x, x) }
581
+ d = m.diag(-1)
582
+ a.each_with_index { |s, i|
583
+ assert_cvscalar_equal(s, d[i])
584
+ }
585
+
586
+ # Alias
587
+ a = [1, 7, 13, 19, 25].map { |x| CvScalar.new(x, x, x, x) }
588
+ d = m.diagonal
589
+ a.each_with_index { |s, i|
590
+ assert_cvscalar_equal(s, d[i])
591
+ }
592
+
593
+ [m.rows, m.cols, -m.rows, -m.cols].each { |d|
594
+ assert_raise(CvStsOutOfRange) {
595
+ m.diag(d)
596
+ }
597
+ }
598
+ end
599
+
600
+ def test_size
601
+ m = CvMat.new(2, 3)
602
+ assert_equal(3, m.size.width)
603
+ assert_equal(2, m.size.height)
604
+ end
605
+
606
+ def test_dims
607
+ m = CvMat.new(2, 3)
608
+ assert_equal([2, 3], m.dims)
609
+ end
610
+
611
+ def test_dim_size
612
+ m = CvMat.new(2, 3)
613
+ assert_equal(2, m.dim_size(0))
614
+ assert_equal(3, m.dim_size(1))
615
+
616
+ assert_raise(TypeError) {
617
+ m.dim_size(DUMMY_OBJ)
618
+ }
619
+ end
620
+
621
+ def test_aref
622
+ m = create_cvmat(2, 3)
623
+ assert_cvscalar_equal(CvScalar.new(1, 1, 1, 1), m[0])
624
+ assert_cvscalar_equal(CvScalar.new(5, 5, 5, 5), m[4])
625
+ assert_cvscalar_equal(CvScalar.new(2, 2, 2, 2), m[0, 1])
626
+ assert_cvscalar_equal(CvScalar.new(4, 4, 4, 4), m[1, 0])
627
+ assert_cvscalar_equal(CvScalar.new(2, 2, 2, 2), m[0, 1, 2])
628
+ assert_cvscalar_equal(CvScalar.new(4, 4, 4, 4), m[1, 0, 3, 4])
629
+
630
+ # Alias
631
+ assert_cvscalar_equal(CvScalar.new(1, 1, 1, 1), m.at(0))
632
+
633
+ assert_raise(TypeError) {
634
+ m[DUMMY_OBJ]
635
+ }
636
+
637
+ assert_raise(CvStsOutOfRange) {
638
+ m[-1]
639
+ }
640
+ assert_raise(CvStsOutOfRange) {
641
+ m[6]
642
+ }
643
+ assert_raise(CvStsOutOfRange) {
644
+ m[2, 2]
645
+ }
646
+ assert_raise(CvStsOutOfRange) {
647
+ m[1, 3]
648
+ }
649
+ assert_raise(CvStsOutOfRange) {
650
+ m[2, 2, 1]
651
+ }
652
+ assert_raise(CvStsOutOfRange) {
653
+ m[1, 3, 1]
654
+ }
655
+ end
656
+
657
+ def test_aset
658
+ m = create_cvmat(2, 3)
659
+ m[0] = CvScalar.new(10, 10, 10, 10)
660
+ assert_cvscalar_equal(CvScalar.new(10, 10, 10, 10), m[0])
661
+ m[1, 0] = CvScalar.new(20, 20, 20, 20)
662
+ assert_cvscalar_equal(CvScalar.new(20, 20, 20, 20), m[1, 0])
663
+ m[1, 0, 2] = CvScalar.new(4, 4, 4, 4)
664
+ assert_cvscalar_equal(CvScalar.new(4, 4, 4, 4), m[1, 0])
665
+ m[1, 0, 2, 4] = CvScalar.new(5, 5, 5, 5)
666
+ assert_cvscalar_equal(CvScalar.new(5, 5, 5, 5), m[1, 0])
667
+
668
+ assert_raise(TypeError) {
669
+ m[DUMMY_OBJ] = CvScalar.new(10, 10, 10, 10)
670
+ }
671
+ assert_raise(TypeError) {
672
+ m[0] = DUMMY_OBJ
673
+ }
674
+
675
+ assert_raise(CvStsOutOfRange) {
676
+ m[-1]
677
+ }
678
+ assert_raise(CvStsOutOfRange) {
679
+ m[6]
680
+ }
681
+ assert_raise(CvStsOutOfRange) {
682
+ m[2, 2]
683
+ }
684
+ assert_raise(CvStsOutOfRange) {
685
+ m[1, 3]
686
+ }
687
+ assert_raise(CvStsOutOfRange) {
688
+ m[2, 2, 1]
689
+ }
690
+ assert_raise(CvStsOutOfRange) {
691
+ m[1, 3, 1]
692
+ }
693
+ end
694
+
695
+ def test_set_data
696
+ [CV_8U, CV_8S, CV_16U, CV_16S, CV_32S].each { |depth|
697
+ a = [10, 20, 30, 40, 50, 60]
698
+ m = CvMat.new(2, 3, depth, 1)
699
+ m.set_data(a)
700
+ (m.rows * m.cols).times { |i|
701
+ assert_equal(a[i], m[i][0])
702
+ }
703
+ }
704
+
705
+ [CV_32F, CV_64F].each { |depth|
706
+ a = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
707
+ m = CvMat.new(2, 3, depth, 1)
708
+ m.set_data(a)
709
+ (m.rows * m.cols).times { |i|
710
+ assert_in_delta(a[i], m[i][0], 1.0e-5)
711
+ }
712
+ }
713
+
714
+ a = [[10, 20, 30], [40, 50, 60]]
715
+ m = CvMat.new(2, 3, CV_8U, 1)
716
+ m.set_data(a)
717
+ (m.rows * m.cols).times { |i|
718
+ assert_equal(a.flatten[i], m[i][0])
719
+ }
720
+
721
+ [CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F].each { |depth|
722
+ m = CvMat.new(2, 3, depth, 1)
723
+ assert_raise(TypeError) {
724
+ a = [DUMMY_OBJ] * 6
725
+ m.set_data(a)
726
+ }
727
+ }
728
+ end
729
+
730
+ def test_fill
731
+ m1 = create_cvmat(2, 3)
732
+ m2 = m1.fill(CvScalar.new(1, 2, 3, 4))
733
+ m1.fill!(CvScalar.new(1, 2, 3, 4))
734
+ m2.height.times { |j|
735
+ m2.width.times { |i|
736
+ assert_cvscalar_equal(CvScalar.new(1, 2, 3, 4), m1[j, i])
737
+ assert_cvscalar_equal(CvScalar.new(1, 2, 3, 4), m2[j, i])
738
+ }
739
+ }
740
+
741
+ m1 = create_cvmat(5, 5)
742
+ m0 = m1.clone
743
+ mask = CvMat.new(m1.height, m1.width, :cv8u, 1).clear
744
+ 2.times { |j|
745
+ 2.times { |i|
746
+ mask[j, i] = CvScalar.new(1, 1, 1, 1)
747
+ }
748
+ }
749
+
750
+ m2 = m1.fill(CvScalar.new(1, 2, 3, 4), mask)
751
+ m1.fill!(CvScalar.new(1, 2, 3, 4), mask)
752
+ m2.height.times { |j|
753
+ m2.width.times { |i|
754
+ if i < 2 and j < 2
755
+ assert_cvscalar_equal(CvScalar.new(1, 2, 3, 4), m1[j, i])
756
+ assert_cvscalar_equal(CvScalar.new(1, 2, 3, 4), m2[j, i])
757
+ else
758
+ assert_cvscalar_equal(m0[j, i], m1[j, i])
759
+ assert_cvscalar_equal(m0[j, i], m2[j, i])
760
+ end
761
+ }
762
+ }
763
+
764
+ # Alias
765
+ m1 = create_cvmat(2, 3)
766
+ m2 = m1.set(CvScalar.new(1, 2, 3, 4))
767
+ m1.set!(CvScalar.new(1, 2, 3, 4))
768
+ m2.height.times { |j|
769
+ m2.width.times { |i|
770
+ assert_cvscalar_equal(CvScalar.new(1, 2, 3, 4), m1[j, i])
771
+ assert_cvscalar_equal(CvScalar.new(1, 2, 3, 4), m2[j, i])
772
+ }
773
+ }
774
+
775
+ m1 = create_cvmat(5, 5)
776
+ m0 = m1.clone
777
+ mask = CvMat.new(m1.height, m1.width, CV_8U, 1).clear
778
+ 2.times { |j|
779
+ 2.times { |i|
780
+ mask[j, i] = CvScalar.new(1, 1, 1, 1)
781
+ }
782
+ }
783
+
784
+ m2 = m1.set(CvScalar.new(1, 2, 3, 4), mask)
785
+ m1.set!(CvScalar.new(1, 2, 3, 4), mask)
786
+ m2.height.times { |j|
787
+ m2.width.times { |i|
788
+ if i < 2 and j < 2
789
+ assert_cvscalar_equal(CvScalar.new(1, 2, 3, 4), m1[j, i])
790
+ assert_cvscalar_equal(CvScalar.new(1, 2, 3, 4), m2[j, i])
791
+ else
792
+ assert_cvscalar_equal(m0[j, i], m1[j, i])
793
+ assert_cvscalar_equal(m0[j, i], m2[j, i])
794
+ end
795
+ }
796
+ }
797
+
798
+ assert_raise(TypeError) {
799
+ m1.fill(DUMMY_OBJ)
800
+ }
801
+ assert_raise(TypeError) {
802
+ m1.fill(CvScalar.new(1), DUMMY_OBJ)
803
+ }
804
+ end
805
+
806
+ def test_clear
807
+ m1 = create_cvmat(2, 3)
808
+ m2 = m1.clear
809
+ m1.clear!
810
+ m2.height.times { |j|
811
+ m2.width.times { |i|
812
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m1[j, i])
813
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m2[j, i])
814
+ }
815
+ }
816
+
817
+ # Alias
818
+ m1 = create_cvmat(2, 3)
819
+ m2 = m1.set_zero
820
+ m1.set_zero!
821
+ m3 = create_cvmat(2, 3)
822
+ m4 = m3.zero
823
+ m3.zero!
824
+ m2.height.times { |j|
825
+ m2.width.times { |i|
826
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m1[j, i])
827
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m2[j, i])
828
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m3[j, i])
829
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m4[j, i])
830
+ }
831
+ }
832
+ end
833
+
834
+ def test_identity
835
+ m1 = create_cvmat(5, 5)
836
+ m2 = m1.identity
837
+ m1.identity!
838
+ m2.height.times { |j|
839
+ m2.width.times { |i|
840
+ if i == j
841
+ assert_cvscalar_equal(CvScalar.new(1, 0, 0, 0), m1[j, i])
842
+ assert_cvscalar_equal(CvScalar.new(1, 0, 0, 0), m2[j, i])
843
+ else
844
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m1[j, i])
845
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m2[j, i])
846
+ end
847
+ }
848
+ }
849
+
850
+ m1 = CvMat.new(5, 5, :cv8u, 4)
851
+ s = CvScalar.new(1, 2, 3, 4)
852
+ m2 = m1.identity(s)
853
+ m1.identity!(s)
854
+ m2.height.times { |j|
855
+ m2.width.times { |i|
856
+ if i == j
857
+ assert_cvscalar_equal(s, m1[j, i])
858
+ assert_cvscalar_equal(s, m2[j, i])
859
+ else
860
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m1[j, i])
861
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m2[j, i])
862
+ end
863
+ }
864
+ }
865
+
866
+ assert_raise(TypeError) {
867
+ m1.identity(DUMMY_OBJ)
868
+ }
869
+ end
870
+
871
+ def test_range
872
+ m1 = CvMat.new(1, 10, CV_32S, 1)
873
+ m2 = m1.range(0, m1.cols)
874
+ m1.range!(0, m1.cols)
875
+ m2.width.times { |i|
876
+ assert_cvscalar_equal(CvScalar.new(i, 0, 0, 0), m1[0, i])
877
+ assert_cvscalar_equal(CvScalar.new(i, 0, 0, 0), m2[0, i])
878
+ }
879
+
880
+ assert_raise(TypeError) {
881
+ m1.range(DUMMY_OBJ, 2)
882
+ }
883
+ assert_raise(TypeError) {
884
+ m1.range(1, DUMMY_OBJ)
885
+ }
886
+ end
887
+
888
+ def test_reshape
889
+ m = create_cvmat(2, 3, CV_8U, 3)
890
+
891
+ vec = m.reshape(0, 1)
892
+ assert_equal(6, vec.width)
893
+ assert_equal(1, vec.height)
894
+ size = m.width * m.height
895
+ size.times { |i|
896
+ assert_cvscalar_equal(m[i], vec[i])
897
+ }
898
+
899
+ ch1 = m.reshape(1)
900
+ assert_equal(9, ch1.width)
901
+ assert_equal(2, ch1.height)
902
+
903
+ m.height.times { |j|
904
+ m.width.times { |i|
905
+ s1 = ch1[j, i * 3][0]
906
+ s2 = ch1[j, i * 3 + 1][0]
907
+ s3 = ch1[j, i * 3 + 2][0]
908
+ assert_cvscalar_equal(m[j, i], CvScalar.new(s1, s2, s3, 0))
909
+ }
910
+ }
911
+
912
+ assert_raise(TypeError) {
913
+ m.reshape(DUMMY_OBJ)
914
+ }
915
+ assert_raise(TypeError) {
916
+ m.reshape(0, DUMMY_OBJ)
917
+ }
918
+ end
919
+
920
+ def test_repeat
921
+ m1 = create_cvmat(2, 3, :cv8u, 3)
922
+ m2 = CvMat.new(6, 9, :cv8u, 3)
923
+ m2 = m1.repeat(m2)
924
+ m2.height.times { |j|
925
+ m2.width.times { |i|
926
+ a = m1[j % m1.height, i % m1.width]
927
+ assert_cvscalar_equal(m2[j, i], a)
928
+ }
929
+ }
930
+ assert_raise(TypeError) {
931
+ m1.repeat(DUMMY_OBJ)
932
+ }
933
+ end
934
+
935
+ def test_flip
936
+ m0 = create_cvmat(2, 3)
937
+
938
+ m1 = m0.clone
939
+ m1.flip!(:x)
940
+ m2 = m0.flip(:x)
941
+ m3 = m0.clone
942
+ m3.flip!(:y)
943
+ m4 = m0.flip(:y)
944
+ m5 = m0.clone
945
+ m5.flip!(:xy)
946
+ m6 = m0.flip(:xy)
947
+ m7 = m0.clone
948
+ m7.flip!
949
+ m8 = m0.flip
950
+
951
+ [m1, m2, m3, m4, m5, m6, m7, m8].each { |m|
952
+ assert_equal(m0.height, m.height)
953
+ assert_equal(m0.width, m.width)
954
+ }
955
+ m0.height.times { |j|
956
+ m0.width.times { |i|
957
+ ri = m0.width - i - 1
958
+ rj = m0.height - j - 1
959
+ assert_cvscalar_equal(m0[j, ri], m1[j, i])
960
+ assert_cvscalar_equal(m0[j, ri], m2[j, i])
961
+ assert_cvscalar_equal(m0[rj, i], m3[j, i])
962
+ assert_cvscalar_equal(m0[rj, i], m4[j, i])
963
+ assert_cvscalar_equal(m0[rj, ri], m5[j, i])
964
+ assert_cvscalar_equal(m0[rj, ri], m6[j, i])
965
+ assert_cvscalar_equal(m0[j, ri], m7[j, i])
966
+ assert_cvscalar_equal(m0[j, ri], m8[j, i])
967
+ }
968
+ }
969
+
970
+ assert_raise(TypeError) {
971
+ m0.flip(DUMMY_OBJ)
972
+ }
973
+ assert_raise(TypeError) {
974
+ m0.flip!(DUMMY_OBJ)
975
+ }
976
+ end
977
+
978
+ def test_split
979
+ m0 = create_cvmat(2, 3, :cv8u, 3) { |j, i, c|
980
+ CvScalar.new(c * 10, c * 20, c * 30)
981
+ }
982
+
983
+ splitted = m0.split
984
+ assert_equal(m0.channel, splitted.size)
985
+ splitted.each_with_index { |m, idx|
986
+ assert_equal(CvMat, m.class)
987
+ assert_equal(m0.height, m.height)
988
+ assert_equal(m0.width, m.width)
989
+ assert_equal(1, m.channel)
990
+
991
+ c = 0
992
+ m0.height.times { |j|
993
+ m0.width.times { |i|
994
+ val = c * 10 * (idx + 1)
995
+ assert_cvscalar_equal(CvScalar.new(val), m[j, i])
996
+ c += 1
997
+ }
998
+ }
999
+ }
1000
+
1001
+ # IplImage#split should return Array<IplImage>
1002
+ image = create_iplimage(2, 3, :cv8u, 3) { |j, i, c|
1003
+ CvScalar.new(c * 10, c * 20, c * 30)
1004
+ }
1005
+
1006
+ splitted = image.split
1007
+ assert_equal(3, splitted.size)
1008
+ splitted.each_with_index { |img, channel|
1009
+ assert_equal(IplImage, img.class)
1010
+ assert_equal(image.height, img.height)
1011
+ assert_equal(image.width, img.width)
1012
+ assert_equal(1, img.channel)
1013
+
1014
+ img.height.times { |j|
1015
+ img.width.times { |i|
1016
+ val = image[j, i][channel]
1017
+ assert_cvscalar_equal(CvScalar.new(val), img[j, i])
1018
+ }
1019
+ }
1020
+ }
1021
+ end
1022
+
1023
+ def test_merge
1024
+ m0 = create_cvmat(2, 3, :cv8u, 4) { |j, i, c|
1025
+ CvScalar.new(c * 10, c * 20, c * 30, c * 40)
1026
+ }
1027
+ m1 = create_cvmat(2, 3, :cv8u, 1) { |j, i, c|
1028
+ CvScalar.new(c * 10)
1029
+ }
1030
+ m2 = create_cvmat(2, 3, :cv8u, 1) { |j, i, c|
1031
+ CvScalar.new(c * 20)
1032
+ }
1033
+ m3 = create_cvmat(2, 3, :cv8u, 1) { |j, i, c|
1034
+ CvScalar.new(c * 30)
1035
+ }
1036
+ m4 = create_cvmat(2, 3, :cv8u, 1) { |j, i, c|
1037
+ CvScalar.new(c * 40)
1038
+ }
1039
+
1040
+ m = CvMat.merge(m1, m2, m3, m4)
1041
+
1042
+ assert_equal(m0.height, m.height)
1043
+ assert_equal(m0.width, m.width)
1044
+ m0.height.times { |j|
1045
+ m0.width.times { |i|
1046
+ assert_cvscalar_equal(m0[j, i], m[j, i])
1047
+ }
1048
+ }
1049
+
1050
+ m5 = create_cvmat(2, 3, :cv8u, 1) { |j, i, c|
1051
+ CvScalar.new(c * 50)
1052
+ }
1053
+
1054
+ assert_raise(TypeError) {
1055
+ CvMat.merge(DUMMY_OBJ)
1056
+ }
1057
+ assert_raise(ArgumentError) {
1058
+ CvMat.merge
1059
+ }
1060
+ assert_raise(ArgumentError) {
1061
+ CvMat.merge(m1, m2, m3, m4, m5)
1062
+ }
1063
+ assert_raise(ArgumentError) {
1064
+ CvMat.merge(CvMat.new(1, 2, :cv8u, 2))
1065
+ }
1066
+ assert_raise(ArgumentError) {
1067
+ CvMat.merge(CvMat.new(1, 2, :cv8u, 1),
1068
+ CvMat.new(2, 2, :cv8u, 1))
1069
+ }
1070
+ assert_raise(ArgumentError) {
1071
+ CvMat.merge(CvMat.new(1, 2, :cv8u, 1),
1072
+ CvMat.new(1, 2, :cv32f, 1))
1073
+ }
1074
+ end
1075
+
1076
+ def test_rand_shuffle
1077
+ m0 = create_cvmat(2, 3)
1078
+ m1 = m0.clone
1079
+ m1.rand_shuffle!
1080
+ m2 = m0.rand_shuffle
1081
+ m3 = m0.clone
1082
+ m3.rand_shuffle!(123, 234)
1083
+ m4 = m0.rand_shuffle(123, 234)
1084
+
1085
+ assert_shuffled_equal = lambda { |src, shuffled|
1086
+ assert_equal(src.width, shuffled.width)
1087
+ assert_equal(src.height, shuffled.height)
1088
+ mat0, mat1 = [], []
1089
+ src.height { |j|
1090
+ src.width { |i|
1091
+ mat0 << src[j, i].to_s
1092
+ mat1 << shuffled[j, i].to_s
1093
+ }
1094
+ }
1095
+ assert_equal(0, (mat0 - mat1).size)
1096
+ }
1097
+
1098
+ [m1, m2, m3, m4].each { |m|
1099
+ assert_shuffled_equal.call(m0, m)
1100
+ }
1101
+
1102
+ assert_raise(TypeError) {
1103
+ m0.rand_shuffle(DUMMY_OBJ)
1104
+ }
1105
+ assert_raise(TypeError) {
1106
+ m0.rand_shuffle(123, DUMMY_OBJ)
1107
+ }
1108
+ end
1109
+
1110
+ def test_lut
1111
+ m0 = create_cvmat(2, 3, :cv8u, 3)
1112
+ lut_mat = create_cvmat(1, 256, :cv8u, 3) { |j, i, c|
1113
+ CvScalar.new(255 - c, 255 - c, 255 - c)
1114
+ }
1115
+
1116
+ m = m0.lut(lut_mat)
1117
+ assert_equal(m0.height, m.height)
1118
+ assert_equal(m0.width, m.width)
1119
+ m0.height.times { |j|
1120
+ m0.width.times { |i|
1121
+ r, g, b = m0[j, i].to_ary.map { |c| 255 - c }
1122
+ assert_cvscalar_equal(CvScalar.new(r, g, b, 0), m[j, i])
1123
+ }
1124
+ }
1125
+
1126
+ assert_raise(TypeError) {
1127
+ m0.lut(DUMMY_OBJ)
1128
+ }
1129
+ end
1130
+
1131
+ def test_convert_scale
1132
+ m0 = create_cvmat(2, 3, :cv32f, 4) { |j, i, c|
1133
+ CvScalar.new(-c, -c, -c, -c)
1134
+ }
1135
+
1136
+ m1 = m0.convert_scale(:depth => :cv8u)
1137
+ m2 = m0.convert_scale(:scale => 1.5)
1138
+ m3 = m0.convert_scale(:shift => 10.0)
1139
+ m4 = m0.convert_scale(:depth => CV_16U)
1140
+
1141
+ [m1, m2, m3, m4].each { |m|
1142
+ assert_equal(m0.height, m.height)
1143
+ assert_equal(m0.width, m.width)
1144
+ }
1145
+ m0.height.times { |j|
1146
+ m0.width.times { |i|
1147
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m1[j, i])
1148
+ a = m0[j, i].to_ary.map { |x| x * 1.5 }
1149
+ assert_in_delta(a, m2[j, i], 0.001)
1150
+ a = m0[j, i].to_ary.map { |x| x + 10.0 }
1151
+ assert_in_delta(a, m3[j, i], 0.001)
1152
+ assert_cvscalar_equal(CvScalar.new(0, 0, 0, 0), m4[j, i])
1153
+ }
1154
+ }
1155
+
1156
+ assert_raise(TypeError) {
1157
+ m0.convert_scale(DUMMY_OBJ)
1158
+ }
1159
+ end
1160
+
1161
+ def test_convert_scale_abs
1162
+ m0 = create_cvmat(2, 3, :cv8u, 4) { |j, i, c|
1163
+ CvScalar.new(c, c, c, c)
1164
+ }
1165
+
1166
+ m1 = m0.convert_scale_abs(:depth => :cv64f)
1167
+ m2 = m0.convert_scale_abs(:scale => 2)
1168
+ m3 = m0.convert_scale_abs(:shift => 10.0)
1169
+ m4 = m0.convert_scale_abs(:depth => CV_64F)
1170
+
1171
+ [m1, m2, m3, m4].each { |m|
1172
+ assert_equal(m0.height, m.height)
1173
+ assert_equal(m0.width, m.width)
1174
+ }
1175
+ m0.height.times { |j|
1176
+ m0.width.times { |i|
1177
+ assert_cvscalar_equal(m0[j, i], m1[j, i])
1178
+ a = m0[j, i].to_ary.map { |x| (x * 2).abs }
1179
+ assert_in_delta(a, m2[j, i], 0.001)
1180
+ a = m0[j, i].to_ary.map { |x| (x + 10.0).abs }
1181
+ assert_in_delta(a, m3[j, i], 0.001)
1182
+ assert_cvscalar_equal(m0[j, i], m4[j, i])
1183
+ }
1184
+ }
1185
+
1186
+ assert_raise(TypeError) {
1187
+ m0.convert_scale(DUMMY_OBJ)
1188
+ }
1189
+ end
1190
+
1191
+ def test_add
1192
+ m1 = create_cvmat(6, 4, :cv32f, 4) { |j, i, c|
1193
+ CvScalar.new(c * 0.1, c * 0.2, c * 0.3, c * 0.4)
1194
+ }
1195
+ m2 = create_cvmat(6, 4, :cv32f, 4) { |j, i, c|
1196
+ CvScalar.new(c * 1, c * 2, c * 3, c * 4)
1197
+ }
1198
+
1199
+ # CvMat + CvMat
1200
+ m3 = m1.add(m2)
1201
+ assert_equal(m1.height, m3.height)
1202
+ assert_equal(m1.width, m3.width)
1203
+ n = 0
1204
+ m1.height.times { |j|
1205
+ m1.width.times { |i|
1206
+ s = CvScalar.new(n * 1.1, n * 2.2, n * 3.3, n * 4.4)
1207
+ assert_in_delta(s, m3[j, i], 0.001)
1208
+ n += 1
1209
+ }
1210
+ }
1211
+
1212
+ # CvMat + CvScalar
1213
+ s1 = CvScalar.new(1, 2, 3, 4)
1214
+ m3 = m1.add(s1)
1215
+ assert_equal(m1.height, m3.height)
1216
+ assert_equal(m1.width, m3.width)
1217
+ n = 0
1218
+ m1.height.times { |j|
1219
+ m1.width.times { |i|
1220
+ s = CvScalar.new(n * 0.1 + 1, n * 0.2 + 2, n * 0.3 + 3, n * 0.4 + 4)
1221
+ assert_in_delta(s, m3[j, i], 0.001)
1222
+ n += 1
1223
+ }
1224
+ }
1225
+
1226
+ # Alias
1227
+ m3 = m1 + m2
1228
+ assert_equal(m1.height, m3.height)
1229
+ assert_equal(m1.width, m3.width)
1230
+ n = 0
1231
+ m1.height.times { |j|
1232
+ m1.width.times { |i|
1233
+ s = CvScalar.new(n * 1.1, n * 2.2, n * 3.3, n * 4.4)
1234
+ assert_in_delta(s, m3[j, i], 0.001)
1235
+ n += 1
1236
+ }
1237
+ }
1238
+
1239
+ # CvMat + CvMat with Mask
1240
+ mask = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1241
+ (i < 3 and j < 2) ? 1 : 0
1242
+ }
1243
+
1244
+ m4 = m1.add(m2, mask)
1245
+ assert_equal(m1.height, m4.height)
1246
+ assert_equal(m1.width, m4.width)
1247
+ n = 0
1248
+ m1.height.times { |j|
1249
+ m1.width.times { |i|
1250
+ if i < 3 and j < 2
1251
+ s = CvScalar.new(n * 1.1, n * 2.2, n * 3.3, n * 4.4)
1252
+ else
1253
+ s = m1[j, i]
1254
+ end
1255
+ assert_in_delta(s, m4[j, i], 0.001)
1256
+ n += 1
1257
+ }
1258
+ }
1259
+
1260
+ # CvMat + CvScalar with Mask
1261
+ m4 = m1.add(s1, mask)
1262
+ assert_equal(m1.height, m4.height)
1263
+ assert_equal(m1.width, m4.width)
1264
+ n = 0
1265
+ m1.height.times { |j|
1266
+ m1.width.times { |i|
1267
+ if i < 3 and j < 2
1268
+ s = CvScalar.new(n * 0.1 + 1, n * 0.2 + 2, n * 0.3 + 3, n * 0.4 + 4)
1269
+ else
1270
+ s = m1[j, i]
1271
+ end
1272
+ assert_in_delta(s, m4[j, i], 0.001)
1273
+ n += 1
1274
+ }
1275
+ }
1276
+
1277
+ assert_raise(TypeError) {
1278
+ m1.add(DUMMY_OBJ)
1279
+ }
1280
+ assert_raise(TypeError) {
1281
+ m1.add(CvScalar.new(1), DUMMY_OBJ)
1282
+ }
1283
+ end
1284
+
1285
+ def test_sub
1286
+ m1 = create_cvmat(6, 4, :cv32f, 4) { |j, i, c|
1287
+ CvScalar.new(c * 0.1, c * 0.2, c * 0.3, c * 0.4)
1288
+ }
1289
+ m2 = create_cvmat(6, 4, :cv32f, 4) { |j, i, c|
1290
+ CvScalar.new(c * 1, c * 2, c * 3, c * 4)
1291
+ }
1292
+
1293
+ # CvMat - CvMat
1294
+ m3 = m1.sub(m2)
1295
+ assert_equal(m1.height, m3.height)
1296
+ assert_equal(m1.width, m3.width)
1297
+ n = 0
1298
+ m1.height.times { |j|
1299
+ m1.width.times { |i|
1300
+ s = CvScalar.new(-n * 0.9, -n * 1.8, -n * 2.7, -n * 3.6)
1301
+ assert_in_delta(s, m3[j, i], 0.001)
1302
+ n += 1
1303
+ }
1304
+ }
1305
+
1306
+ # CvMat - CvScalar
1307
+ s1 = CvScalar.new(1, 2, 3, 4)
1308
+ m3 = m1.sub(s1)
1309
+ assert_equal(m1.height, m3.height)
1310
+ assert_equal(m1.width, m3.width)
1311
+ n = 0
1312
+ m1.height.times { |j|
1313
+ m1.width.times { |i|
1314
+ s = CvScalar.new(n * 0.1 - 1, n * 0.2 - 2, n * 0.3 - 3, n * 0.4 - 4)
1315
+ assert_in_delta(s, m3[j, i], 0.001)
1316
+ n += 1
1317
+ }
1318
+ }
1319
+
1320
+ # Alias
1321
+ m3 = m1 - m2
1322
+ assert_equal(m1.height, m3.height)
1323
+ assert_equal(m1.width, m3.width)
1324
+ n = 0
1325
+ m1.height.times { |j|
1326
+ m1.width.times { |i|
1327
+ s = CvScalar.new(-n * 0.9, -n * 1.8, -n * 2.7, -n * 3.6)
1328
+ assert_in_delta(s, m3[j, i], 0.001)
1329
+ n += 1
1330
+ }
1331
+ }
1332
+
1333
+ mask = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1334
+ (i < 3 and j < 2) ? 1 : 0
1335
+ }
1336
+
1337
+ # CvMat - CvMat with Mask
1338
+ m4 = m1.sub(m2, mask)
1339
+ assert_equal(m1.height, m4.height)
1340
+ assert_equal(m1.width, m4.width)
1341
+ n = 0
1342
+ m1.height.times { |j|
1343
+ m1.width.times { |i|
1344
+ if i < 3 and j < 2
1345
+ s = CvScalar.new(-n * 0.9, -n * 1.8, -n * 2.7, -n * 3.6)
1346
+ else
1347
+ s = m1[j, i]
1348
+ end
1349
+ assert_in_delta(s, m4[j, i], 0.001)
1350
+ n += 1
1351
+ }
1352
+ }
1353
+
1354
+ # CvMat - CvScalar with Mask
1355
+ m4 = m1.sub(s1, mask)
1356
+ assert_equal(m1.height, m4.height)
1357
+ assert_equal(m1.width, m4.width)
1358
+ n = 0
1359
+ m1.height.times { |j|
1360
+ m1.width.times { |i|
1361
+ if i < 3 and j < 2
1362
+ s = CvScalar.new(n * 0.1 - 1, n * 0.2 - 2, n * 0.3 - 3, n * 0.4 - 4)
1363
+ else
1364
+ s = m1[j, i]
1365
+ end
1366
+ assert_in_delta(s, m4[j, i], 0.001)
1367
+ n += 1
1368
+ }
1369
+ }
1370
+
1371
+ assert_raise(TypeError) {
1372
+ m1.sub(DUMMY_OBJ)
1373
+ }
1374
+ assert_raise(TypeError) {
1375
+ m1.sub(CvScalar.new(1), DUMMY_OBJ)
1376
+ }
1377
+ end
1378
+
1379
+ def test_mul
1380
+ m1 = create_cvmat(3, 3, :cv32f)
1381
+ s1 = CvScalar.new(0.1, 0.2, 0.3, 0.4)
1382
+ m2 = create_cvmat(3, 3, :cv32f) { s1 }
1383
+
1384
+ # CvMat * CvMat
1385
+ m3 = m1.mul(m2)
1386
+ assert_equal(m1.height, m3.height)
1387
+ assert_equal(m1.width, m3.width)
1388
+ assert_each_cvscalar(m3, 0.001) { |j, i, c|
1389
+ n = c + 1
1390
+ CvScalar.new(n * 0.1, n * 0.2, n * 0.3, n * 0.4)
1391
+ }
1392
+
1393
+ # CvMat * CvMat * scale
1394
+ scale = 2.5
1395
+ m3 = m1.mul(m2, scale)
1396
+ assert_equal(m1.height, m3.height)
1397
+ assert_equal(m1.width, m3.width)
1398
+ assert_each_cvscalar(m3, 0.001) { |j, i, c|
1399
+ n = (c + 1) * scale
1400
+ CvScalar.new(n * 0.1, n * 0.2, n * 0.3, n * 0.4)
1401
+ }
1402
+
1403
+ # CvMat * CvScalar
1404
+ scale = 2.5
1405
+ m3 = m1.mul(s1)
1406
+ assert_equal(m1.height, m3.height)
1407
+ assert_equal(m1.width, m3.width)
1408
+ assert_each_cvscalar(m3, 0.001) { |j, i, c|
1409
+ n = c + 1
1410
+ CvScalar.new(n * 0.1, n * 0.2, n * 0.3, n * 0.4)
1411
+ }
1412
+
1413
+ # CvMat * CvScalar * scale
1414
+ m3 = m1.mul(s1, scale)
1415
+ assert_equal(m1.height, m3.height)
1416
+ assert_equal(m1.width, m3.width)
1417
+ assert_each_cvscalar(m3, 0.001) { |j, i, c|
1418
+ n = (c + 1) * scale
1419
+ CvScalar.new(n * 0.1, n * 0.2, n * 0.3, n * 0.4)
1420
+ }
1421
+
1422
+ assert_raise(TypeError) {
1423
+ m1.mul(DUMMY_OBJ)
1424
+ }
1425
+ assert_raise(TypeError) {
1426
+ m1.mul(m2, DUMMY_OBJ)
1427
+ }
1428
+ end
1429
+
1430
+ def test_mat_mul
1431
+ m0 = create_cvmat(3, 3, :cv32f, 1) { |j, i, c|
1432
+ CvScalar.new(c * 0.1)
1433
+ }
1434
+ m1 = create_cvmat(3, 3, :cv32f, 1) { |j, i, c|
1435
+ CvScalar.new(c)
1436
+ }
1437
+ m2 = create_cvmat(3, 3, :cv32f, 1) { |j, i, c|
1438
+ CvScalar.new(c + 1)
1439
+ }
1440
+
1441
+ m3 = m0.mat_mul(m1)
1442
+ m4 = m0 * m1
1443
+
1444
+ [m3, m4].each { |m|
1445
+ assert_equal(m1.width, m.width)
1446
+ assert_equal(m1.height, m.height)
1447
+ assert_in_delta(1.5, m[0, 0][0], 0.001)
1448
+ assert_in_delta(1.8, m[0, 1][0], 0.001)
1449
+ assert_in_delta(2.1, m[0, 2][0], 0.001)
1450
+ assert_in_delta(4.2, m[1, 0][0], 0.001)
1451
+ assert_in_delta(5.4, m[1, 1][0], 0.001)
1452
+ assert_in_delta(6.6, m[1, 2][0], 0.001)
1453
+ assert_in_delta(6.9, m[2, 0][0], 0.001)
1454
+ assert_in_delta(9, m[2, 1][0], 0.001)
1455
+ assert_in_delta(11.1, m[2, 2][0], 0.001)
1456
+ }
1457
+
1458
+ m5 = m0.mat_mul(m1, m2)
1459
+ [m5].each { |m|
1460
+ assert_equal(m1.width, m.width)
1461
+ assert_equal(m1.height, m.height)
1462
+ assert_in_delta(2.5, m[0, 0][0], 0.001)
1463
+ assert_in_delta(3.8, m[0, 1][0], 0.001)
1464
+ assert_in_delta(5.1, m[0, 2][0], 0.001)
1465
+ assert_in_delta(8.2, m[1, 0][0], 0.001)
1466
+ assert_in_delta(10.4, m[1, 1][0], 0.001)
1467
+ assert_in_delta(12.6, m[1, 2][0], 0.001)
1468
+ assert_in_delta(13.9, m[2, 0][0], 0.001)
1469
+ assert_in_delta(17, m[2, 1][0], 0.001)
1470
+ assert_in_delta(20.1, m[2, 2][0], 0.001)
1471
+ }
1472
+
1473
+ assert_raise(TypeError) {
1474
+ m0.mat_mul(DUMMY_OBJ)
1475
+ }
1476
+ assert_raise(TypeError) {
1477
+ m0.mat_mul(m1, DUMMY_OBJ)
1478
+ }
1479
+ end
1480
+
1481
+ def test_div
1482
+ m1 = create_cvmat(3, 3, :cv32f)
1483
+ s1 = CvScalar.new(0.1, 0.2, 0.3, 0.4)
1484
+ m2 = create_cvmat(3, 3, :cv32f) { s1 }
1485
+
1486
+ # CvMat / CvMat
1487
+ m3 = m1.div(m2)
1488
+ assert_equal(m1.height, m3.height)
1489
+ assert_equal(m1.width, m3.width)
1490
+ assert_each_cvscalar(m3, 0.001) { |j, i, c|
1491
+ n = c + 1
1492
+ CvScalar.new(n / 0.1, n / 0.2, n / 0.3, n / 0.4)
1493
+ }
1494
+
1495
+ # scale * CvMat / CvMat
1496
+ scale = 2.5
1497
+ m3 = m1.div(m2, scale)
1498
+ assert_equal(m1.height, m3.height)
1499
+ assert_equal(m1.width, m3.width)
1500
+ assert_each_cvscalar(m3, 0.001) { |j, i, c|
1501
+ n = (c + 1) * scale
1502
+ CvScalar.new(n / 0.1, n / 0.2, n / 0.3, n / 0.4)
1503
+ }
1504
+
1505
+ # CvMat / CvScalar
1506
+ scale = 2.5
1507
+ m3 = m1.div(s1)
1508
+ assert_equal(m1.height, m3.height)
1509
+ assert_equal(m1.width, m3.width)
1510
+ assert_each_cvscalar(m3, 0.001) { |j, i, c|
1511
+ n = c + 1
1512
+ CvScalar.new(n / 0.1, n / 0.2, n / 0.3, n / 0.4)
1513
+ }
1514
+
1515
+ # scale * CvMat / CvScalar
1516
+ m3 = m1.div(s1, scale)
1517
+ assert_equal(m1.height, m3.height)
1518
+ assert_equal(m1.width, m3.width)
1519
+ assert_each_cvscalar(m3, 0.001) { |j, i, c|
1520
+ n = (c + 1) * scale
1521
+ CvScalar.new(n / 0.1, n / 0.2, n / 0.3, n / 0.4)
1522
+ }
1523
+
1524
+ # Alias
1525
+ m3 = m1 / m2
1526
+ assert_equal(m1.height, m3.height)
1527
+ assert_equal(m1.width, m3.width)
1528
+ assert_each_cvscalar(m3, 0.001) { |j, i, c|
1529
+ n = c + 1
1530
+ CvScalar.new(n / 0.1, n / 0.2, n / 0.3, n / 0.4)
1531
+ }
1532
+
1533
+ assert_raise(TypeError) {
1534
+ m1.div(DUMMY_OBJ)
1535
+ }
1536
+ assert_raise(TypeError) {
1537
+ m1.div(m2, DUMMY_OBJ)
1538
+ }
1539
+ end
1540
+
1541
+ def test_add_weighted
1542
+ m1 = create_cvmat(3, 2, :cv8u) { |j, i, c| c + 1 }
1543
+ m2 = create_cvmat(3, 2, :cv8u) { |j, i, c| (c + 1) * 10 }
1544
+ a = 2.0
1545
+ b = 0.1
1546
+ g = 100
1547
+ m3 = CvMat.add_weighted(m1, a, m2, b, g)
1548
+ assert_equal(m1.class, m3.class)
1549
+ assert_equal(m1.rows, m3.rows)
1550
+ assert_equal(m1.cols, m3.cols)
1551
+ assert_equal(m1.depth, m3.depth)
1552
+ assert_equal(m1.channel, m3.channel)
1553
+
1554
+ m1.rows.times { |j|
1555
+ m1.cols.times { |i|
1556
+ expected = m1[j, i][0] * a + m2[j, i][0] * b + g
1557
+ assert_equal(expected, m3[j, i][0])
1558
+ }
1559
+ }
1560
+
1561
+ assert_raise(TypeError) {
1562
+ CvMat.add_weighted(DUMMY_OBJ, a, m2, b, g)
1563
+ }
1564
+ assert_raise(TypeError) {
1565
+ CvMat.add_weighted(m1, DUMMY_OBJ, m2, b, g)
1566
+ }
1567
+ assert_raise(TypeError) {
1568
+ CvMat.add_weighted(m1, a, DUMMY_OBJ, b, g)
1569
+ }
1570
+ assert_raise(TypeError) {
1571
+ CvMat.add_weighted(m1, a, m2, DUMMY_OBJ, g)
1572
+ }
1573
+ assert_raise(TypeError) {
1574
+ CvMat.add_weighted(m1, a, m2, b, DUMMY_OBJ)
1575
+ }
1576
+ end
1577
+
1578
+ def test_and
1579
+ m1 = create_cvmat(6, 4)
1580
+ s1 = CvScalar.new(1, 2, 3, 4)
1581
+ m2 = create_cvmat(6, 4) { s1 }
1582
+ mask = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1583
+ s = (i < 3 and j < 2) ? 1 : 0
1584
+ CvScalar.new(s)
1585
+ }
1586
+
1587
+ # CvMat & CvMat
1588
+ m3 = m1.and(m2)
1589
+ assert_equal(m1.height, m3.height)
1590
+ assert_equal(m1.width, m3.width)
1591
+ assert_each_cvscalar(m3) { |j, i, c|
1592
+ n = c + 1
1593
+ CvScalar.new(n & 1, n & 2, n & 3, n & 4)
1594
+ }
1595
+
1596
+ # CvMat & CvMat with mask
1597
+ m3 = m1.and(m2, mask)
1598
+ assert_equal(m1.height, m3.height)
1599
+ assert_equal(m1.width, m3.width)
1600
+ assert_each_cvscalar(m3) { |j, i, c|
1601
+ n = c + 1
1602
+ if i < 3 and j < 2
1603
+ CvScalar.new(n & 1, n & 2, n & 3, n & 4)
1604
+ else
1605
+ CvScalar.new(n, n, n, n)
1606
+ end
1607
+ }
1608
+
1609
+ # CvMat & CvScalar
1610
+ m3 = m1.and(s1)
1611
+ assert_equal(m1.height, m3.height)
1612
+ assert_equal(m1.width, m3.width)
1613
+ assert_each_cvscalar(m3) { |j, i, c|
1614
+ n = c + 1
1615
+ CvScalar.new(n & 1, n & 2, n & 3, n & 4)
1616
+ }
1617
+
1618
+ # CvMat & CvScalar with mask
1619
+ m3 = m1.and(s1, mask)
1620
+ assert_equal(m1.height, m3.height)
1621
+ assert_equal(m1.width, m3.width)
1622
+ assert_each_cvscalar(m3) { |j, i, c|
1623
+ n = c + 1
1624
+ if i < 3 and j < 2
1625
+ CvScalar.new(n & 1, n & 2, n & 3, n & 4)
1626
+ else
1627
+ CvScalar.new(n, n, n, n)
1628
+ end
1629
+ }
1630
+
1631
+ # Alias
1632
+ m3 = m1 & m2
1633
+ assert_equal(m1.height, m3.height)
1634
+ assert_equal(m1.width, m3.width)
1635
+ assert_each_cvscalar(m3) { |j, i, c|
1636
+ n = c + 1
1637
+ CvScalar.new(n & 1, n & 2, n & 3, n & 4)
1638
+ }
1639
+
1640
+ m3 = m1 & s1
1641
+ assert_equal(m1.height, m3.height)
1642
+ assert_equal(m1.width, m3.width)
1643
+ assert_each_cvscalar(m3) { |j, i, c|
1644
+ n = c + 1
1645
+ CvScalar.new(n & 1, n & 2, n & 3, n & 4)
1646
+ }
1647
+
1648
+ assert_raise(TypeError) {
1649
+ m1.and(DUMMY_OBJ)
1650
+ }
1651
+ assert_raise(TypeError) {
1652
+ m1.and(m2, DUMMY_OBJ)
1653
+ }
1654
+ end
1655
+
1656
+ def test_or
1657
+ m1 = create_cvmat(6, 4)
1658
+ s1 = CvScalar.new(1, 2, 3, 4)
1659
+ m2 = create_cvmat(6, 4) { s1 }
1660
+ mask = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1661
+ s = (i < 3 and j < 2) ? 1 : 0
1662
+ CvScalar.new(s)
1663
+ }
1664
+
1665
+ # CvMat | CvMat
1666
+ m3 = m1.or(m2)
1667
+ assert_equal(m1.height, m3.height)
1668
+ assert_equal(m1.width, m3.width)
1669
+ assert_each_cvscalar(m3) { |j, i, c|
1670
+ n = c + 1
1671
+ CvScalar.new(n | 1, n | 2, n | 3, n | 4)
1672
+ }
1673
+
1674
+ # CvMat | CvMat with mask
1675
+ m3 = m1.or(m2, mask)
1676
+ assert_equal(m1.height, m3.height)
1677
+ assert_equal(m1.width, m3.width)
1678
+ assert_each_cvscalar(m3) { |j, i, c|
1679
+ n = c + 1
1680
+ if i < 3 and j < 2
1681
+ CvScalar.new(n | 1, n | 2, n | 3, n | 4)
1682
+ else
1683
+ CvScalar.new(n, n, n, n)
1684
+ end
1685
+ }
1686
+
1687
+ # CvMat | CvScalar
1688
+ m3 = m1.or(s1)
1689
+ assert_equal(m1.height, m3.height)
1690
+ assert_equal(m1.width, m3.width)
1691
+ assert_each_cvscalar(m3) { |j, i, c|
1692
+ n = c + 1
1693
+ CvScalar.new(n | 1, n | 2, n | 3, n | 4)
1694
+ }
1695
+
1696
+ # CvMat | CvScalar with mask
1697
+ m3 = m1.or(s1, mask)
1698
+ assert_equal(m1.height, m3.height)
1699
+ assert_equal(m1.width, m3.width)
1700
+ assert_each_cvscalar(m3) { |j, i, c|
1701
+ n = c + 1
1702
+ if i < 3 and j < 2
1703
+ CvScalar.new(n | 1, n | 2, n | 3, n | 4)
1704
+ else
1705
+ CvScalar.new(n, n, n, n)
1706
+ end
1707
+ }
1708
+
1709
+ # Alias
1710
+ m3 = m1 | m2
1711
+ assert_equal(m1.height, m3.height)
1712
+ assert_equal(m1.width, m3.width)
1713
+ assert_each_cvscalar(m3) { |j, i, c|
1714
+ n = c + 1
1715
+ CvScalar.new(n | 1, n | 2, n | 3, n | 4)
1716
+ }
1717
+
1718
+ m3 = m1 | s1
1719
+ assert_equal(m1.height, m3.height)
1720
+ assert_equal(m1.width, m3.width)
1721
+ assert_each_cvscalar(m3) { |j, i, c|
1722
+ n = c + 1
1723
+ CvScalar.new(n | 1, n | 2, n | 3, n | 4)
1724
+ }
1725
+
1726
+ assert_raise(TypeError) {
1727
+ m1.or(DUMMY_OBJ)
1728
+ }
1729
+ assert_raise(TypeError) {
1730
+ m1.or(m2, DUMMY_OBJ)
1731
+ }
1732
+ end
1733
+
1734
+ def test_xor
1735
+ m1 = create_cvmat(6, 4)
1736
+ s1 = CvScalar.new(1, 2, 3, 4)
1737
+ m2 = create_cvmat(6, 4) { s1 }
1738
+ mask = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1739
+ s = (i < 3 and j < 2) ? 1 : 0
1740
+ CvScalar.new(s)
1741
+ }
1742
+
1743
+ # CvMat ^ CvMat
1744
+ m3 = m1.xor(m2)
1745
+ assert_equal(m1.height, m3.height)
1746
+ assert_equal(m1.width, m3.width)
1747
+ assert_each_cvscalar(m3) { |j, i, c|
1748
+ n = c + 1
1749
+ CvScalar.new(n ^ 1, n ^ 2, n ^ 3, n ^ 4)
1750
+ }
1751
+
1752
+ # CvMat ^ CvMat with mask
1753
+ m3 = m1.xor(m2, mask)
1754
+ assert_equal(m1.height, m3.height)
1755
+ assert_equal(m1.width, m3.width)
1756
+ assert_each_cvscalar(m3) { |j, i, c|
1757
+ n = c + 1
1758
+ if i < 3 and j < 2
1759
+ CvScalar.new(n ^ 1, n ^ 2, n ^ 3, n ^ 4)
1760
+ else
1761
+ CvScalar.new(n, n, n, n)
1762
+ end
1763
+ }
1764
+
1765
+ # CvMat ^ CvScalar
1766
+ m3 = m1.xor(s1)
1767
+ assert_equal(m1.height, m3.height)
1768
+ assert_equal(m1.width, m3.width)
1769
+ assert_each_cvscalar(m3) { |j, i, c|
1770
+ n = c + 1
1771
+ CvScalar.new(n ^ 1, n ^ 2, n ^ 3, n ^ 4)
1772
+ }
1773
+
1774
+ # CvMat ^ CvScalar with mask
1775
+ m3 = m1.xor(s1, mask)
1776
+ assert_equal(m1.height, m3.height)
1777
+ assert_equal(m1.width, m3.width)
1778
+ assert_each_cvscalar(m3) { |j, i, c|
1779
+ n = c + 1
1780
+ if i < 3 and j < 2
1781
+ CvScalar.new(n ^ 1, n ^ 2, n ^ 3, n ^ 4)
1782
+ else
1783
+ CvScalar.new(n, n, n, n)
1784
+ end
1785
+ }
1786
+
1787
+ # Alias
1788
+ m3 = m1 ^ m2
1789
+ assert_equal(m1.height, m3.height)
1790
+ assert_equal(m1.width, m3.width)
1791
+ assert_each_cvscalar(m3) { |j, i, c|
1792
+ n = c + 1
1793
+ CvScalar.new(n ^ 1, n ^ 2, n ^ 3, n ^ 4)
1794
+ }
1795
+
1796
+ m3 = m1 ^ s1
1797
+ assert_equal(m1.height, m3.height)
1798
+ assert_equal(m1.width, m3.width)
1799
+ assert_each_cvscalar(m3) { |j, i, c|
1800
+ n = c + 1
1801
+ CvScalar.new(n ^ 1, n ^ 2, n ^ 3, n ^ 4)
1802
+ }
1803
+
1804
+ assert_raise(TypeError) {
1805
+ m1.xor(DUMMY_OBJ)
1806
+ }
1807
+ assert_raise(TypeError) {
1808
+ m1.xor(m2, DUMMY_OBJ)
1809
+ }
1810
+ end
1811
+
1812
+ def test_not
1813
+ m1 = create_cvmat(6, 4, :cv8s)
1814
+ m2 = m1.not;
1815
+ m3 = m1.clone
1816
+ m3.not!
1817
+ [m2, m3].each { |m|
1818
+ assert_equal(m1.height, m.height)
1819
+ assert_equal(m1.width, m.width)
1820
+ assert_each_cvscalar(m) { |j, i, c|
1821
+ n = c + 1
1822
+ CvScalar.new(~n, ~n, ~n, ~n)
1823
+ }
1824
+ }
1825
+ end
1826
+
1827
+ def test_eq
1828
+ m1 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1829
+ n = (c.even?) ? 10 : c
1830
+ CvScalar.new(n, 0, 0, 0)
1831
+ }
1832
+ m2 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1833
+ CvScalar.new(10, 0, 0, 0)
1834
+ }
1835
+ s1 = CvScalar.new(10, 0, 0, 0)
1836
+ m3 = m1.eq(m2)
1837
+ m4 = m1.eq(s1)
1838
+ m5 = m1.eq(10)
1839
+
1840
+ [m3, m4, m5].each { |m|
1841
+ assert_equal(m1.height, m.height)
1842
+ assert_equal(m1.width, m.width)
1843
+ assert_each_cvscalar(m) { |j, i, c|
1844
+ n = (c.even?) ? 0xff : 0
1845
+ CvScalar.new(n, 0, 0, 0)
1846
+ }
1847
+ }
1848
+
1849
+ assert_raise(TypeError) {
1850
+ m1.eq(DUMMY_OBJ)
1851
+ }
1852
+ end
1853
+
1854
+ def test_gt
1855
+ m1 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1856
+ CvScalar.new(c, 0, 0, 0)
1857
+ }
1858
+ m2 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1859
+ CvScalar.new(10, 0, 0, 0)
1860
+ }
1861
+ s1 = CvScalar.new(10, 0, 0, 0)
1862
+ m3 = m1.gt(m2)
1863
+ m4 = m1.gt(s1)
1864
+ m5 = m1.gt(10)
1865
+
1866
+ [m3, m4, m5].each { |m|
1867
+ assert_equal(m1.height, m.height)
1868
+ assert_equal(m1.width, m.width)
1869
+ assert_each_cvscalar(m) { |j, i, c|
1870
+ n = (c > 10) ? 0xff : 0
1871
+ CvScalar.new(n, 0, 0, 0)
1872
+ }
1873
+ }
1874
+
1875
+ assert_raise(TypeError) {
1876
+ m1.gt(DUMMY_OBJ)
1877
+ }
1878
+ end
1879
+
1880
+ def test_ge
1881
+ m1 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1882
+ CvScalar.new(c, 0, 0, 0)
1883
+ }
1884
+ m2 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1885
+ CvScalar.new(10, 0, 0, 0)
1886
+ }
1887
+ s1 = CvScalar.new(10, 0, 0, 0)
1888
+ m3 = m1.ge(m2)
1889
+ m4 = m1.ge(s1)
1890
+ m5 = m1.ge(10)
1891
+
1892
+ [m3, m4, m5].each { |m|
1893
+ assert_equal(m1.height, m.height)
1894
+ assert_equal(m1.width, m.width)
1895
+ assert_each_cvscalar(m) { |j, i, c|
1896
+ n = (c >= 10) ? 0xff : 0
1897
+ CvScalar.new(n, 0, 0, 0)
1898
+ }
1899
+ }
1900
+
1901
+ assert_raise(TypeError) {
1902
+ m1.ge(DUMMY_OBJ)
1903
+ }
1904
+ end
1905
+
1906
+ def test_lt
1907
+ m1 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1908
+ CvScalar.new(c, 0, 0, 0)
1909
+ }
1910
+ m2 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1911
+ CvScalar.new(10, 0, 0, 0)
1912
+ }
1913
+ s1 = CvScalar.new(10, 0, 0, 0)
1914
+ m3 = m1.lt(m2)
1915
+ m4 = m1.lt(s1)
1916
+ m5 = m1.lt(10)
1917
+
1918
+ [m3, m4, m5].each { |m|
1919
+ assert_equal(m1.height, m.height)
1920
+ assert_equal(m1.width, m.width)
1921
+ assert_each_cvscalar(m) { |j, i, c|
1922
+ n = (c < 10) ? 0xff : 0
1923
+ CvScalar.new(n, 0, 0, 0)
1924
+ }
1925
+ }
1926
+
1927
+ assert_raise(TypeError) {
1928
+ m1.lt(DUMMY_OBJ)
1929
+ }
1930
+ end
1931
+
1932
+ def test_le
1933
+ m1 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1934
+ CvScalar.new(c, 0, 0, 0)
1935
+ }
1936
+ m2 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1937
+ CvScalar.new(10, 0, 0, 0)
1938
+ }
1939
+ s1 = CvScalar.new(10, 0, 0, 0)
1940
+ m3 = m1.le(m2)
1941
+ m4 = m1.le(s1)
1942
+ m5 = m1.le(10)
1943
+
1944
+ [m3, m4, m5].each { |m|
1945
+ assert_equal(m1.height, m.height)
1946
+ assert_equal(m1.width, m.width)
1947
+ assert_each_cvscalar(m) { |j, i, c|
1948
+ n = (c <= 10) ? 0xff : 0
1949
+ CvScalar.new(n, 0, 0, 0)
1950
+ }
1951
+ }
1952
+
1953
+ assert_raise(TypeError) {
1954
+ m1.le(DUMMY_OBJ)
1955
+ }
1956
+ end
1957
+
1958
+ def test_in_range
1959
+ lower, upper = 10, 20
1960
+ m0 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1961
+ CvScalar.new(c + 5, 0, 0, 0)
1962
+ }
1963
+ m1 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1964
+ CvScalar.new(lower, 0, 0, 0)
1965
+ }
1966
+ m2 = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
1967
+ CvScalar.new(upper, 0, 0, 0)
1968
+ }
1969
+ s1 = CvScalar.new(lower, 0, 0, 0)
1970
+ s2 = CvScalar.new(upper, 0, 0, 0)
1971
+
1972
+ m3 = m0.in_range(m1, m2)
1973
+ m4 = m0.in_range(s1, s2)
1974
+ m5 = m0.in_range(lower, upper)
1975
+
1976
+ [m3, m4, m5].each { |m|
1977
+ assert_equal(m0.height, m.height)
1978
+ assert_equal(m0.width, m.width)
1979
+ assert_each_cvscalar(m) { |j, i, c|
1980
+ val = m0[j, i][0]
1981
+ n = ((lower..upper).include? val) ? 0xff : 0
1982
+ CvScalar.new(n, 0, 0, 0)
1983
+ }
1984
+ }
1985
+
1986
+ assert_raise(TypeError) {
1987
+ m0.in_range(DUMMY_OBJ, m2)
1988
+ }
1989
+ assert_raise(TypeError) {
1990
+ m0.in_range(m1, DUMMY_OBJ)
1991
+ }
1992
+ end
1993
+
1994
+ def test_abs_diff
1995
+ m0 = create_cvmat(6, 4, :cv32f, 4) { |j, i, c|
1996
+ CvScalar.new(-10 + 10.5, 20 + 10.5, -30 + 10.5, 40 - 10.5)
1997
+ }
1998
+ m1 = create_cvmat(6, 4, :cv32f, 4) { |j, i, c|
1999
+ CvScalar.new(c + 10.5, c - 10.5, c + 10.5, c - 10.5)
2000
+ }
2001
+ m2 = create_cvmat(6, 4, :cv32f, 4) { |j, i, c|
2002
+ CvScalar.new(c, c, c, c)
2003
+ }
2004
+
2005
+ s1 = CvScalar.new(-10, 20, -30, 40)
2006
+ m3 = m1.abs_diff(m2)
2007
+ m4 = m0.abs_diff(s1)
2008
+
2009
+ [m3, m4].each { |m|
2010
+ assert_equal(m1.width, m.width)
2011
+ assert_equal(m1.height, m.height)
2012
+ assert_each_cvscalar(m, 0.001) {
2013
+ CvScalar.new(10.5, 10.5, 10.5, 10.5)
2014
+ }
2015
+ }
2016
+
2017
+ assert_raise(TypeError) {
2018
+ m0.abs_diff(DUMMY_OBJ)
2019
+ }
2020
+ end
2021
+
2022
+ def test_normalize
2023
+ mat = create_cvmat(2, 2, :cv32f, 1) { |j, i, c|
2024
+ CvScalar.new(c, 0, 0, 0)
2025
+ }
2026
+
2027
+ m = mat.normalize
2028
+ expected = [0.0, 0.267, 0.534, 0.801]
2029
+ expected.each_with_index { |x, i|
2030
+ assert_in_delta(x, m[i][0], 0.001)
2031
+ }
2032
+
2033
+ minf = mat.normalize(1, 0, CV_NORM_INF)
2034
+ expected = [0.0, 0.333, 0.666, 1.0]
2035
+ expected.each_with_index { |x, i|
2036
+ assert_in_delta(x, minf[i][0], 0.001)
2037
+ }
2038
+
2039
+ ml1 = mat.normalize(1, 0, CV_NORM_L1)
2040
+ expected = [0.0, 0.166, 0.333, 0.5]
2041
+ expected.each_with_index { |x, i|
2042
+ assert_in_delta(x, ml1[i][0], 0.001)
2043
+ }
2044
+
2045
+ ml2 = mat.normalize(1, 0, CV_NORM_L2)
2046
+ expected = [0.0, 0.267, 0.534, 0.801]
2047
+ expected.each_with_index { |x, i|
2048
+ assert_in_delta(x, ml2[i][0], 0.001)
2049
+ }
2050
+
2051
+ mminmax = mat.normalize(10, 5, CV_NORM_MINMAX)
2052
+ expected = [5.0, 6.666, 8.333, 10.0]
2053
+ expected.each_with_index { |x, i|
2054
+ assert_in_delta(x, mminmax[i][0], 0.001)
2055
+ }
2056
+
2057
+ minf = mat.normalize(1, 0, CV_NORM_INF, CV_32FC3)
2058
+ expected = [0.0, 0.333, 0.666, 1.0]
2059
+ expected.each_with_index { |x, i|
2060
+ assert_in_delta(x, minf[i][0], 0.001)
2061
+ }
2062
+
2063
+ mask = mat.to_8u.zero
2064
+ mask[0, 0] = CvScalar.new(255, 0, 0)
2065
+ mask[1, 0] = CvScalar.new(255, 0, 0)
2066
+ minf = mat.normalize(1, 0, CV_NORM_INF, -1, mask)
2067
+ expected = [0.0, 0.0, 1.0, 0.0]
2068
+ expected.each_with_index { |x, i|
2069
+ assert_in_delta(x, minf[i][0], 0.001)
2070
+ }
2071
+
2072
+ assert_raise(TypeError) {
2073
+ mat.normalize(DUMMY_OBJ, 0, CV_NORM_INF)
2074
+ }
2075
+ assert_raise(TypeError) {
2076
+ mat.normalize(1, DUMMY_OBJ, CV_NORM_INF)
2077
+ }
2078
+ assert_raise(TypeError) {
2079
+ mat.normalize(1, 0, DUMMY_OBJ)
2080
+ }
2081
+ assert_raise(TypeError) {
2082
+ mat.normalize(1, 0, CV_NORM_INF, DUMMY_OBJ)
2083
+ }
2084
+ end
2085
+
2086
+ def test_count_non_zero
2087
+ m0 = create_cvmat(6, 4, :cv32f, 1) { |j, i, c|
2088
+ n = 0
2089
+ n = 1 if i == 0
2090
+ CvScalar.new(n, 0, 0, 0)
2091
+ }
2092
+ assert_equal(6, m0.count_non_zero)
2093
+ end
2094
+
2095
+ def test_sum
2096
+ m0 = create_cvmat(6, 4, :cv32f, 1) { |j, i, c|
2097
+ CvScalar.new(c, c, c, c)
2098
+ }
2099
+ assert_cvscalar_equal(CvScalar.new(276, 0, 0, 0), m0.sum)
2100
+
2101
+ m0 = create_cvmat(6, 4, :cv32f, 1) { |j, i, c|
2102
+ CvScalar.new(-c)
2103
+ }
2104
+ assert_cvscalar_equal(CvScalar.new(-276, 0, 0, 0), m0.sum)
2105
+ end
2106
+
2107
+ def test_avg_sdv
2108
+ m0 = create_cvmat(6, 4, :cv32f, 4) { |j, i, c|
2109
+ CvScalar.new(c * 0.1, -c * 0.1, c, -c)
2110
+ }
2111
+ # CvMat#avg
2112
+ assert_in_delta(CvScalar.new(1.15, -1.15, 11.5, -11.5), m0.avg, 0.001)
2113
+ # CvMat#sdv
2114
+ assert_in_delta(CvScalar.new(0.69221, 0.69221, 6.9221, 6.9221), m0.sdv, 0.001)
2115
+ # CvMat#avg_sdv
2116
+ avg, sdv = m0.avg_sdv
2117
+ assert_in_delta(CvScalar.new(1.15, -1.15, 11.5, -11.5), avg, 0.001)
2118
+ assert_in_delta(CvScalar.new(0.69221, 0.69221, 6.9221, 6.9221), sdv, 0.001)
2119
+
2120
+ mask = create_cvmat(6, 4, :cv8u, 1) { |j, i, c|
2121
+ n = (i == j) ? 1 : 0
2122
+ CvScalar.new(n)
2123
+ }
2124
+ # CvMat#avg
2125
+ assert_in_delta(CvScalar.new(0.75, -0.75, 7.5, -7.5), m0.avg(mask), 0.001)
2126
+ # CvMat#sdv
2127
+ assert_in_delta(CvScalar.new(0.55901, 0.55901, 5.5901, 5.5901), m0.sdv(mask), 0.001)
2128
+ # CvMat#avg_sdv
2129
+ avg, sdv = m0.avg_sdv(mask)
2130
+ assert_in_delta(CvScalar.new(0.75, -0.75, 7.5, -7.5), avg, 0.001)
2131
+ assert_in_delta(CvScalar.new(0.55901, 0.55901, 5.5901, 5.5901), sdv, 0.001)
2132
+
2133
+ assert_raise(TypeError) {
2134
+ m0.avg(DUMMY_OBJ)
2135
+ }
2136
+ assert_raise(TypeError) {
2137
+ m0.sdv(DUMMY_OBJ)
2138
+ }
2139
+ assert_raise(TypeError) {
2140
+ m0.avg_sdv(DUMMY_OBJ)
2141
+ }
2142
+ end
2143
+
2144
+ def test_min_max_loc
2145
+ m0 = create_cvmat(6, 4, :cv32f, 1) { |j, i, c|
2146
+ CvScalar.new(c * 0.5)
2147
+ }
2148
+ m0[2, 3] = CvScalar.new(100.5) # Max
2149
+ m0[5, 1] = CvScalar.new(-100.5) # Min
2150
+
2151
+ min_val, max_val, min_loc, max_loc = m0.min_max_loc
2152
+ assert_equal(-100.5, min_val)
2153
+ assert_equal(5, min_loc.y)
2154
+ assert_equal(1, min_loc.x)
2155
+ assert_equal(100.5, max_val)
2156
+ assert_equal(2, max_loc.y)
2157
+ assert_equal(3, max_loc.x)
2158
+
2159
+ assert_raise(TypeError) {
2160
+ m0.min_max_loc(DUMMY_OBJ)
2161
+ }
2162
+ end
2163
+
2164
+ def test_norm
2165
+ src1 = CvMat.new(3, 3, :cv32f, 1).set_data([1, 2, 3, 4, 5, 6, 7, 8, 9])
2166
+ src2 = CvMat.new(3, 3, :cv32f, 1).set_data([2, 3, 4, 5, 6, 7, 8, 9, 1])
2167
+ mask = CvMat.new(3, 3, :cv8u, 1).set_data([1, 1, 0, 1, 1, 0, 0, 0, 0])
2168
+
2169
+ assert_in_delta(CvMat.norm(src1), 16.88, 0.01)
2170
+
2171
+ assert_in_delta(CvMat.norm(src1, nil, CV_NORM_L1), 45.0, 0.01)
2172
+ assert_in_delta(CvMat.norm(src1, nil, CV_NORM_L2), 16.88, 0.01)
2173
+ assert_in_delta(CvMat.norm(src1, nil, CV_NORM_INF), 9.0, 0.01)
2174
+
2175
+ assert_in_delta(CvMat.norm(src1, src2, CV_NORM_L1), 16.0, 0.01)
2176
+ assert_in_delta(CvMat.norm(src1, src2, CV_NORM_L2), 8.49, 0.01)
2177
+ assert_in_delta(CvMat.norm(src1, src2, CV_NORM_INF), 8.0, 0.01)
2178
+
2179
+ assert_in_delta(CvMat.norm(src1, src2, CV_NORM_L1, mask), 4.0, 0.01)
2180
+ assert_in_delta(CvMat.norm(src1, src2, CV_NORM_L2, mask), 2.0, 0.01)
2181
+ assert_in_delta(CvMat.norm(src1, src2, CV_NORM_INF, mask), 1.0, 0.01)
2182
+
2183
+ assert_raise(TypeError) {
2184
+ CvMat.norm(DUMMY_OBJ)
2185
+ }
2186
+ assert_raise(TypeError) {
2187
+ CvMat.norm(src1, DUMMY_OBJ)
2188
+ }
2189
+ assert_raise(TypeError) {
2190
+ CvMat.norm(src1, src2, DUMMY_OBJ)
2191
+ }
2192
+ assert_raise(TypeError) {
2193
+ CvMat.norm(src1, src2, CV_NORM_L1, DUMMY_OBJ)
2194
+ }
2195
+ end
2196
+
2197
+ def test_dot_product
2198
+ m1 = create_cvmat(2, 2, :cv32f, 1) { |j, i, c|
2199
+ CvScalar.new(c * 0.5)
2200
+ }
2201
+ m2 = create_cvmat(2, 2, :cv32f, 1) { |j, i, c|
2202
+ CvScalar.new(c * 1.5)
2203
+ }
2204
+ assert_in_delta(10.5, m1.dot_product(m2), 0.001)
2205
+
2206
+ m1 = create_cvmat(2, 2, :cv32f) { |j, i, c|
2207
+ CvScalar.new(c * 0.5, c * 0.6, c * 0.7, c * 0.8)
2208
+ }
2209
+ m2 = create_cvmat(2, 2, :cv32f) { |j, i, c|
2210
+ CvScalar.new(c * 1.5, c * 2.0, c * 2.5, c * 3.0)
2211
+ }
2212
+ assert_in_delta(85.39999, m1.dot_product(m2), 0.001)
2213
+
2214
+ assert_raise(TypeError) {
2215
+ m1.dot_product(DUMMY_OBJ)
2216
+ }
2217
+ end
2218
+
2219
+ def test_cross_product
2220
+ m1 = create_cvmat(1, 3, :cv32f, 1) { |j, i, c|
2221
+ CvScalar.new(c * 0.5)
2222
+ }
2223
+ m2 = create_cvmat(1, 3, :cv32f, 1) { |j, i, c|
2224
+ CvScalar.new(c + 1)
2225
+ }
2226
+ m3 = m1.cross_product(m2)
2227
+
2228
+ assert_in_delta(CvScalar.new(-0.5), m3[0, 0], 0.001)
2229
+ assert_in_delta(CvScalar.new(1), m3[0, 1], 0.001)
2230
+ assert_in_delta(CvScalar.new(-0.5), m3[0, 2], 0.001)
2231
+
2232
+ assert_raise(TypeError) {
2233
+ m1.cross_product(DUMMY_OBJ)
2234
+ }
2235
+ end
2236
+
2237
+ def test_transform
2238
+ m0 = create_cvmat(5, 5, :cv32f, 3) { |j, i, c|
2239
+ CvScalar.new(c * 0.5, c * 1.0, c * 1.5)
2240
+ }
2241
+ transmat = CvMat.new(3, 3, :cv32f, 1);
2242
+ transmat[0, 0] = CvScalar.new(0.0)
2243
+ transmat[1, 0] = CvScalar.new(0.0)
2244
+ transmat[2, 0] = CvScalar.new(0.0)
2245
+
2246
+ transmat[0, 1] = CvScalar.new(0.0)
2247
+ transmat[1, 1] = CvScalar.new(0.0)
2248
+ transmat[2, 1] = CvScalar.new(1.0)
2249
+
2250
+ transmat[0, 2] = CvScalar.new(1.0)
2251
+ transmat[1, 2] = CvScalar.new(0.0)
2252
+ transmat[2, 2] = CvScalar.new(0.0)
2253
+
2254
+ m1 = m0.transform(transmat)
2255
+ assert_each_cvscalar(m1, 0.01) { |j, i, c|
2256
+ CvScalar.new(c * 1.5, 0, c, 0)
2257
+ }
2258
+
2259
+ stf = CvMat.new(3, 1, :cv32f, 1)
2260
+ stf[0, 0] = CvScalar.new(-10)
2261
+ stf[1, 0] = CvScalar.new(0.0)
2262
+ stf[2, 0] = CvScalar.new(5)
2263
+
2264
+ m1 = m0.transform(transmat, stf)
2265
+ assert_each_cvscalar(m1, 0.01) { |j, i, c|
2266
+ CvScalar.new(c * 1.5 - 10, 0, c + 5, 0)
2267
+ }
2268
+
2269
+ assert_raise(TypeError) {
2270
+ m0.transform(DUMMY_OBJ)
2271
+ }
2272
+ assert_raise(TypeError) {
2273
+ m0.transform(transmat, DUMMY_OBJ)
2274
+ }
2275
+ end
2276
+
2277
+ def test_perspective_transform
2278
+ mat = CvMat.new(1, 1, :cv32f, 2)
2279
+ mat[0] = CvScalar.new(2, 3)
2280
+ transmat = CvMat.new(3, 3, :cv32f, 1).clear
2281
+ mat.channel.times { |c|
2282
+ transmat[c, c] = CvScalar.new(1.0)
2283
+ }
2284
+ transmat[2, 2] = CvScalar.new(0.5)
2285
+
2286
+ m = mat.perspective_transform(transmat)
2287
+ assert_equal(1, m.height)
2288
+ assert_equal(1, m.width)
2289
+ assert_equal(:cv32f, m.depth)
2290
+ assert_equal(2, m.channel)
2291
+ assert_in_delta(CvScalar.new(4, 6), m[0], 0.001);
2292
+
2293
+ mat = CvMat.new(1, 1, :cv32f, 3)
2294
+ mat[0] = CvScalar.new(2, 3, 4)
2295
+ transmat = CvMat.new(4, 4, :cv32f, 1).clear
2296
+ mat.channel.times { |c|
2297
+ transmat[c, c] = CvScalar.new(1.0)
2298
+ }
2299
+ transmat[3, 3] = CvScalar.new(0.5)
2300
+
2301
+ m = mat.perspective_transform(transmat)
2302
+ assert_equal(1, m.height)
2303
+ assert_equal(1, m.width)
2304
+ assert_equal(:cv32f, m.depth)
2305
+ assert_equal(3, m.channel)
2306
+ assert_in_delta(CvScalar.new(4, 6, 8), m[0], 0.001);
2307
+
2308
+ assert_raise(TypeError) {
2309
+ mat.perspective_transform(DUMMY_OBJ)
2310
+ }
2311
+ assert_raise(CvStsAssert) {
2312
+ mat.perspective_transform(CvMat.new(3, 3, :cv32f, 3))
2313
+ }
2314
+ end
2315
+
2316
+ def test_mul_transposed
2317
+ mat0 = create_cvmat(2, 2, :cv32f, 1) { |j, i, c|
2318
+ CvScalar.new((c + 1) * 2)
2319
+ }
2320
+ delta = create_cvmat(2, 2, :cv32f, 1) { |j, i, c|
2321
+ CvScalar.new(c + 1)
2322
+ }
2323
+
2324
+ [mat0.mul_transposed,
2325
+ mat0.mul_transposed(:delta => nil),
2326
+ mat0.mul_transposed(:order => 0),
2327
+ mat0.mul_transposed(:scale => 1.0)].each { |m|
2328
+ expected = [20, 44,
2329
+ 44, 100]
2330
+ assert_equal(2, m.rows)
2331
+ assert_equal(2, m.cols)
2332
+ assert_equal(:cv32f, m.depth)
2333
+ expected.each_with_index { |x, i|
2334
+ assert_in_delta(x, m[i][0], 0.1)
2335
+ }
2336
+ }
2337
+
2338
+ m = mat0.mul_transposed(:delta => delta)
2339
+ expected = [5, 11,
2340
+ 11, 25]
2341
+ assert_equal(2, m.rows)
2342
+ assert_equal(2, m.cols)
2343
+ assert_equal(:cv32f, m.depth)
2344
+ expected.each_with_index { |x, i|
2345
+ assert_in_delta(x, m[i][0], 0.1)
2346
+ }
2347
+
2348
+ m = mat0.mul_transposed(:delta => delta, :order => 1, :scale => 2.0)
2349
+ expected = [20, 28,
2350
+ 28, 40]
2351
+ assert_equal(2, m.rows)
2352
+ assert_equal(2, m.cols)
2353
+ assert_equal(:cv32f, m.depth)
2354
+ expected.each_with_index { |x, i|
2355
+ assert_in_delta(x, m[i][0], 0.1)
2356
+ }
2357
+ end
2358
+
2359
+ def test_trace
2360
+ m0 = create_cvmat(5, 5, :cv32f, 4) { |j, i, c|
2361
+ CvScalar.new(c * 0.5, c * 1.0, c * 1.5, c * 2.0)
2362
+ }
2363
+ assert_in_delta(CvScalar.new(30, 60, 90, 120), m0.trace, 0.001)
2364
+ end
2365
+
2366
+ def test_transpose
2367
+ m0 = create_cvmat(2, 3, :cv32f, 4) { |j, i, c|
2368
+ CvScalar.new(c * 0.5, c * 1.0, c * 1.5, c * 2.0)
2369
+ }
2370
+ m1 = m0.transpose
2371
+ m2 = m0.t
2372
+
2373
+ [m1, m2].each { |m|
2374
+ assert_equal(m0.rows, m.cols)
2375
+ assert_equal(m0.cols, m.rows)
2376
+ assert_each_cvscalar(m, 0.001) { |j, i, c|
2377
+ m0[i, j]
2378
+ }
2379
+ }
2380
+ end
2381
+
2382
+ def test_det
2383
+ elems = [2.5, 4.5, 2.0,
2384
+ 3.0, 2.5, -0.5,
2385
+ 1.0, 0.5, 1.5]
2386
+ m0 = create_cvmat(3, 3, :cv32f, 1) { |j, i, c|
2387
+ CvScalar.new(elems[c])
2388
+ }
2389
+ assert_in_delta(-14.5, m0.det, 0.001)
2390
+ end
2391
+
2392
+ def test_invert
2393
+ elems = [1, 2, 3,
2394
+ 2, 6, 9,
2395
+ 1, 4, 7]
2396
+ m0 = create_cvmat(3, 3, :cv32f, 1) { |j, i, c|
2397
+ CvScalar.new(elems[c])
2398
+ }
2399
+ m1 = m0.invert
2400
+ m2 = m0.invert(:lu)
2401
+ m3 = m0.invert(:svd)
2402
+ m4 = m0.invert(:svd_sym)
2403
+ m5 = m0.invert(:svd_symmetric)
2404
+
2405
+ expected = [3, -1, 0, -2.5, 2, -1.5, 1, -1, 1]
2406
+ [m1, m2, m3].each { |m|
2407
+ assert_equal(m0.width, m.width)
2408
+ assert_equal(m0.height, m.height)
2409
+ assert_each_cvscalar(m, 0.001) { |j, i, c|
2410
+ CvScalar.new(expected[c])
2411
+ }
2412
+ }
2413
+
2414
+ expected = [3, -1, 0, -1.0, 0.15, 0.23, 0, 0.23, -0.15]
2415
+ [m4, m5].each { |m|
2416
+ assert_equal(m0.width, m.width)
2417
+ assert_equal(m0.height, m.height)
2418
+ assert_each_cvscalar(m, 0.1) { |j, i, c|
2419
+ CvScalar.new(expected[c])
2420
+ }
2421
+ }
2422
+
2423
+ assert_raise(TypeError) {
2424
+ m0.invert(DUMMY_OBJ)
2425
+ }
2426
+ end
2427
+
2428
+ def test_solve
2429
+ elems1 = [3, 4, 5,
2430
+ 8, 9, 6,
2431
+ 3, 5, 9]
2432
+ elems2 = [3,
2433
+ 4,
2434
+ 5]
2435
+ a = create_cvmat(3, 3, :cv32f, 1) { |j, i, c|
2436
+ CvScalar.new(elems1[c])
2437
+ }
2438
+ b = create_cvmat(3, 1, :cv32f, 1) { |j, i, c|
2439
+ CvScalar.new(elems2[c])
2440
+ }
2441
+
2442
+ m1 = CvMat.solve(a, b)
2443
+ m2 = CvMat.solve(a, b, :lu)
2444
+ m3 = CvMat.solve(a, b, :svd)
2445
+ m4 = CvMat.solve(a, b, :svd_sym)
2446
+ m5 = CvMat.solve(a, b, :svd_symmetric)
2447
+ expected = [2, -2, 1]
2448
+ [m1, m2, m3].each { |m|
2449
+ assert_equal(b.width, m.width)
2450
+ assert_equal(a.height, m.height)
2451
+ assert_each_cvscalar(m, 0.001) { |j, i, c|
2452
+ CvScalar.new(expected[c])
2453
+ }
2454
+ }
2455
+
2456
+ assert_raise(TypeError) {
2457
+ CvMat.solve(DUMMY_OBJ, b)
2458
+ }
2459
+ assert_raise(TypeError) {
2460
+ CvMat.solve(a, DUMMY_OBJ)
2461
+ }
2462
+ assert_raise(TypeError) {
2463
+ CvMat.solve(a, b, DUMMY_OBJ)
2464
+ }
2465
+ end
2466
+
2467
+ def test_svd
2468
+ rows = 2
2469
+ cols = 3
2470
+ m0 = create_cvmat(rows, cols, :cv32f, 1) { |j, i, c|
2471
+ CvScalar.new(c + 1)
2472
+ }
2473
+
2474
+ [m0.svd, m0.clone.svd(CV_SVD_MODIFY_A)].each { |w, u, v|
2475
+ expected = [0.38632, -0.92237,
2476
+ 0.92237, 0.38632]
2477
+ assert_equal(rows, u.rows)
2478
+ assert_equal(rows, u.cols)
2479
+ expected.each_with_index { |x, i|
2480
+ assert_in_delta(x, u[i][0], 0.0001)
2481
+ }
2482
+
2483
+ assert_equal(rows, w.rows)
2484
+ assert_equal(cols, w.cols)
2485
+ expected = [9.50803, 0, 0,
2486
+ 0, 0.77287, 0]
2487
+ expected.each_with_index { |x, i|
2488
+ assert_in_delta(x, w[i][0], 0.0001)
2489
+ }
2490
+
2491
+ assert_equal(cols, v.rows)
2492
+ assert_equal(rows, v.cols)
2493
+ expected = [0.42867, 0.80596,
2494
+ 0.56631, 0.11238,
2495
+ 0.70395, -0.58120]
2496
+
2497
+ expected.each_with_index { |x, i|
2498
+ assert_in_delta(x, v[i][0], 0.0001)
2499
+ }
2500
+ }
2501
+
2502
+ w, ut, v = m0.svd(CV_SVD_U_T)
2503
+ expected = [0.38632, 0.92237,
2504
+ -0.92237, 0.38632]
2505
+ assert_equal(rows, ut.rows)
2506
+ assert_equal(rows, ut.cols)
2507
+ expected.each_with_index { |x, i|
2508
+ assert_in_delta(x, ut[i][0], 0.0001)
2509
+ }
2510
+
2511
+ assert_equal(rows, w.rows)
2512
+ assert_equal(cols, w.cols)
2513
+ expected = [9.50803, 0, 0,
2514
+ 0, 0.77287, 0]
2515
+ expected.each_with_index { |x, i|
2516
+ assert_in_delta(x, w[i][0], 0.0001)
2517
+ }
2518
+
2519
+ assert_equal(cols, v.rows)
2520
+ assert_equal(rows, v.cols)
2521
+ expected = [0.42867, 0.80596,
2522
+ 0.56631, 0.11238,
2523
+ 0.70395, -0.58120]
2524
+
2525
+ expected.each_with_index { |x, i|
2526
+ assert_in_delta(x, v[i][0], 0.0001)
2527
+ }
2528
+
2529
+ w, u, vt = m0.svd(CV_SVD_V_T)
2530
+ expected = [0.38632, -0.92237,
2531
+ 0.92237, 0.38632]
2532
+ assert_equal(rows, u.rows)
2533
+ assert_equal(rows, u.cols)
2534
+ expected.each_with_index { |x, i|
2535
+ assert_in_delta(x, u[i][0], 0.0001)
2536
+ }
2537
+
2538
+ assert_equal(rows, w.rows)
2539
+ assert_equal(cols, w.cols)
2540
+ expected = [9.50803, 0, 0,
2541
+ 0, 0.77287, 0]
2542
+ expected.each_with_index { |x, i|
2543
+ assert_in_delta(x, w[i][0], 0.0001)
2544
+ }
2545
+
2546
+ assert_equal(rows, vt.rows)
2547
+ assert_equal(cols, vt.cols)
2548
+ expected = [0.42867, 0.56631, 0.70395,
2549
+ 0.80596, 0.11238, -0.58120]
2550
+ expected.each_with_index { |x, i|
2551
+ assert_in_delta(x, vt[i][0], 0.0001)
2552
+ }
2553
+ end
2554
+
2555
+ def test_eigenvv
2556
+ elems = [6, -2, -3, 7]
2557
+ m0 = create_cvmat(2, 2, :cv32f, 1) { |j, i, c|
2558
+ CvScalar.new(elems[c])
2559
+ }
2560
+
2561
+ v1 = m0.eigenvv
2562
+ v2 = m0.eigenvv(10 ** -15)
2563
+ v3 = m0.eigenvv(10 ** -15, 1, 1)
2564
+
2565
+ [v1, v2].each { |vec, val|
2566
+ assert_in_delta(-0.615, vec[0, 0][0], 0.01)
2567
+ assert_in_delta(0.788, vec[0, 1][0], 0.01)
2568
+ assert_in_delta(0.788, vec[1, 0][0], 0.01)
2569
+ assert_in_delta(0.615, vec[1, 1][0], 0.01)
2570
+ assert_in_delta(8.562, val[0][0], 0.01)
2571
+ assert_in_delta(4.438, val[1][0], 0.01)
2572
+ }
2573
+
2574
+ vec3, val3 = v3
2575
+ assert_in_delta(-0.615, vec3[0, 0][0], 0.01)
2576
+ assert_in_delta(0.788, vec3[0, 1][0], 0.01)
2577
+ assert_in_delta(8.562, val3[0][0], 0.01)
2578
+
2579
+ assert_raise(TypeError) {
2580
+ m0.eigenvv(DUMMY_OBJ)
2581
+ }
2582
+ assert_raise(TypeError) {
2583
+ m0.eigenvv(nil, DUMMY_OBJ)
2584
+ }
2585
+ assert_raise(TypeError) {
2586
+ m0.eigenvv(nil, nil, DUMMY_OBJ)
2587
+ }
2588
+ end
2589
+
2590
+ def test_find_homography
2591
+ # Nx2
2592
+ src = CvMat.new(4, 2, :cv32f, 1)
2593
+ dst = CvMat.new(4, 2, :cv32f, 1)
2594
+
2595
+ # Nx3 (Homogeneous coordinates)
2596
+ src2 = CvMat.new(4, 3, :cv32f, 1)
2597
+ dst2 = CvMat.new(4, 3, :cv32f, 1)
2598
+
2599
+ # Homography
2600
+ # <src> => <dst>
2601
+ # (0, 0) => (50, 0)
2602
+ # (255, 0) => (205, 0)
2603
+ # (255, 255) => (255, 220)
2604
+ # (0, 255) => (0, 275)
2605
+ [[0, 0], [255, 0], [255, 255], [0, 255]].each_with_index { |coord, i|
2606
+ src[i, 0] = coord[0]
2607
+ src[i, 1] = coord[1]
2608
+
2609
+ src2[i, 0] = coord[0] * 2
2610
+ src2[i, 1] = coord[1] * 2
2611
+ src2[i, 2] = 2
2612
+ }
2613
+ [[50, 0], [205, 0], [255, 220], [0, 275]].each_with_index { |coord, i|
2614
+ dst[i, 0] = coord[0]
2615
+ dst[i, 1] = coord[1]
2616
+
2617
+ dst2[i, 0] = coord[0] * 2
2618
+ dst2[i, 1] = coord[1] * 2
2619
+ dst2[i, 2] = 2
2620
+ }
2621
+
2622
+ mat1 = CvMat.find_homography(src, dst)
2623
+ mat2 = CvMat.find_homography(src, dst, :all)
2624
+ mat3 = CvMat.find_homography(src, dst, :ransac)
2625
+ mat4 = CvMat.find_homography(src, dst, :lmeds)
2626
+ mat5, status5 = CvMat.find_homography(src, dst, :ransac, 5, true)
2627
+ mat6, status6 = CvMat.find_homography(src, dst, :ransac, 5, true)
2628
+ mat7 = CvMat.find_homography(src, dst, :ransac, 5, false)
2629
+ mat8 = CvMat.find_homography(src, dst, :ransac, 5, nil)
2630
+ mat9 = CvMat.find_homography(src, dst, :all, 5, true)
2631
+ mat10, status10 = CvMat.find_homography(src2, dst2, :ransac, 5, true)
2632
+
2633
+ [mat1, mat2, mat3, mat4, mat5, mat6, mat7, mat8, mat9, mat10].each { |mat|
2634
+ assert_equal(3, mat.rows)
2635
+ assert_equal(3, mat.cols)
2636
+ assert_equal(:cv32f, mat.depth)
2637
+ assert_equal(1, mat.channel)
2638
+ [0.72430, -0.19608, 50.0,
2639
+ 0.0, 0.62489, 0.0,
2640
+ 0.00057, -0.00165, 1.0].each_with_index { |x, i|
2641
+ assert_in_delta(x, mat[i][0], 0.0001)
2642
+ }
2643
+ }
2644
+
2645
+ [status5, status6, status10].each { |status|
2646
+ assert_equal(1, status.rows)
2647
+ assert_equal(4, status.cols)
2648
+ assert_equal(:cv8u, status.depth)
2649
+ assert_equal(1, status.channel)
2650
+ 4.times { |i|
2651
+ assert_in_delta(1.0, status[i][0], 0.0001)
2652
+ }
2653
+ }
2654
+
2655
+ assert_raise(TypeError) {
2656
+ CvMat.find_homography(DUMMY_OBJ, dst, :ransac, 5, true)
2657
+ }
2658
+ assert_raise(TypeError) {
2659
+ CvMat.find_homography(src, DUMMY_OBJ, :ransac, 5, true)
2660
+ }
2661
+ assert_raise(TypeError) {
2662
+ CvMat.find_homography(src, dst, DUMMY_OBJ, 5, true)
2663
+ }
2664
+ assert_raise(TypeError) {
2665
+ CvMat.find_homography(src, dst, :ransac, DUMMY_OBJ, true)
2666
+ }
2667
+ CvMat.find_homography(src, dst, :ransac, 5, DUMMY_OBJ)
2668
+ end
2669
+
2670
+ def test_find_fundamental_mat
2671
+ points1 = [[488.362, 169.911],
2672
+ [449.488, 174.44],
2673
+ [408.565, 179.669],
2674
+ [364.512, 184.56],
2675
+ [491.483, 122.366],
2676
+ [451.512, 126.56],
2677
+ [409.502, 130.342],
2678
+ [365.5, 134.0],
2679
+ [494.335, 74.544],
2680
+ [453.5, 76.5],
2681
+ [411.646, 79.5901],
2682
+ [366.498, 81.6577],
2683
+ [453.5, 76.5],
2684
+ [411.646, 79.5901],
2685
+ [366.498, 81.6577]]
2686
+
2687
+ points2 = [[526.605, 213.332],
2688
+ [470.485, 207.632],
2689
+ [417.5, 201.0],
2690
+ [367.485, 195.632],
2691
+ [530.673, 156.417],
2692
+ [473.749, 151.39],
2693
+ [419.503, 146.656],
2694
+ [368.669, 142.565],
2695
+ [534.632, 97.5152],
2696
+ [475.84, 94.6777],
2697
+ [421.16, 90.3223],
2698
+ [368.5, 87.5],
2699
+ [475.84, 94.6777],
2700
+ [421.16, 90.3223],
2701
+ [368.5, 87.5]]
2702
+
2703
+ # 7 point
2704
+ num_points = 7
2705
+ mat1 = CvMat.new(num_points, 2, :cv64f, 1)
2706
+ mat2 = CvMat.new(num_points, 2, :cv64f, 1)
2707
+
2708
+ points1[0...num_points].each_with_index { |pt, i|
2709
+ mat1[i, 0] = CvScalar.new(pt[0])
2710
+ mat1[i, 1] = CvScalar.new(pt[1])
2711
+ }
2712
+ points2[0...num_points].each_with_index { |pt, i|
2713
+ mat2[i, 0] = CvScalar.new(pt[0])
2714
+ mat2[i, 1] = CvScalar.new(pt[1])
2715
+ }
2716
+ f_mat1 = CvMat.find_fundamental_mat(mat1, mat2, CV_FM_7POINT)
2717
+ f_mat2, status = CvMat.find_fundamental_mat(mat1, mat2, CV_FM_7POINT, :with_status => true)
2718
+
2719
+ expected = [0.000009, 0.000029, -0.010343,
2720
+ -0.000033, 0.000000, 0.014590,
2721
+ 0.004415, -0.013420, 1.000000,
2722
+ 0.000000, 0.000001, -0.000223,
2723
+ -0.000001, 0.000036, -0.005309,
2724
+ -0.000097, -0.006463, 1.000000,
2725
+ 0.000002, 0.000005, -0.001621,
2726
+ -0.000005, 0.000031, -0.002559,
2727
+ 0.000527, -0.007424, 1.000000]
2728
+ [f_mat1, f_mat2].each { |f_mat|
2729
+ assert_equal(9, f_mat.rows)
2730
+ assert_equal(3, f_mat.cols)
2731
+ expected.each_with_index { |val, i|
2732
+ assert_in_delta(val, f_mat[i][0], 1.0e-5)
2733
+ }
2734
+ }
2735
+ assert_equal(num_points, status.cols)
2736
+ num_points.times { |i|
2737
+ assert_in_delta(1, status[i][0], 1.0e-5)
2738
+ }
2739
+
2740
+ # 8 point
2741
+ num_points = 8
2742
+ mat1 = CvMat.new(num_points, 2, :cv64f, 1)
2743
+ mat2 = CvMat.new(num_points, 2, :cv64f, 1)
2744
+
2745
+ points1[0...num_points].each_with_index { |pt, i|
2746
+ mat1[i, 0] = CvScalar.new(pt[0])
2747
+ mat1[i, 1] = CvScalar.new(pt[1])
2748
+ }
2749
+ points2[0...num_points].each_with_index { |pt, i|
2750
+ mat2[i, 0] = CvScalar.new(pt[0])
2751
+ mat2[i, 1] = CvScalar.new(pt[1])
2752
+ }
2753
+
2754
+ f_mat1 = CvMat.find_fundamental_mat(mat1, mat2, CV_FM_8POINT)
2755
+ f_mat2, status = CvMat.find_fundamental_mat(mat1, mat2, CV_FM_8POINT, :with_status => true)
2756
+
2757
+ expected = [0.000001, 0.000004, -0.001127,
2758
+ -0.000005, 0.000038, -0.003778,
2759
+ 0.000819, -0.008325, 1.000000]
2760
+ [f_mat1, f_mat2].each { |f_mat|
2761
+ assert_equal(3, f_mat.rows)
2762
+ assert_equal(3, f_mat.cols)
2763
+ expected.each_with_index { |val, i|
2764
+ assert_in_delta(val, f_mat[i][0], 1.0e-5)
2765
+ }
2766
+ }
2767
+ assert_equal(num_points, status.cols)
2768
+ num_points.times { |i|
2769
+ assert_in_delta(1, status[i][0], 1.0e-5)
2770
+ }
2771
+
2772
+ # RANSAC default
2773
+ num_points = points1.size
2774
+ mat1 = CvMat.new(num_points, 2, :cv64f, 1)
2775
+ mat2 = CvMat.new(num_points, 2, :cv64f, 1)
2776
+
2777
+ points1[0...num_points].each_with_index { |pt, i|
2778
+ mat1[i, 0] = CvScalar.new(pt[0])
2779
+ mat1[i, 1] = CvScalar.new(pt[1])
2780
+ }
2781
+ points2[0...num_points].each_with_index { |pt, i|
2782
+ mat2[i, 0] = CvScalar.new(pt[0])
2783
+ mat2[i, 1] = CvScalar.new(pt[1])
2784
+ }
2785
+
2786
+ [CvMat.find_fundamental_mat(mat1, mat2, CV_FM_RANSAC, :with_status => false,
2787
+ :maximum_distance => 1.0, :desirable_level => 0.99),
2788
+ CvMat.find_fundamental_mat(mat1, mat2, CV_FM_RANSAC)].each { |f_mat|
2789
+ assert_equal(3, f_mat.rows)
2790
+ assert_equal(3, f_mat.cols)
2791
+ expected = [0.000010, 0.000039, -0.011141,
2792
+ -0.000045, -0.000001, 0.019631,
2793
+ 0.004873, -0.017604, 1.000000]
2794
+ expected.each_with_index { |val, i|
2795
+ assert_in_delta(val, f_mat[i][0], 1.0e-5)
2796
+ }
2797
+ }
2798
+
2799
+ # RANSAC with options
2800
+ f_mat, status = CvMat.find_fundamental_mat(mat1, mat2, CV_FM_RANSAC, :with_status => true,
2801
+ :maximum_distance => 2.0, :desirable_level => 0.8)
2802
+ assert_equal(3, f_mat.rows)
2803
+ assert_equal(3, f_mat.cols)
2804
+ assert_equal(1, status.rows)
2805
+ assert_equal(num_points, status.cols)
2806
+
2807
+ expected_f_mat = [0.000009, 0.000030, -0.010692,
2808
+ -0.000039, 0.000000, 0.020567,
2809
+ 0.004779, -0.018064, 1.000000]
2810
+ expected_f_mat.each_with_index { |val, i|
2811
+ assert_in_delta(val, f_mat[i][0], 1.0e-5)
2812
+ }
2813
+ expected_status = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
2814
+ expected_status.each_with_index { |val, i|
2815
+ assert_in_delta(val, status[i][0], 1.0e-5)
2816
+ }
2817
+
2818
+ # LMedS default
2819
+ num_points = 12
2820
+ mat1 = CvMat.new(num_points, 2, :cv64f, 1)
2821
+ mat2 = CvMat.new(num_points, 2, :cv64f, 1)
2822
+
2823
+ points1[0...num_points].each_with_index { |pt, i|
2824
+ mat1[i, 0] = CvScalar.new(pt[0])
2825
+ mat1[i, 1] = CvScalar.new(pt[1])
2826
+ }
2827
+ points2[0...num_points].each_with_index { |pt, i|
2828
+ mat2[i, 0] = CvScalar.new(pt[0])
2829
+ mat2[i, 1] = CvScalar.new(pt[1])
2830
+ }
2831
+
2832
+ [CvMat.find_fundamental_mat(mat1, mat2, CV_FM_LMEDS, :with_status => false,
2833
+ :maximum_distance => 1.0, :desirable_level => 0.99),
2834
+ CvMat.find_fundamental_mat(mat1, mat2, CV_FM_LMEDS)].each { |f_mat|
2835
+ assert_equal(3, f_mat.rows)
2836
+ assert_equal(3, f_mat.cols)
2837
+ expected = [0.0, 0.0, 0.0,
2838
+ 0.0, 0.0, 0.0,
2839
+ 0.0, 0.0, 1.0]
2840
+ expected.each_with_index { |val, i|
2841
+ assert_in_delta(val, f_mat[i][0], 0.1)
2842
+ }
2843
+ }
2844
+
2845
+ # LMedS with options
2846
+ f_mat, status = CvMat.find_fundamental_mat(mat1, mat2, CV_FM_LMEDS, :with_status => true,
2847
+ :desirable_level => 0.8)
2848
+ assert_equal(3, f_mat.rows)
2849
+ assert_equal(3, f_mat.cols)
2850
+ assert_equal(1, status.rows)
2851
+ assert_equal(num_points, status.cols)
2852
+
2853
+ expected_fmat = [0.0, 0.0, 0.0,
2854
+ 0.0, 0.0, 0.0,
2855
+ 0.0, 0.0, 1.0]
2856
+ expected_f_mat.each_with_index { |val, i|
2857
+ assert_in_delta(val, f_mat[i][0], 0.1)
2858
+ }
2859
+ expected_status = [0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1]
2860
+ expected_status.each_with_index { |val, i|
2861
+ assert_equal(val, status[i][0].to_i)
2862
+ }
2863
+
2864
+ [CV_FM_7POINT, CV_FM_8POINT, CV_FM_RANSAC, CV_FM_LMEDS].each { |method|
2865
+ assert_raise(TypeError) {
2866
+ CvMat.find_fundamental_mat(DUMMY_OBJ, mat2, method, :with_status => true)
2867
+ }
2868
+ assert_raise(TypeError) {
2869
+ CvMat.find_fundamental_mat(mat1, DUMMY_OBJ, method, :with_status => true)
2870
+ }
2871
+ assert_raise(TypeError) {
2872
+ CvMat.find_fundamental_mat(mat1, mat2, method, DUMMY_OBJ)
2873
+ }
2874
+ }
2875
+ assert_raise(TypeError) {
2876
+ CvMat.find_fundamental_mat(mat1, mat2, DUMMY_OBJ, :with_status => true)
2877
+ }
2878
+ end
2879
+
2880
+ def test_compute_correspond_epilines
2881
+ test_func = lambda { |mat1, mat2, f_mat_arr, num_points|
2882
+ f_mat = CvMat.new(3, 3, CV_64F, 1)
2883
+ f_mat_arr.each_with_index { |a, i|
2884
+ f_mat[i] = CvScalar.new(a)
2885
+ }
2886
+
2887
+ line = CvMat.compute_correspond_epilines(mat1, 1, f_mat)
2888
+ assert_equal(num_points, line.rows)
2889
+ assert_equal(3, line.cols)
2890
+
2891
+ expected = [[-0.221257, -0.975215, 6.03758],
2892
+ [0.359337, -0.933208, -3.61419],
2893
+ [0.958304, -0.28575, -15.0573],
2894
+ [0.73415, -0.678987, -10.4037],
2895
+ [0.0208539, -0.999783, 2.11625],
2896
+ [0.284451, -0.958691, -2.31993],
2897
+ [0.624647, -0.780907, -8.35208],
2898
+ [0.618494, -0.785789, -8.23888],
2899
+ [0.766694, -0.642012, -11.0298],
2900
+ [0.700293, -0.713855, -9.76109]]
2901
+
2902
+ expected.size.times { |i|
2903
+ assert_in_delta(expected[i][0], line[i, 0][0], 1.0e-3)
2904
+ assert_in_delta(expected[i][1], line[i, 1][0], 1.0e-3)
2905
+ assert_in_delta(expected[i][2], line[i, 2][0], 1.0e-3)
2906
+ }
2907
+
2908
+ assert_raise(ArgumentError) {
2909
+ m = CvMat.new(10, 10, CV_32F, 1)
2910
+ CvMat.compute_correspond_epilines(m, 1, f_mat)
2911
+ }
2912
+ }
2913
+
2914
+ num_points = 10
2915
+ # input points are Nx2 matrix
2916
+ points1 =[[17, 175],
2917
+ [370, 24],
2918
+ [192, 456],
2919
+ [614, 202],
2920
+ [116, 111],
2921
+ [305, 32],
2922
+ [249, 268],
2923
+ [464, 157],
2924
+ [259, 333],
2925
+ [460, 224]]
2926
+
2927
+ points2 = [[295, 28],
2928
+ [584, 221],
2929
+ [67, 172],
2930
+ [400, 443],
2931
+ [330, 9],
2932
+ [480, 140],
2933
+ [181, 140],
2934
+ [350, 265],
2935
+ [176, 193],
2936
+ [333, 313]]
2937
+
2938
+ mat1 = CvMat.new(num_points, 2, CV_64F, 1)
2939
+ mat2 = CvMat.new(num_points, 2, CV_64F, 1)
2940
+ points1.flatten.each_with_index { |pt, i|
2941
+ mat1[i] = CvScalar.new(pt)
2942
+ }
2943
+ points2.flatten.each_with_index { |pt, i|
2944
+ mat2[i] = CvScalar.new(pt)
2945
+ }
2946
+
2947
+ # pre computed f matrix from points1, points2
2948
+ # f_mat = CvMat.find_fundamental_mat(mat1, mat2, CV_FM_LMEDS)
2949
+ f_mat_arr = [0.000266883, 0.000140277, -0.0445223,
2950
+ -0.00012592, 0.000245543, -0.108868,
2951
+ -0.00407942, -0.00291097, 1]
2952
+ test_func.call(mat1, mat2, f_mat_arr, num_points)
2953
+
2954
+ # input points are 2xN matrix
2955
+ points1 = [[17, 370, 192, 614, 116, 305, 249, 464, 259, 460],
2956
+ [175, 24, 456, 202, 111, 32, 268, 157, 333, 224]]
2957
+
2958
+ points2 = [[295, 584, 67, 400, 330, 480, 181, 350, 176, 333],
2959
+ [28, 221, 172, 443, 9, 140, 140, 265, 193, 313]]
2960
+
2961
+ mat1 = CvMat.new(2, num_points, CV_64F, 1)
2962
+ mat2 = CvMat.new(2, num_points, CV_64F, 1)
2963
+ points1.flatten.each_with_index { |pt, i|
2964
+ mat1[i] = CvScalar.new(pt)
2965
+ }
2966
+ points2.flatten.each_with_index { |pt, i|
2967
+ mat2[i] = CvScalar.new(pt)
2968
+ }
2969
+ test_func.call(mat1, mat2, f_mat_arr, num_points)
2970
+
2971
+
2972
+ f_mat = CvMat.new(3, 3, CV_64F, 1)
2973
+ f_mat_arr.each_with_index { |a, i|
2974
+ f_mat[i] = CvScalar.new(a)
2975
+ }
2976
+ assert_raise(TypeError) {
2977
+ CvMat.compute_correspond_epilines(DUMMY_OBJ, 1, f_mat)
2978
+ }
2979
+ assert_raise(TypeError) {
2980
+ CvMat.compute_correspond_epilines(mat1, DUMMY_OBJ, f_mat)
2981
+ }
2982
+ assert_raise(TypeError) {
2983
+ CvMat.compute_correspond_epilines(mat1, 1, DUMMY_OBJ)
2984
+ }
2985
+ end
2986
+
2987
+ def test_apply_color_map
2988
+ mat = CvMat.new(64, 256, :cv8u, 1)
2989
+ mat.cols.times { |c|
2990
+ mat.rows.times { |r|
2991
+ mat[r, c] = c
2992
+ }
2993
+ }
2994
+
2995
+ results = []
2996
+ [COLORMAP_AUTUMN, COLORMAP_BONE, COLORMAP_JET, COLORMAP_WINTER,
2997
+ COLORMAP_RAINBOW, COLORMAP_OCEAN, COLORMAP_SUMMER, COLORMAP_SPRING,
2998
+ COLORMAP_COOL, COLORMAP_HSV, COLORMAP_PINK, COLORMAP_HOT].each { |colormap|
2999
+ cmap = mat.apply_color_map(colormap)
3000
+ assert_equal(CvMat, cmap.class)
3001
+ assert_equal(mat.rows, cmap.rows)
3002
+ assert_equal(mat.cols, cmap.cols)
3003
+ results << cmap
3004
+ }
3005
+
3006
+ assert_raise(TypeError) {
3007
+ mat.apply_color_map(DUMMY_OBJ)
3008
+ }
3009
+
3010
+ # Uncomment the following line to show the result
3011
+ # snap *results
3012
+ end
3013
+
3014
+ def test_subspace_project
3015
+ w = CvMat.new(10, 20, :cv32f, 1)
3016
+ mean = CvMat.new(w.rows, 1, :cv32f, 1)
3017
+ mat = CvMat.new(w.cols, w.rows, :cv32f, 1)
3018
+ result = mat.subspace_project(w, mean)
3019
+
3020
+ assert_equal(CvMat, result.class)
3021
+ assert_equal(w.cols, result.rows)
3022
+ assert_equal(w.cols, result.cols)
3023
+ end
3024
+
3025
+ def test_subspace_reconstruct
3026
+ w = CvMat.new(10, 20, :cv32f, 1)
3027
+ mean = CvMat.new(w.rows, 1, :cv32f, 1)
3028
+ mat = CvMat.new(w.cols, w.cols, :cv32f, 1)
3029
+ result = mat.subspace_reconstruct(w, mean)
3030
+
3031
+ assert_equal(CvMat, result.class)
3032
+ assert_equal(w.cols, result.rows)
3033
+ assert_equal(w.rows, result.cols)
3034
+ end
3035
+ end
3036
+