bonanza-ruby-opencv 0.0.13.20140330211753

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) 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 +98 -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 +607 -0
  50. data/ext/opencv/cvcapture.h +72 -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 +332 -0
  58. data/ext/opencv/cvcontour.h +48 -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 +715 -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 +6829 -0
  78. data/ext/opencv/cvmat.h +323 -0
  79. data/ext/opencv/cvmemstorage.cpp +73 -0
  80. data/ext/opencv/cvmemstorage.h +53 -0
  81. data/ext/opencv/cvmoments.cpp +293 -0
  82. data/ext/opencv/cvmoments.h +75 -0
  83. data/ext/opencv/cvpoint.cpp +265 -0
  84. data/ext/opencv/cvpoint.h +67 -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 +441 -0
  90. data/ext/opencv/cvrect.h +88 -0
  91. data/ext/opencv/cvscalar.cpp +301 -0
  92. data/ext/opencv/cvscalar.h +76 -0
  93. data/ext/opencv/cvseq.cpp +605 -0
  94. data/ext/opencv/cvseq.h +74 -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 +279 -0
  104. data/ext/opencv/cvsurfpoint.h +54 -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 +221 -0
  110. data/ext/opencv/cvutils.h +31 -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 +82 -0
  116. data/ext/opencv/facerecognizer.cpp +181 -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 +666 -0
  125. data/ext/opencv/iplimage.h +75 -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 +833 -0
  131. data/ext/opencv/opencv.h +405 -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 +4 -0
  144. data/test/eigenfaces_save.xml +7524 -0
  145. data/test/fisherfaces_save.xml +7530 -0
  146. data/test/helper.rb +166 -0
  147. data/test/lbph_save.xml +4304 -0
  148. data/test/runner.rb +30 -0
  149. data/test/samples/airplane.jpg +0 -0
  150. data/test/samples/baboon.jpg +0 -0
  151. data/test/samples/baboon200.jpg +0 -0
  152. data/test/samples/baboon200_rotated.jpg +0 -0
  153. data/test/samples/blank0.jpg +0 -0
  154. data/test/samples/blank1.jpg +0 -0
  155. data/test/samples/blank2.jpg +0 -0
  156. data/test/samples/blank3.jpg +0 -0
  157. data/test/samples/blank4.jpg +0 -0
  158. data/test/samples/blank5.jpg +0 -0
  159. data/test/samples/blank6.jpg +0 -0
  160. data/test/samples/blank7.jpg +0 -0
  161. data/test/samples/blank8.jpg +0 -0
  162. data/test/samples/blank9.jpg +0 -0
  163. data/test/samples/cat.jpg +0 -0
  164. data/test/samples/chessboard.jpg +0 -0
  165. data/test/samples/contours.jpg +0 -0
  166. data/test/samples/fruits.jpg +0 -0
  167. data/test/samples/haarcascade_frontalface_alt.xml.gz +0 -0
  168. data/test/samples/inpaint-mask.bmp +0 -0
  169. data/test/samples/lena-256x256.jpg +0 -0
  170. data/test/samples/lena-32x32.jpg +0 -0
  171. data/test/samples/lena-eyes.jpg +0 -0
  172. data/test/samples/lena-inpaint.jpg +0 -0
  173. data/test/samples/lena.jpg +0 -0
  174. data/test/samples/lines.jpg +0 -0
  175. data/test/samples/messy0.jpg +0 -0
  176. data/test/samples/messy1.jpg +0 -0
  177. data/test/samples/movie_sample.avi +0 -0
  178. data/test/samples/one_way_train_0000.jpg +0 -0
  179. data/test/samples/one_way_train_0001.jpg +0 -0
  180. data/test/samples/partially_blank0.jpg +0 -0
  181. data/test/samples/partially_blank1.jpg +0 -0
  182. data/test/samples/smooth0.jpg +0 -0
  183. data/test/samples/smooth1.jpg +0 -0
  184. data/test/samples/smooth2.jpg +0 -0
  185. data/test/samples/smooth3.jpg +0 -0
  186. data/test/samples/smooth4.jpg +0 -0
  187. data/test/samples/smooth5.jpg +0 -0
  188. data/test/samples/smooth6.jpg +0 -0
  189. data/test/samples/str-cv-rotated.jpg +0 -0
  190. data/test/samples/str-cv.jpg +0 -0
  191. data/test/samples/str-ov.jpg +0 -0
  192. data/test/samples/stuff.jpg +0 -0
  193. data/test/test_curve.rb +43 -0
  194. data/test/test_cvavgcomp.rb +24 -0
  195. data/test/test_cvbox2d.rb +76 -0
  196. data/test/test_cvcapture.rb +183 -0
  197. data/test/test_cvchain.rb +108 -0
  198. data/test/test_cvcircle32f.rb +41 -0
  199. data/test/test_cvconnectedcomp.rb +61 -0
  200. data/test/test_cvcontour.rb +150 -0
  201. data/test/test_cvcontourtree.rb +43 -0
  202. data/test/test_cverror.rb +50 -0
  203. data/test/test_cvfeaturetree.rb +65 -0
  204. data/test/test_cvfont.rb +58 -0
  205. data/test/test_cvhaarclassifiercascade.rb +63 -0
  206. data/test/test_cvhistogram.rb +271 -0
  207. data/test/test_cvhumoments.rb +83 -0
  208. data/test/test_cvline.rb +50 -0
  209. data/test/test_cvmat.rb +3003 -0
  210. data/test/test_cvmat_drawing.rb +349 -0
  211. data/test/test_cvmat_dxt.rb +150 -0
  212. data/test/test_cvmat_imageprocessing.rb +2085 -0
  213. data/test/test_cvmoments.rb +180 -0
  214. data/test/test_cvpoint.rb +75 -0
  215. data/test/test_cvpoint2d32f.rb +75 -0
  216. data/test/test_cvpoint3d32f.rb +93 -0
  217. data/test/test_cvrect.rb +144 -0
  218. data/test/test_cvscalar.rb +113 -0
  219. data/test/test_cvseq.rb +295 -0
  220. data/test/test_cvsize.rb +75 -0
  221. data/test/test_cvsize2d32f.rb +75 -0
  222. data/test/test_cvslice.rb +31 -0
  223. data/test/test_cvsurfparams.rb +57 -0
  224. data/test/test_cvsurfpoint.rb +66 -0
  225. data/test/test_cvtermcriteria.rb +56 -0
  226. data/test/test_cvtwopoints.rb +40 -0
  227. data/test/test_cvvideowriter.rb +58 -0
  228. data/test/test_eigenfaces.rb +93 -0
  229. data/test/test_fisherfaces.rb +93 -0
  230. data/test/test_iplconvkernel.rb +54 -0
  231. data/test/test_iplimage.rb +232 -0
  232. data/test/test_lbph.rb +152 -0
  233. data/test/test_mouseevent.rb +17 -0
  234. data/test/test_opencv.rb +360 -0
  235. data/test/test_pointset.rb +128 -0
  236. data/test/test_preliminary.rb +130 -0
  237. data/test/test_trackbar.rb +47 -0
  238. data/test/test_window.rb +115 -0
  239. data/yard_extension.rb +5 -0
  240. metadata +399 -0
@@ -0,0 +1,148 @@
1
+ /************************************************************
2
+
3
+ cvhaarclassifercascade.cpp -
4
+
5
+ $Author: lsxi $
6
+
7
+ Copyright (C) 2005-2007 Masakazu Yonekura
8
+
9
+ ************************************************************/
10
+ #include "cvhaarclassifiercascade.h"
11
+ /*
12
+ * Document-class: OpenCV::CvHaarClassifierCascade
13
+ *
14
+ * Haar Feature-based Cascade Classifier for Object Detection
15
+ */
16
+ __NAMESPACE_BEGIN_OPENCV
17
+ __NAMESPACE_BEGIN_CVHAARCLASSIFERCASCADE
18
+
19
+ VALUE rb_klass;
20
+
21
+ VALUE
22
+ rb_class()
23
+ {
24
+ return rb_klass;
25
+ }
26
+
27
+ VALUE
28
+ rb_allocate(VALUE klass)
29
+ {
30
+ return OPENCV_OBJECT(klass, 0);
31
+ }
32
+
33
+ void
34
+ cvhaarclassifiercascade_free(void* ptr)
35
+ {
36
+ if (ptr) {
37
+ CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)ptr;
38
+ cvReleaseHaarClassifierCascade(&cascade);
39
+ }
40
+ }
41
+
42
+ /*
43
+ * Load trained cascade of haar classifers from file.
44
+ *
45
+ * @overload load(filename)
46
+ * @param filename [String] Haar classifer file name
47
+ * @return [CvHaarClassifierCascade] Object detector
48
+ * @scope class
49
+ * @opencv_func cvLoad
50
+ */
51
+ VALUE
52
+ rb_load(VALUE klass, VALUE path)
53
+ {
54
+ CvHaarClassifierCascade *cascade = NULL;
55
+ try {
56
+ cascade = (CvHaarClassifierCascade*)cvLoad(StringValueCStr(path), 0, 0, 0);
57
+ }
58
+ catch (cv::Exception& e) {
59
+ raise_cverror(e);
60
+ }
61
+ if (!CV_IS_HAAR_CLASSIFIER(cascade))
62
+ rb_raise(rb_eArgError, "invalid format haar classifier cascade file.");
63
+ return Data_Wrap_Struct(klass, 0, cvhaarclassifiercascade_free, cascade);
64
+ }
65
+
66
+ /*
67
+ * Detects objects of different sizes in the input image.
68
+ *
69
+ * @overload detect_objects(image, options = nil)
70
+ * @param image [CvMat,IplImage] Matrix of the type CV_8U containing an image where objects are detected.
71
+ * @param options [Hash] Options
72
+ * @option options [Number] :scale_factor
73
+ * Parameter specifying how much the image size is reduced at each image scale.
74
+ * @option options [Number] :storage
75
+ * Memory storage to store the resultant sequence of the object candidate rectangles
76
+ * @option options [Number] :min_neighbors
77
+ * Parameter specifying how many neighbors each candidate rectangle should have to retain it.
78
+ * @option options [CvSize] :min_size
79
+ * Minimum possible object size. Objects smaller than that are ignored.
80
+ * @option options [CvSize] :max_size
81
+ * Maximum possible object size. Objects larger than that are ignored.
82
+ * @return [CvSeq<CvAvgComp>] Detected objects as a list of rectangles
83
+ * @opencv_func cvHaarDetectObjects
84
+ */
85
+ VALUE
86
+ rb_detect_objects(int argc, VALUE *argv, VALUE self)
87
+ {
88
+ VALUE image, options;
89
+ rb_scan_args(argc, argv, "11", &image, &options);
90
+
91
+ double scale_factor;
92
+ int flags, min_neighbors;
93
+ CvSize min_size, max_size;
94
+ VALUE storage_val;
95
+ if (NIL_P(options)) {
96
+ scale_factor = 1.1;
97
+ flags = 0;
98
+ min_neighbors = 3;
99
+ min_size = max_size = cvSize(0, 0);
100
+ storage_val = cCvMemStorage::new_object();
101
+ }
102
+ else {
103
+ scale_factor = IF_DBL(LOOKUP_HASH(options, "scale_factor"), 1.1);
104
+ flags = IF_INT(LOOKUP_HASH(options, "flags"), 0);
105
+ min_neighbors = IF_INT(LOOKUP_HASH(options, "min_neighbors"), 3);
106
+ VALUE min_size_val = LOOKUP_HASH(options, "min_size");
107
+ min_size = NIL_P(min_size_val) ? cvSize(0, 0) : VALUE_TO_CVSIZE(min_size_val);
108
+ VALUE max_size_val = LOOKUP_HASH(options, "max_size");
109
+ max_size = NIL_P(max_size_val) ? cvSize(0, 0) : VALUE_TO_CVSIZE(max_size_val);
110
+ storage_val = CHECK_CVMEMSTORAGE(LOOKUP_HASH(options, "storage"));
111
+ }
112
+
113
+ VALUE result = Qnil;
114
+ try {
115
+ CvSeq *seq = cvHaarDetectObjects(CVARR_WITH_CHECK(image), CVHAARCLASSIFIERCASCADE(self), CVMEMSTORAGE(storage_val),
116
+ scale_factor, min_neighbors, flags, min_size, max_size);
117
+ result = cCvSeq::new_sequence(cCvSeq::rb_class(), seq, cCvAvgComp::rb_class(), storage_val);
118
+ if (rb_block_given_p()) {
119
+ for(int i = 0; i < seq->total; ++i)
120
+ rb_yield(REFER_OBJECT(cCvAvgComp::rb_class(), cvGetSeqElem(seq, i), storage_val));
121
+ }
122
+ }
123
+ catch (cv::Exception& e) {
124
+ raise_cverror(e);
125
+ }
126
+ return result;
127
+ }
128
+
129
+ void
130
+ init_ruby_class()
131
+ {
132
+ #if 0
133
+ // For documentation using YARD
134
+ VALUE opencv = rb_define_module("OpenCV");
135
+ #endif
136
+
137
+ if (rb_klass)
138
+ return;
139
+
140
+ VALUE opencv = rb_module_opencv();
141
+ rb_klass = rb_define_class_under(opencv, "CvHaarClassifierCascade", rb_cObject);
142
+ rb_define_alloc_func(rb_klass, rb_allocate);
143
+ rb_define_singleton_method(rb_klass, "load", RUBY_METHOD_FUNC(rb_load), 1);
144
+ rb_define_method(rb_klass, "detect_objects", RUBY_METHOD_FUNC(rb_detect_objects), -1);
145
+ }
146
+
147
+ __NAMESPACE_END_CVHAARCLASSIFERCASCADE
148
+ __NAMESPACE_END_OPENCV
@@ -0,0 +1,39 @@
1
+ /************************************************************
2
+
3
+ cvhaarclassifiercascade.h -
4
+
5
+ $Author: lsxi $
6
+
7
+ Copyright (C) 2005-2006 Masakazu Yonekura
8
+
9
+ ************************************************************/
10
+ #ifndef RUBY_OPENCV_CVHAARCLASSIFIERCASCADE_H
11
+ #define RUBY_OPENCV_CVHAARCLASSIFIERCASCADE_H
12
+
13
+ #define __NAMESPACE_BEGIN_CVHAARCLASSIFERCASCADE namespace cCvHaarClassifierCascade {
14
+ #define __NAMESPACE_END_CVHAARCLASSIFERCASCADE }
15
+
16
+ #include "opencv.h"
17
+
18
+ __NAMESPACE_BEGIN_OPENCV
19
+ __NAMESPACE_BEGIN_CVHAARCLASSIFERCASCADE
20
+
21
+ VALUE rb_class();
22
+
23
+ void init_ruby_class();
24
+
25
+ VALUE rb_allocate(VALUE klass);
26
+
27
+ VALUE rb_load(VALUE klass, VALUE path);
28
+ VALUE rb_detect_objects(int argc, VALUE *argv, VALUE self);
29
+
30
+ __NAMESPACE_END_CVHAARCLASSIFERCASCADE
31
+ inline CvHaarClassifierCascade*
32
+ CVHAARCLASSIFIERCASCADE(VALUE object) {
33
+ CvHaarClassifierCascade *ptr;
34
+ Data_Get_Struct(object, CvHaarClassifierCascade, ptr);
35
+ return ptr;
36
+ }
37
+ __NAMESPACE_END_OPENCV
38
+
39
+ #endif // RUBY_OPENCV_CVHAARCLASSIFIERCASCADE_H
@@ -0,0 +1,715 @@
1
+ /************************************************************
2
+
3
+ cvhistogram.cpp -
4
+
5
+ $Author: lsxi $
6
+
7
+ Copyright (C) 2005-2008 Masakazu Yonekura
8
+
9
+ ************************************************************/
10
+ #include "cvhistogram.h"
11
+ /*
12
+ * Document-class: OpenCV::CvHistogram
13
+ *
14
+ * Multi-dimensional histogram.
15
+ */
16
+ __NAMESPACE_BEGIN_OPENCV
17
+ __NAMESPACE_BEGIN_CVHISTOGRAM
18
+
19
+ VALUE rb_klass;
20
+
21
+ VALUE
22
+ rb_class()
23
+ {
24
+ return rb_klass;
25
+ }
26
+
27
+ void
28
+ release_hist(void* ptr)
29
+ {
30
+ if (ptr) {
31
+ try {
32
+ cvReleaseHist((CvHistogram**)&ptr);
33
+ }
34
+ catch (cv::Exception& e) {
35
+ raise_cverror(e);
36
+ }
37
+ }
38
+ }
39
+
40
+ VALUE
41
+ rb_allocate(VALUE klass)
42
+ {
43
+ CvHistogram* ptr = NULL;
44
+ return Data_Wrap_Struct(klass, 0, release_hist, ptr);
45
+ }
46
+
47
+ float*
48
+ ary2fltptr(VALUE ary, float* buff)
49
+ {
50
+ Check_Type(ary, T_ARRAY);
51
+ int size = RARRAY_LEN(ary);
52
+ VALUE* ary_ptr = RARRAY_PTR(ary);
53
+ for (int i = 0; i < size; ++i) {
54
+ buff[i] = NUM2DBL(ary_ptr[i]);
55
+ }
56
+ return buff;
57
+ }
58
+
59
+ int*
60
+ ary2intptr(VALUE ary, int* buff)
61
+ {
62
+ Check_Type(ary, T_ARRAY);
63
+ int size = RARRAY_LEN(ary);
64
+ VALUE* ary_ptr = RARRAY_PTR(ary);
65
+ for (int i = 0; i < size; ++i) {
66
+ buff[i] = NUM2INT(ary_ptr[i]);
67
+ }
68
+ return buff;
69
+ }
70
+
71
+ /*
72
+ * Creates a histogram
73
+ * @overload new(dims, sizes, type, ranges=nil, uniform=true)
74
+ * @param dims [Integer] Number of histogram dimensions
75
+ * @param sizes [Array<Integer>] Array of the histogram dimension sizes
76
+ * @param type [Integer]
77
+ * Histogram representation format. CV_HIST_ARRAY means that the histogram data is represented
78
+ * as a multi-dimensional dense array CvMatND. CV_HIST_SPARSE means that histogram data is
79
+ * represented as a multi-dimensional sparse array CvSparseMat.
80
+ * @param ranges [Array<Integer>]
81
+ * Array of ranges for the histogram bins. Its meaning depends on the uniform parameter value.
82
+ * The ranges are used when the histogram is calculated or backprojected to determine which
83
+ * histogram bin corresponds to which value/tuple of values from the input image(s).
84
+ * @param uniform [Boolean] Uniformity flag.
85
+ * @return [CvHistogram] Histogram
86
+ * @opencv_func cvCreateHist
87
+ */
88
+ VALUE
89
+ rb_initialize(int argc, VALUE *argv, VALUE self)
90
+ {
91
+ VALUE _dims, _sizes, _type, _ranges, _uniform;
92
+ int uniform;
93
+ int* sizes;
94
+ float** ranges = NULL;
95
+
96
+ rb_scan_args(argc, argv, "32", &_dims, &_sizes, &_type, &_ranges, &_uniform);
97
+ int sizes_len = RARRAY_LEN(_sizes);
98
+ sizes = ALLOCA_N(int, sizes_len);
99
+
100
+ if (NIL_P(_ranges)) {
101
+ sizes = ary2intptr(_sizes, sizes);
102
+ ranges = NULL;
103
+ }
104
+ else {
105
+ ranges = ALLOCA_N(float*, sizes_len);
106
+ VALUE* range_ptr = RARRAY_PTR(_ranges);
107
+ int i;
108
+ for (i = 0; i < sizes_len; i++) {
109
+ sizes[i] = NUM2INT(RARRAY_PTR(_sizes)[i]);
110
+ ranges[i] = ary2fltptr(range_ptr[i], ALLOCA_N(float, 2));
111
+ }
112
+ }
113
+ uniform = TRUE_OR_FALSE(_uniform, 1);
114
+
115
+ try {
116
+ DATA_PTR(self) = cvCreateHist(NUM2INT(_dims), sizes, NUM2INT(_type), ranges, uniform);
117
+ }
118
+ catch (cv::Exception& e) {
119
+ raise_cverror(e);
120
+ }
121
+
122
+ return self;
123
+ }
124
+
125
+ /*
126
+ * Returns <tt>self</tt> is uniform histogram or not
127
+ * @overload is_uniform?
128
+ * @return [Boolean] Uniform or not
129
+ * @opencv_func CV_IS_UNIFORM_HIST
130
+ */
131
+ VALUE
132
+ rb_is_uniform(VALUE self)
133
+ {
134
+ return CV_IS_UNIFORM_HIST(CVHISTOGRAM(self)) ? Qtrue : Qfalse;
135
+ }
136
+
137
+ /*
138
+ * Returns <tt>self</tt> is sparse histogram or not
139
+ * @overload is_sparse?
140
+ * @return [Boolean] Sparse or not
141
+ * @opencv_func CV_IS_SPARSE_HIST
142
+ */
143
+ VALUE
144
+ rb_is_sparse(VALUE self)
145
+ {
146
+ return CV_IS_SPARSE_HIST(CVHISTOGRAM(self)) ? Qtrue : Qfalse;
147
+ }
148
+
149
+ /*
150
+ * Returns <tt>self</tt> has range or not
151
+ * @overload has_range?
152
+ * @return [Boolean] Has range or not
153
+ * @opencv_func CV_HIST_HAS_RANGES
154
+ */
155
+ VALUE
156
+ rb_has_range(VALUE self)
157
+ {
158
+ return CV_HIST_HAS_RANGES(CVHISTOGRAM(self)) ? Qtrue : Qfalse;
159
+ }
160
+
161
+ /*
162
+ * Calculates a histogram of a set of arrays.
163
+ * @overload calc_hist(images, accumulate=nil, mask=nil)
164
+ * @param images [Array<IplImage>]
165
+ * Source arrays. They all should have the same depth, CV_8U or CV_32F, and the same size.
166
+ * Each of them can have an arbitrary number of channels.
167
+ * @param accumulate [Boolean]
168
+ * Accumulation flag. If it is set, the histogram is not cleared in the beginning when it is allocated.
169
+ * This feature enables you to compute a single histogram from several sets of arrays,
170
+ * or to update the histogram in time.
171
+ * @param mask [CvMat]
172
+ * Optional mask. If the matrix is not empty, it must be an 8-bit array of the same size as images[i].
173
+ * The non-zero mask elements mark the array elements counted in the histogram.
174
+ * @return [CvHistogram] Histogram of a set of arrays
175
+ * @opencv_func cvCalcHist
176
+ */
177
+ VALUE
178
+ rb_calc_hist(int argc, VALUE* argv, VALUE self)
179
+ {
180
+ return rb_calc_hist_bang(argc, argv, rb_copy_hist(self));
181
+ }
182
+
183
+ /*
184
+ * Calculates a histogram of a set of arrays.
185
+ * @overload calc_hist!(images, accumulate=nil, mask=nil)
186
+ * @see #calc_hist
187
+ * @opencv_func cvCalcHist
188
+ */
189
+ VALUE
190
+ rb_calc_hist_bang(int argc, VALUE* argv, VALUE self)
191
+ {
192
+ VALUE images, accumulate, mask;
193
+ rb_scan_args(argc, argv, "12", &images, &accumulate, &mask);
194
+ Check_Type(images, T_ARRAY);
195
+ int num_images = RARRAY_LEN(images);
196
+ IplImage** img = ALLOCA_N(IplImage*, num_images);
197
+ VALUE* images_ptr = RARRAY_PTR(images);
198
+ for (int i = 0; i < num_images; i++) {
199
+ img[i] = IPLIMAGE_WITH_CHECK(images_ptr[i]);
200
+ }
201
+ CvMat* m = NIL_P(mask) ? NULL : CVMAT_WITH_CHECK(mask);
202
+ try {
203
+ cvCalcHist(img, CVHISTOGRAM(self), TRUE_OR_FALSE(accumulate, 0), m);
204
+ }
205
+ catch (cv::Exception& e) {
206
+ raise_cverror(e);
207
+ }
208
+
209
+ return self;
210
+ }
211
+
212
+ /*
213
+ * Queries the value of the histogram bin.
214
+ * @overload [](idx0)
215
+ * @overload [](idx0, idx1)
216
+ * @overload [](idx0, idx1, idx2)
217
+ * @overload [](idx0, idx1, idx2, idx3, ...)
218
+ * @param idx* [Integer] *-th index
219
+ * @return [Number] The value of the specified bin of the 1D, 2D, 3D, or N-D histogram.
220
+ * @opencv_func cvQueryHistValue_1D
221
+ * @opencv_func cvQueryHistValue_2D
222
+ * @opencv_func cvQueryHistValue_3D
223
+ * @opencv_func cvQueryHistValue_nD
224
+ */
225
+ VALUE
226
+ rb_aref(VALUE self, VALUE args)
227
+ {
228
+ int num_idx = RARRAY_LEN(args);
229
+ int* idx = ALLOCA_N(int, num_idx);
230
+ VALUE* args_ptr = RARRAY_PTR(args);
231
+ for (int i = 0; i < num_idx; i++) {
232
+ idx[i] = NUM2INT(args_ptr[i]);
233
+ }
234
+
235
+ float value = 0.0;
236
+ CvHistogram* self_ptr = CVHISTOGRAM(self);
237
+ try {
238
+ switch (num_idx) {
239
+ case 1:
240
+ value = cvQueryHistValue_1D(self_ptr, idx[0]);
241
+ break;
242
+ case 2:
243
+ value = cvQueryHistValue_2D(self_ptr, idx[0], idx[1]);
244
+ break;
245
+ case 3:
246
+ value = cvQueryHistValue_3D(self_ptr, idx[0], idx[1], idx[2]);
247
+ break;
248
+ default:
249
+ value = cvQueryHistValue_nD(self_ptr, idx);
250
+ break;
251
+ }
252
+ }
253
+ catch (cv::Exception& e) {
254
+ raise_cverror(e);
255
+ }
256
+
257
+ return rb_float_new((double)value);
258
+ }
259
+
260
+ /*
261
+ * Finds the minimum and maximum histogram bins.
262
+ * @overload min_max_value
263
+ * @return [Array]
264
+ * [min_value, max_value, min_idx, max_idx]: Array of the minimum / maximum value of the histogram
265
+ * and their coordinates.
266
+ * - min_value: The minimum value of the histogram.
267
+ * - max_value: The maximum value of the histogram.
268
+ * - min_idx: The array of coordinates for the minimum.
269
+ * - max_idx: The array of coordinates for the maximum.
270
+ * @opencv_func cvGetMinMaxHistValue
271
+ */
272
+ VALUE
273
+ rb_min_max_value(VALUE self)
274
+ {
275
+ CvHistogram* self_ptr = CVHISTOGRAM(self);
276
+ int dims = 0;
277
+ float min_value = 0.0, max_value = 0.0;
278
+ int *min_idx = NULL;
279
+ int *max_idx = NULL;
280
+ try {
281
+ dims = cvGetDims(self_ptr->bins, NULL);
282
+ min_idx = ALLOCA_N(int, dims);
283
+ max_idx = ALLOCA_N(int, dims);
284
+ cvGetMinMaxHistValue(CVHISTOGRAM(self), &min_value, &max_value, min_idx, max_idx);
285
+ }
286
+ catch (cv::Exception& e) {
287
+ raise_cverror(e);
288
+ }
289
+
290
+ VALUE _min_idx = rb_ary_new2(dims);
291
+ VALUE _max_idx = rb_ary_new2(dims);
292
+ for (int i = 0; i < dims; i++) {
293
+ rb_ary_store(_min_idx, i, INT2NUM(min_idx[i]));
294
+ rb_ary_store(_max_idx, i, INT2NUM(max_idx[i]));
295
+ }
296
+
297
+ return rb_ary_new3(4, rb_float_new((double)min_value), rb_float_new((double)max_value),
298
+ _min_idx, _max_idx);
299
+ }
300
+
301
+ /*
302
+ * Returns number of array dimensions
303
+ * @overload [](idx0, idx1, ...)
304
+ * @param idx* [Integer] *-th index
305
+ * @return [Array<Integer, Array<Integer>>]
306
+ * [dims, sizes]: Number of array dimensions and its sizes.
307
+ * - dims (Integer): Number of array dimensions
308
+ * - sizes (Array<Integer>): Vector of the array dimension sizes.
309
+ * For 2D arrays the number of rows (height) goes first,
310
+ * number of columns (width) next.
311
+ * @opencv_func cvGetDims
312
+ */
313
+ VALUE
314
+ rb_dims(VALUE self)
315
+ {
316
+ VALUE _sizes = Qnil;
317
+ int size[CV_MAX_DIM];
318
+ int dims = 0;
319
+ try {
320
+ dims = cvGetDims(CVHISTOGRAM(self)->bins, size);
321
+ _sizes = rb_ary_new2(dims);
322
+ for (int i = 0; i < dims; ++i) {
323
+ rb_ary_store(_sizes, i, INT2NUM(size[i]));
324
+ }
325
+ }
326
+ catch (cv::Exception& e) {
327
+ raise_cverror(e);
328
+ }
329
+ return rb_assoc_new(INT2NUM(dims), _sizes);
330
+ }
331
+
332
+ /*
333
+ * Clones histogram
334
+ * @overload copy_hist
335
+ * @return [CvHistogram] Copy of the histogram
336
+ * @opencv_func cvCopyHist
337
+ */
338
+ VALUE
339
+ rb_copy_hist(VALUE self)
340
+ {
341
+ CvHistogram* hist = NULL;
342
+ try {
343
+ cvCopyHist(CVHISTOGRAM(self), &hist);
344
+ }
345
+ catch (cv::Exception& e) {
346
+ raise_cverror(e);
347
+ }
348
+ return Data_Wrap_Struct(rb_klass, 0, release_hist, hist);
349
+ }
350
+
351
+ /*
352
+ * Sets all histogram bins to 0 in case of dense histogram
353
+ * and removes all histogram bins in case of sparse array.
354
+ * @overload clear_hist
355
+ * @return [CvHistogram] Cleared histogram
356
+ * @opencv_func cvClearHist
357
+ */
358
+ VALUE
359
+ rb_clear_hist(VALUE self)
360
+ {
361
+ return rb_clear_hist_bang(rb_copy_hist(self));
362
+ }
363
+
364
+ /*
365
+ * Sets all histogram bins to 0 in case of dense histogram
366
+ * and removes all histogram bins in case of sparse array.
367
+ * This method changes <tt>self</tt>.
368
+ * @overload clear_hist!
369
+ * @see #clear_hist
370
+ * @return [CvHistogram] Cleared histogram
371
+ * @opencv_func cvClearHist
372
+ */
373
+ VALUE
374
+ rb_clear_hist_bang(VALUE self)
375
+ {
376
+ try {
377
+ cvClearHist(CVHISTOGRAM(self));
378
+ }
379
+ catch (cv::Exception& e) {
380
+ raise_cverror(e);
381
+ }
382
+ return self;
383
+ }
384
+
385
+ /*
386
+ * Returns normalized the histogram bins by scaling them,
387
+ * such that the sum of the bins becomes equal to <tt>factor</tt>.
388
+ * @overload normalize(factor)
389
+ * @param factor [Number] Normalization factor. The sum of the bins becomes equal to this value.
390
+ * @return [CvHistogram] Normalized histogram
391
+ * @opencv_func cvNormalizeHist
392
+ */
393
+ VALUE
394
+ rb_normalize_hist(VALUE self, VALUE factor)
395
+ {
396
+ return rb_normalize_hist_bang(rb_copy_hist(self), factor);
397
+ }
398
+
399
+ /*
400
+ * Returns normalized the histogram bins by scaling them,
401
+ * such that the sum of the bins becomes equal to <tt>factor</tt>.
402
+ * This method changes <tt>self</tt>.
403
+ * @overload normalize!(factor)
404
+ * @param factor [Number] Normalization factor. The sum of the bins becomes equal to this value.
405
+ * @return [CvHistogram] Normalized histogram
406
+ * @see #normalize
407
+ * @opencv_func cvNormalizeHist
408
+ */
409
+ VALUE
410
+ rb_normalize_hist_bang(VALUE self, VALUE factor)
411
+ {
412
+ try {
413
+ cvNormalizeHist(CVHISTOGRAM(self), NUM2DBL(factor));
414
+ }
415
+ catch (cv::Exception& e) {
416
+ raise_cverror(e);
417
+ }
418
+ return self;
419
+ }
420
+
421
+ /*
422
+ * Returns cleared histogram bins that are below the specified threshold.
423
+ * @overload thresh_hist(threshold)
424
+ * @param threshold [Number] Threshold value
425
+ * @return [CvHistogram] Cleared histogram
426
+ * @opencv_func cvThreshHist
427
+ */
428
+ VALUE
429
+ rb_thresh_hist(VALUE self, VALUE threshold)
430
+ {
431
+ return rb_thresh_hist_bang(rb_copy_hist(self), threshold);
432
+ }
433
+
434
+ /*
435
+ * Cleares histogram bins that are below the specified threshold.
436
+ * This method changes <tt>self</tt>.
437
+ * @overload thresh_hist!(threshold)
438
+ * @param threshold [Number] Threshold value
439
+ * @return [CvHistogram] Cleared histogram
440
+ * @see #thresh_hist
441
+ * @opencv_func cvThreshHist
442
+ */
443
+ VALUE
444
+ rb_thresh_hist_bang(VALUE self, VALUE threshold)
445
+ {
446
+ try {
447
+ cvThreshHist(CVHISTOGRAM(self), NUM2DBL(threshold));
448
+ }
449
+ catch (cv::Exception& e) {
450
+ raise_cverror(e);
451
+ }
452
+ return self;
453
+ }
454
+
455
+ /*
456
+ * Sets the bounds of the histogram bins.
457
+ * @overload set_hist_bin_ranges(ranges, uniform=true)
458
+ * @param ranges [Array<Number>]
459
+ * Array of ranges for the histogram bins. Its meaning depends on the uniform parameter value.
460
+ * The ranges are used when the histogram is calculated or backprojected to determine
461
+ * which histogram bin corresponds to which value/tuple of values from the input image(s).
462
+ * @param uniform [Boolean]
463
+ * Uniformity flag.
464
+ * @return [CvHistogram]
465
+ * Histogram
466
+ * @opencv_func cvSetHistBinRanges
467
+ */
468
+ VALUE
469
+ rb_set_hist_bin_ranges(int argc, VALUE* argv, VALUE self)
470
+ {
471
+ return rb_set_hist_bin_ranges_bang(argc, argv, rb_copy_hist(self));
472
+ }
473
+
474
+ /*
475
+ * Sets the bounds of the histogram bins. This method changes <tt>self</tt>.
476
+ * @overload set_hist_bin_ranges!(ranges, uniform=true)
477
+ * @param ranges [Array<Number>]
478
+ * Array of ranges for the histogram bins. Its meaning depends on the uniform parameter value.
479
+ * The ranges are used when the histogram is calculated or backprojected to determine
480
+ * which histogram bin corresponds to which value/tuple of values from the input image(s).
481
+ * @param uniform [Boolean]
482
+ * Uniformity flag.
483
+ * @return [CvHistogram]
484
+ * Histogram
485
+ * @see #set_hist_bin_ranges
486
+ * @opencv_func cvSetHistBinRanges
487
+ */
488
+ VALUE
489
+ rb_set_hist_bin_ranges_bang(int argc, VALUE* argv, VALUE self)
490
+ {
491
+ VALUE _ranges, _uniform;
492
+ rb_scan_args(argc, argv, "11", &_ranges, &_uniform);
493
+ Check_Type(_ranges, T_ARRAY);
494
+
495
+ int ranges_size = RARRAY_LEN(_ranges);
496
+ float** ranges = ALLOCA_N(float*, ranges_size);
497
+ VALUE* range_ptr = RARRAY_PTR(_ranges);
498
+ for (int i = 0; i < ranges_size; ++i) {
499
+ ranges[i] = ary2fltptr(range_ptr[i], ALLOCA_N(float, 2));
500
+ }
501
+ int uniform = TRUE_OR_FALSE(_uniform, 1);
502
+
503
+ try {
504
+ cvSetHistBinRanges(CVHISTOGRAM(self), ranges, uniform);
505
+ }
506
+ catch (cv::Exception& e) {
507
+ raise_cverror(e);
508
+ }
509
+
510
+ return self;
511
+ }
512
+
513
+ /*
514
+ * Calculates the back projection of a histogram.
515
+ * @overload calc_back_project(images)
516
+ * @param images [Array<IplImage>]
517
+ * Source arrays. They all should have the same depth, CV_8U or CV_32F, and the same size.
518
+ * Each of them can have an arbitrary number of channels.
519
+ * @return [CvMat,IplImage]
520
+ * Destination back projection array that is a single-channel array of the same size and depth
521
+ * as the first element of <tt>images</tt>
522
+ * @opencv_func cvCalcBackProject
523
+ */
524
+ VALUE
525
+ rb_calc_back_project(VALUE self, VALUE image)
526
+ {
527
+ Check_Type(image, T_ARRAY);
528
+ int num_images = RARRAY_LEN(image);
529
+ if (num_images == 0) {
530
+ return Qnil;
531
+ }
532
+
533
+ IplImage** img = ALLOCA_N(IplImage*, num_images);
534
+ VALUE* image_ptr = RARRAY_PTR(image);
535
+ for (int i = 0; i < num_images; ++i) {
536
+ img[i] = IPLIMAGE_WITH_CHECK(image_ptr[i]);
537
+ }
538
+
539
+ CvSize size;
540
+ size.width = img[0]->width;
541
+ size.height = img[0]->height;
542
+ VALUE back_project = cCvMat::new_mat_kind_object(size, image_ptr[0]);
543
+ try {
544
+ cvCalcBackProject(img, CVARR(back_project), CVHISTOGRAM(self));
545
+ }
546
+ catch (cv::Exception& e) {
547
+ raise_cverror(e);
548
+ }
549
+
550
+ return back_project;
551
+ }
552
+
553
+ /*
554
+ * Locates a template within an image by using a histogram comparison.
555
+ * @overload calc_back_project_patch(images, patch_size, method, factor)
556
+ * @param images [Array<IplImage>] Source arrays.
557
+ * @param pach_size [CvSize] Size of the patch slid though the source image.
558
+ * @param method [Integer]
559
+ * Comparison method that could be one of the following:
560
+ * - <tt>CV_COMP_CORREL</tt>: Correlation
561
+ * - <tt>CV_COMP_CHISQR</tt>: Chi-Square
562
+ * - <tt>CV_COMP_INTERSECT</tt>: Intersection
563
+ * - <tt>CV_COMP_BHATTACHARYYA</tt>: Bhattacharyya distance
564
+ * - <tt>CV_COMP_HELLINGER</tt>: Synonym for <tt>CV_COMP_BHATTACHARYYA</tt>
565
+ * @param factor [Number]
566
+ * Normalization factor for histograms that affects the normalization scale
567
+ * of the destination image. Pass 1 if not sure.
568
+ * @return [CvMat,IplImage] Destination image.
569
+ * @opencv_func cvCalcBackProject
570
+ */
571
+ VALUE
572
+ rb_calc_back_project_patch(VALUE self, VALUE image, VALUE patch_size, VALUE method, VALUE factor)
573
+ {
574
+ Check_Type(image, T_ARRAY);
575
+ int num_images = RARRAY_LEN(image);
576
+ if (num_images == 0) {
577
+ return Qnil;
578
+ }
579
+
580
+ IplImage** img = ALLOCA_N(IplImage*, num_images);
581
+ VALUE* image_ptr = RARRAY_PTR(image);
582
+ for (int i = 0; i < num_images; ++i) {
583
+ img[i] = IPLIMAGE_WITH_CHECK(image_ptr[i]);
584
+ }
585
+
586
+ CvSize patchsize = VALUE_TO_CVSIZE(patch_size);
587
+ CvSize dst_size;
588
+ dst_size.width = img[0]->width - patchsize.width + 1;
589
+ dst_size.height = img[0]->height - patchsize.height + 1;
590
+
591
+ VALUE dst = cCvMat::new_mat_kind_object(dst_size, image_ptr[0], CV_32F, 1);
592
+ try {
593
+ cvCalcBackProjectPatch(img, CVARR(dst), patchsize, CVHISTOGRAM(self),
594
+ NUM2INT(method), NUM2DBL(factor));
595
+ }
596
+ catch (cv::Exception& e) {
597
+ raise_cverror(e);
598
+ }
599
+
600
+ return dst;
601
+ }
602
+
603
+ /*
604
+ * Compares two histograms.
605
+ * @overload compare_hist(hist1, hist2, method)
606
+ * @param hist1 [CvHistogram] First compared histogram.
607
+ * @param hist2 [CvHistogram] Second compared histogram of the same size as <tt>hist1</tt>.
608
+ * @param method [Integer]
609
+ * Comparison method that could be one of the following:
610
+ * - <tt>CV_COMP_CORREL</tt>: Correlation
611
+ * - <tt>CV_COMP_CHISQR</tt>: Chi-Square
612
+ * - <tt>CV_COMP_INTERSECT</tt>: Intersection
613
+ * - <tt>CV_COMP_BHATTACHARYYA</tt>: Bhattacharyya distance
614
+ * - <tt>CV_COMP_HELLINGER</tt>: Synonym for <tt>CV_COMP_BHATTACHARYYA</tt>
615
+ * @return [Number] Distance of the two histograms.
616
+ * @scope class
617
+ * @opencv_func cvCompareHist
618
+ */
619
+ VALUE
620
+ rb_compare_hist(VALUE self, VALUE hist1, VALUE hist2, VALUE method)
621
+ {
622
+ double result = 0;
623
+ try {
624
+ result = cvCompareHist(CVHISTOGRAM_WITH_CHECK(hist1), CVHISTOGRAM_WITH_CHECK(hist2),
625
+ NUM2INT(method));
626
+ }
627
+ catch (cv::Exception& e) {
628
+ raise_cverror(e);
629
+ }
630
+
631
+ return rb_float_new(result);
632
+ }
633
+
634
+ /*
635
+ * Divides one histogram by another.
636
+ * @overload calc_prob_density(hist1, hist2, scale=255)
637
+ * @param hist1 [CvHistogram] First histogram (the divisor).
638
+ * @param hist2 [CvHistogram] Second histogram.
639
+ * @param scale [Number] Scale factor for the destination histogram.
640
+ * @return [CvHistogram] Destination histogram.
641
+ * @opencv_func cvCalcProbDensity
642
+ */
643
+ VALUE
644
+ rb_calc_prob_density(int argc, VALUE* argv, VALUE self)
645
+ {
646
+ VALUE hist1, hist2, scale;
647
+ rb_scan_args(argc, argv, "21", &hist1, &hist2, &scale);
648
+ double s = NIL_P(scale) ? 255 : NUM2DBL(scale);
649
+
650
+ CvHistogram* hist1_ptr = CVHISTOGRAM_WITH_CHECK(hist1);
651
+ VALUE dst_hist = rb_allocate(rb_klass);
652
+ try {
653
+ cvCopyHist(hist1_ptr, (CvHistogram**)&(DATA_PTR(dst_hist)));
654
+ cvCalcProbDensity(hist1_ptr, CVHISTOGRAM_WITH_CHECK(hist2), CVHISTOGRAM(dst_hist), s);
655
+ }
656
+ catch (cv::Exception& e) {
657
+ raise_cverror(e);
658
+ }
659
+
660
+ return dst_hist;
661
+ }
662
+
663
+ void
664
+ init_ruby_class()
665
+ {
666
+ #if 0
667
+ // For documentation using YARD
668
+ VALUE opencv = rb_define_module("OpenCV");
669
+ #endif
670
+
671
+ if (rb_klass)
672
+ return;
673
+
674
+ VALUE opencv = rb_module_opencv();
675
+ rb_klass = rb_define_class_under(opencv, "CvHistogram", rb_cObject);
676
+ rb_define_alloc_func(rb_klass, rb_allocate);
677
+ rb_define_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
678
+ rb_define_method(rb_klass, "is_uniform?", RUBY_METHOD_FUNC(rb_is_uniform), 0);
679
+ rb_define_method(rb_klass, "is_sparse?", RUBY_METHOD_FUNC(rb_is_sparse), 0);
680
+ rb_define_method(rb_klass, "has_range?", RUBY_METHOD_FUNC(rb_has_range), 0);
681
+ rb_define_method(rb_klass, "dims", RUBY_METHOD_FUNC(rb_dims), 0);
682
+ rb_define_method(rb_klass, "calc_hist", RUBY_METHOD_FUNC(rb_calc_hist), -1);
683
+ rb_define_method(rb_klass, "calc_hist!", RUBY_METHOD_FUNC(rb_calc_hist_bang), -1);
684
+ rb_define_method(rb_klass, "[]", RUBY_METHOD_FUNC(rb_aref), -2);
685
+ rb_define_alias(rb_klass, "query_hist_value", "[]");
686
+ rb_define_method(rb_klass, "min_max_value", RUBY_METHOD_FUNC(rb_min_max_value), 0);
687
+ rb_define_method(rb_klass, "copy_hist", RUBY_METHOD_FUNC(rb_copy_hist), 0);
688
+
689
+ rb_define_method(rb_klass, "clear_hist", RUBY_METHOD_FUNC(rb_clear_hist), 0);
690
+ rb_define_alias(rb_klass, "clear", "clear_hist");
691
+ rb_define_method(rb_klass, "clear_hist!", RUBY_METHOD_FUNC(rb_clear_hist_bang), 0);
692
+ rb_define_alias(rb_klass, "clear!", "clear_hist!");
693
+
694
+ rb_define_method(rb_klass, "normalize_hist", RUBY_METHOD_FUNC(rb_normalize_hist), 1);
695
+ rb_define_alias(rb_klass, "normalize", "normalize_hist");
696
+ rb_define_method(rb_klass, "normalize_hist!", RUBY_METHOD_FUNC(rb_normalize_hist_bang), 1);
697
+ rb_define_alias(rb_klass, "normalize!", "normalize_hist!");
698
+
699
+ rb_define_method(rb_klass, "thresh_hist", RUBY_METHOD_FUNC(rb_thresh_hist), 1);
700
+ rb_define_alias(rb_klass, "thresh", "thresh_hist");
701
+ rb_define_method(rb_klass, "thresh_hist!", RUBY_METHOD_FUNC(rb_thresh_hist_bang), 1);
702
+ rb_define_alias(rb_klass, "thresh!", "thresh_hist!");
703
+
704
+ rb_define_method(rb_klass, "set_hist_bin_ranges", RUBY_METHOD_FUNC(rb_set_hist_bin_ranges), -1);
705
+ rb_define_method(rb_klass, "set_hist_bin_ranges!", RUBY_METHOD_FUNC(rb_set_hist_bin_ranges_bang), -1);
706
+
707
+ rb_define_method(rb_klass, "calc_back_project", RUBY_METHOD_FUNC(rb_calc_back_project), 1);
708
+ rb_define_method(rb_klass, "calc_back_project_patch", RUBY_METHOD_FUNC(rb_calc_back_project_patch), 4);
709
+
710
+ rb_define_singleton_method(rb_klass, "calc_prob_density", RUBY_METHOD_FUNC(rb_calc_prob_density), -1);
711
+ rb_define_singleton_method(rb_klass, "compare_hist", RUBY_METHOD_FUNC(rb_compare_hist), 3);
712
+ }
713
+
714
+ __NAMESPACE_END_CVHISTOGRAM
715
+ __NAMESPACE_END_OPENCV