opencv 0.0.6
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.
- data/History.txt +5 -0
- data/License.txt +30 -0
- data/Manifest.txt +115 -0
- data/README.txt +47 -0
- data/Rakefile +34 -0
- data/examples/convexhull.rb +41 -0
- data/examples/face_detect.rb +25 -0
- data/examples/houghcircle.rb +23 -0
- data/examples/inpaint.png +0 -0
- data/examples/inpaint.rb +43 -0
- data/examples/paint.rb +72 -0
- data/examples/snake.rb +43 -0
- data/examples/stuff.jpg +0 -0
- data/ext/curve.cpp +103 -0
- data/ext/curve.h +34 -0
- data/ext/cvavgcomp.cpp +67 -0
- data/ext/cvavgcomp.h +39 -0
- data/ext/cvbox2d.cpp +114 -0
- data/ext/cvbox2d.h +53 -0
- data/ext/cvcapture.cpp +276 -0
- data/ext/cvcapture.h +54 -0
- data/ext/cvchain.cpp +184 -0
- data/ext/cvchain.h +43 -0
- data/ext/cvchaincode.cpp +49 -0
- data/ext/cvchaincode.h +43 -0
- data/ext/cvcircle32f.cpp +90 -0
- data/ext/cvcircle32f.h +53 -0
- data/ext/cvcondensation.cpp +230 -0
- data/ext/cvcondensation.h +49 -0
- data/ext/cvconnectedcomp.cpp +115 -0
- data/ext/cvconnectedcomp.h +46 -0
- data/ext/cvcontour.cpp +219 -0
- data/ext/cvcontour.h +47 -0
- data/ext/cvcontourtree.cpp +86 -0
- data/ext/cvcontourtree.h +41 -0
- data/ext/cvconvexitydefect.cpp +103 -0
- data/ext/cvconvexitydefect.h +42 -0
- data/ext/cverror.cpp +140 -0
- data/ext/cverror.h +79 -0
- data/ext/cvfont.cpp +173 -0
- data/ext/cvfont.h +56 -0
- data/ext/cvhaarclassifiercascade.cpp +159 -0
- data/ext/cvhaarclassifiercascade.h +41 -0
- data/ext/cvhistogram.cpp +200 -0
- data/ext/cvhistogram.h +51 -0
- data/ext/cvindex.cpp +73 -0
- data/ext/cvindex.h +40 -0
- data/ext/cvline.cpp +106 -0
- data/ext/cvline.h +52 -0
- data/ext/cvmat.cpp +4809 -0
- data/ext/cvmat.h +286 -0
- data/ext/cvmatnd.cpp +44 -0
- data/ext/cvmatnd.h +28 -0
- data/ext/cvmemstorage.cpp +64 -0
- data/ext/cvmemstorage.h +53 -0
- data/ext/cvmoments.cpp +204 -0
- data/ext/cvmoments.h +48 -0
- data/ext/cvpoint.cpp +229 -0
- data/ext/cvpoint.h +59 -0
- data/ext/cvpoint2d32f.cpp +213 -0
- data/ext/cvpoint2d32f.h +61 -0
- data/ext/cvpoint3d32f.cpp +245 -0
- data/ext/cvpoint3d32f.h +64 -0
- data/ext/cvrect.cpp +340 -0
- data/ext/cvrect.h +79 -0
- data/ext/cvscalar.cpp +227 -0
- data/ext/cvscalar.h +63 -0
- data/ext/cvseq.cpp +583 -0
- data/ext/cvseq.h +71 -0
- data/ext/cvset.cpp +63 -0
- data/ext/cvset.h +39 -0
- data/ext/cvsize.cpp +223 -0
- data/ext/cvsize.h +63 -0
- data/ext/cvsize2d32f.cpp +180 -0
- data/ext/cvsize2d32f.h +59 -0
- data/ext/cvslice.cpp +82 -0
- data/ext/cvslice.h +53 -0
- data/ext/cvsparsemat.cpp +44 -0
- data/ext/cvsparsemat.h +28 -0
- data/ext/cvtermcriteria.cpp +183 -0
- data/ext/cvtermcriteria.h +71 -0
- data/ext/cvtwopoints.cpp +98 -0
- data/ext/cvtwopoints.h +50 -0
- data/ext/cvvector.cpp +206 -0
- data/ext/cvvector.h +54 -0
- data/ext/cvvideowriter.cpp +116 -0
- data/ext/cvvideowriter.h +41 -0
- data/ext/extconf.rb +61 -0
- data/ext/gui.cpp +65 -0
- data/ext/gui.h +33 -0
- data/ext/iplconvkernel.cpp +177 -0
- data/ext/iplconvkernel.h +52 -0
- data/ext/iplimage.cpp +238 -0
- data/ext/iplimage.h +54 -0
- data/ext/mouseevent.cpp +184 -0
- data/ext/mouseevent.h +59 -0
- data/ext/opencv.cpp +481 -0
- data/ext/opencv.h +356 -0
- data/ext/point3dset.cpp +41 -0
- data/ext/point3dset.h +31 -0
- data/ext/pointset.cpp +238 -0
- data/ext/pointset.h +69 -0
- data/ext/trackbar.cpp +122 -0
- data/ext/trackbar.h +65 -0
- data/ext/window.cpp +368 -0
- data/ext/window.h +56 -0
- data/images/CvMat_sobel.png +0 -0
- data/images/CvMat_sub_rect.png +0 -0
- data/images/CvSeq_relationmap.png +0 -0
- data/images/face_detect_from_lena.jpg +0 -0
- data/lib/opencv.rb +3 -0
- data/lib/version.rb +3 -0
- data/setup/setup.cygwin.rb +120 -0
- data/setup/setup.mingw.rb +99 -0
- data/setup/setup.mswin32.rb +103 -0
- data/test/test_opencv.rb +4 -0
- metadata +191 -0
data/ext/pointset.h
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
/************************************************************
|
2
|
+
|
3
|
+
pointset.h -
|
4
|
+
|
5
|
+
$Author: lsxi $
|
6
|
+
|
7
|
+
Copyright (C) 2005-2006 Masakazu Yonekura
|
8
|
+
|
9
|
+
************************************************************/
|
10
|
+
#ifndef RUBY_OPENCV_POINTSET_H
|
11
|
+
#define RUBY_OPENCV_POINTSET_H
|
12
|
+
|
13
|
+
#define __NAMESPACE_BEGIN_POINT_SET namespace mPointSet{
|
14
|
+
#define __NAMESPACE_END_POINT_SET }
|
15
|
+
|
16
|
+
#include"opencv.h"
|
17
|
+
|
18
|
+
__NAMESPACE_BEGIN_OPENCV
|
19
|
+
__NAMESPACE_BEGIN_POINT_SET
|
20
|
+
|
21
|
+
VALUE rb_module();
|
22
|
+
|
23
|
+
void define_ruby_module();
|
24
|
+
VALUE rb_contour_area(int argc, VALUE *argv, VALUE self);
|
25
|
+
VALUE rb_fit_ellipse(VALUE self);
|
26
|
+
VALUE rb_fit_line(int argc, VALUE *argv, VALUE self);
|
27
|
+
VALUE rb_convex_hull(int argc, VALUE *argv, VALUE self);
|
28
|
+
VALUE rb_check_contour_convexity(VALUE self);
|
29
|
+
VALUE rb_convexity_defects(int argc, VALUE *argv, VALUE self);
|
30
|
+
VALUE rb_min_area_rect(VALUE self);
|
31
|
+
VALUE rb_min_enclosing_circle(VALUE self);
|
32
|
+
VALUE rb_calc_pgh(VALUE self);
|
33
|
+
|
34
|
+
__NAMESPACE_END_POINT_SET
|
35
|
+
|
36
|
+
#define POINT_SET_P(object) rb_obj_is_kind_of(object, cCvSeq::rb_class()) && CV_IS_SEQ_POINT_SET(CVSEQ(object))
|
37
|
+
|
38
|
+
/*
|
39
|
+
inline CvPoint*
|
40
|
+
POINTSET(VALUE object)
|
41
|
+
{
|
42
|
+
CvPoint *pointset = (CvPoint*)cvAlloc(CVSEQ(object)->total * sizeof(CvPoint));
|
43
|
+
cvCvtSeqToArray(CVSEQ(object), pointset, CV_WHOLE_SEQ);
|
44
|
+
if (cCvSeq::seqblock_class(CVSEQ(object)) == cCvPoint2D32f::rb_class()) {
|
45
|
+
for(int i =0; i < CVSEQ(object)->total; i++)
|
46
|
+
pointset[i] = cvPointFrom32f(((CvPoint2D32f*)pointset)[i]);
|
47
|
+
}
|
48
|
+
return pointset;
|
49
|
+
}
|
50
|
+
|
51
|
+
inline CvPoint2D32f*
|
52
|
+
POINTSET2D32f(VALUE object)
|
53
|
+
{
|
54
|
+
CvPoint2D32f *pointset = (CvPoint2D32f*)cvAlloc(CVSEQ(object)->total * sizeof(CvPoint2D32f));
|
55
|
+
cvCvtSeqToArray(CVSEQ(object), pointset, CV_WHOLE_SEQ);
|
56
|
+
if (cCvSeq::seqblock_class(CVSEQ(object)) == cCvPoint::rb_class()) {
|
57
|
+
for(int i = 0; i < CVSEQ(object)->total; i++)
|
58
|
+
pointset[i] = cvPointTo32f(((CvPoint*)pointset)[i]);
|
59
|
+
}
|
60
|
+
return pointset;
|
61
|
+
}
|
62
|
+
*/
|
63
|
+
|
64
|
+
int CVPOINTS_FROM_POINT_SET(VALUE object, CvPoint **pointset);
|
65
|
+
CvSeq* VALUE_TO_POINT_SET(VALUE object);
|
66
|
+
|
67
|
+
__NAMESPACE_END_OPENCV
|
68
|
+
|
69
|
+
#endif // RUBY_OPENCV_POINTSET_H
|
data/ext/trackbar.cpp
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
/************************************************************
|
2
|
+
|
3
|
+
trackbar.cpp -
|
4
|
+
|
5
|
+
$Author: lsxi $
|
6
|
+
|
7
|
+
Copyright (C) 2005 Masakazu Yonekura
|
8
|
+
|
9
|
+
************************************************************/
|
10
|
+
#ifdef HAVE_CALLBACK_H
|
11
|
+
|
12
|
+
#include"trackbar.h"
|
13
|
+
/*
|
14
|
+
* Document-class: OpenCV::GUI::Trackbar
|
15
|
+
*
|
16
|
+
* Simple Trackbar wedget. OpenCV::GUI::Window can treat trackbar.
|
17
|
+
* Trackbar can treat only positive-integer value.
|
18
|
+
*/
|
19
|
+
|
20
|
+
__NAMESPACE_BEGIN_OPENCV
|
21
|
+
__NAMESPACE_BEGIN_GUI
|
22
|
+
__NAMESPACE_BEGIN_TRACKBAR
|
23
|
+
|
24
|
+
VALUE rb_klass;
|
25
|
+
|
26
|
+
VALUE rb_class(){
|
27
|
+
return rb_klass;
|
28
|
+
}
|
29
|
+
|
30
|
+
void define_ruby_class(){
|
31
|
+
if(rb_klass)
|
32
|
+
return;
|
33
|
+
/*
|
34
|
+
* opencv = rb_define_module("OpenCV");
|
35
|
+
* GUI = rb_define_module_under(opencv, "GUI");
|
36
|
+
*
|
37
|
+
* note: this comment is used by rdoc.
|
38
|
+
*/
|
39
|
+
VALUE GUI = rb_module_GUI();
|
40
|
+
rb_klass = rb_define_class_under(GUI, "Trackbar", rb_cObject);
|
41
|
+
rb_define_alloc_func(rb_klass, rb_allocate);
|
42
|
+
rb_define_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
|
43
|
+
rb_define_method(rb_klass, "name", RUBY_METHOD_FUNC(rb_name), 0);
|
44
|
+
rb_define_method(rb_klass, "max", RUBY_METHOD_FUNC(rb_max), 0);
|
45
|
+
rb_define_method(rb_klass, "value", RUBY_METHOD_FUNC(rb_value), 0);
|
46
|
+
rb_define_method(rb_klass, "value=", RUBY_METHOD_FUNC(rb_set_value), 1);
|
47
|
+
}
|
48
|
+
|
49
|
+
VALUE rb_allocate(VALUE klass){
|
50
|
+
Trackbar *ptr;
|
51
|
+
return Data_Make_Struct(klass, Trackbar, mark, free, ptr);
|
52
|
+
}
|
53
|
+
|
54
|
+
void mark(void *ptr){
|
55
|
+
rb_gc_mark(((Trackbar*)ptr)->block);
|
56
|
+
}
|
57
|
+
|
58
|
+
void free(void *ptr){
|
59
|
+
//::free(((Trackbar*)ptr)->name);
|
60
|
+
::free(ptr);
|
61
|
+
}
|
62
|
+
|
63
|
+
/*
|
64
|
+
* call-seq:
|
65
|
+
* new(<i>name,maxval[,val],&block</i>)
|
66
|
+
* new(<i>name,maxval[,val]</i>){|value| ... }
|
67
|
+
*
|
68
|
+
* Create new Trackbar.
|
69
|
+
* <i>name</i> should be String.
|
70
|
+
* <i>maxval</i> and <i>val</i> should be Fixnum.
|
71
|
+
* When Trackbar adjuster changed, block will be called.
|
72
|
+
*/
|
73
|
+
VALUE rb_initialize(int argc, VALUE *argv, VALUE self){
|
74
|
+
VALUE name, maxval, val, block;
|
75
|
+
rb_scan_args(argc, argv, "21&", &name, &maxval, &val, &block);
|
76
|
+
if(NIL_P(block)){rb_raise(rb_eArgError, "block not given.");}
|
77
|
+
Check_Type(name, T_STRING);
|
78
|
+
Trackbar *trackbar = TRACKBAR(self);
|
79
|
+
trackbar->name = strcpy(ALLOC_N(char, RSTRING(name)->len), StringValueCStr(name));
|
80
|
+
trackbar->maxval = NUM2INT(maxval);
|
81
|
+
trackbar->val = IF_INT(val, 0);
|
82
|
+
trackbar->block = block;
|
83
|
+
return self;
|
84
|
+
}
|
85
|
+
|
86
|
+
/*
|
87
|
+
* Return trackbar name.
|
88
|
+
*/
|
89
|
+
VALUE rb_name(VALUE self){
|
90
|
+
return rb_str_new2(TRACKBAR(self)->name);
|
91
|
+
}
|
92
|
+
|
93
|
+
/*
|
94
|
+
* Return the maximum value that can be taken this trackbar.
|
95
|
+
*/
|
96
|
+
VALUE rb_max(VALUE self){
|
97
|
+
return INT2FIX(TRACKBAR(self)->maxval);
|
98
|
+
}
|
99
|
+
|
100
|
+
/*
|
101
|
+
* Return the value of this trackbar.
|
102
|
+
*/
|
103
|
+
VALUE rb_value(VALUE self){
|
104
|
+
return INT2FIX(TRACKBAR(self)->val);
|
105
|
+
}
|
106
|
+
|
107
|
+
/*
|
108
|
+
* call-seq:
|
109
|
+
* value = <i>val</i>
|
110
|
+
*
|
111
|
+
* Set trackbar value.
|
112
|
+
*/
|
113
|
+
VALUE rb_set_value(VALUE self, VALUE val){
|
114
|
+
TRACKBAR(self)->val = NUM2INT(val);
|
115
|
+
return self;
|
116
|
+
}
|
117
|
+
|
118
|
+
__NAMESPACE_END_TRACKBAR
|
119
|
+
__NAMESPACE_END_GUI
|
120
|
+
__NAMESPACE_END_OPENCV
|
121
|
+
|
122
|
+
#endif // HAVE_CALLBACK_H
|
data/ext/trackbar.h
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
/************************************************************
|
2
|
+
|
3
|
+
trackbar.h -
|
4
|
+
|
5
|
+
$Author: lsxi $
|
6
|
+
|
7
|
+
Copyright (C) 2005 Masakazu Yonekura
|
8
|
+
|
9
|
+
************************************************************/
|
10
|
+
#ifdef HAVE_CALLBACK_H
|
11
|
+
|
12
|
+
#ifndef RUBY_OPENCV_GUI_H
|
13
|
+
#include "gui.h"
|
14
|
+
#endif
|
15
|
+
|
16
|
+
#ifndef RUBY_OPENCV_GUI_TRACKBAR_H
|
17
|
+
#define RUBY_OPENCV_GUI_TRACKBAR_H
|
18
|
+
|
19
|
+
#include"opencv.h"
|
20
|
+
|
21
|
+
#define __NAMESPACE_BEGIN_TRACKBAR namespace cTrackbar{
|
22
|
+
#define __NAMESPACE_END_TRACKBAR }
|
23
|
+
|
24
|
+
__NAMESPACE_BEGIN_OPENCV
|
25
|
+
__NAMESPACE_BEGIN_GUI
|
26
|
+
|
27
|
+
typedef struct Trackbar{
|
28
|
+
char *name;
|
29
|
+
int maxval;
|
30
|
+
int val;
|
31
|
+
VALUE block;
|
32
|
+
}Trackbar;
|
33
|
+
|
34
|
+
__NAMESPACE_BEGIN_TRACKBAR
|
35
|
+
|
36
|
+
VALUE rb_class();
|
37
|
+
|
38
|
+
void define_ruby_class();
|
39
|
+
VALUE rb_allocate(VALUE klass);
|
40
|
+
|
41
|
+
void mark(void *ptr);
|
42
|
+
void free(void *ptr);
|
43
|
+
|
44
|
+
VALUE rb_initialize(int argc, VALUE *argv, VALUE self);
|
45
|
+
VALUE rb_name(VALUE self);
|
46
|
+
VALUE rb_max(VALUE self);
|
47
|
+
VALUE rb_value(VALUE self);
|
48
|
+
VALUE rb_set_value(VALUE self, VALUE val);
|
49
|
+
|
50
|
+
__NAMESPACE_END_TRACKBAR
|
51
|
+
|
52
|
+
|
53
|
+
inline Trackbar *TRACKBAR(VALUE object){
|
54
|
+
Trackbar *ptr;
|
55
|
+
Data_Get_Struct(object, Trackbar, ptr);
|
56
|
+
return ptr;
|
57
|
+
}
|
58
|
+
|
59
|
+
__NAMESPACE_END_GUI
|
60
|
+
|
61
|
+
__NAMESPACE_END_OPENCV
|
62
|
+
|
63
|
+
#endif // RUBY_OPENCV_GUI_TRACKBAR_H
|
64
|
+
|
65
|
+
#endif // HAVE_CALLBACK_H
|
data/ext/window.cpp
ADDED
@@ -0,0 +1,368 @@
|
|
1
|
+
/************************************************************
|
2
|
+
|
3
|
+
window.cpp -
|
4
|
+
|
5
|
+
$Author: lsxi $
|
6
|
+
|
7
|
+
Copyright (C) 2005-2006 Masakazu Yonekura
|
8
|
+
|
9
|
+
************************************************************/
|
10
|
+
#ifdef HAVE_CALLBACK_H
|
11
|
+
|
12
|
+
#include "window.h"
|
13
|
+
/*
|
14
|
+
* Document-class: OpenCV::GUI::Window
|
15
|
+
*
|
16
|
+
* Simple Window wedget. Window can show image(CvMat/IplImage).
|
17
|
+
*
|
18
|
+
* view image sample:
|
19
|
+
* image = OpenCV::IplImage::load("opencv.bmp") #=> load image
|
20
|
+
* window = OpenCV::GUI::Window.new("simple viewer")#=> create new window named "simaple viewer"
|
21
|
+
* window.show(image) #=> show image
|
22
|
+
*/
|
23
|
+
__NAMESPACE_BEGIN_OPENCV
|
24
|
+
__NAMESPACE_BEGIN_GUI
|
25
|
+
__NAMESPACE_BEGIN_WINDOW
|
26
|
+
|
27
|
+
const char*
|
28
|
+
GET_WINDOW_NAME(VALUE object)
|
29
|
+
{
|
30
|
+
void *handle = DATA_PTR(object);
|
31
|
+
if (!handle)
|
32
|
+
rb_raise(rb_eStandardError, "window handle error");
|
33
|
+
const char *window_name = cvGetWindowName(handle);
|
34
|
+
return window_name;
|
35
|
+
}
|
36
|
+
|
37
|
+
st_table *windows = st_init_numtable();
|
38
|
+
|
39
|
+
VALUE rb_klass;
|
40
|
+
|
41
|
+
VALUE
|
42
|
+
rb_class()
|
43
|
+
{
|
44
|
+
return rb_klass;
|
45
|
+
}
|
46
|
+
|
47
|
+
void
|
48
|
+
define_ruby_class()
|
49
|
+
{
|
50
|
+
if (rb_klass)
|
51
|
+
return;
|
52
|
+
/*
|
53
|
+
* opencv = rb_define_module("OpenCV");
|
54
|
+
* GUI = rb_define_module_under(opencv, "GUI");
|
55
|
+
*
|
56
|
+
* note: this comment is used by rdoc.
|
57
|
+
*/
|
58
|
+
VALUE GUI = rb_module_GUI();
|
59
|
+
rb_klass = rb_define_class_under(GUI, "Window", rb_cObject);
|
60
|
+
rb_define_singleton_method(rb_klass, "[]", RUBY_METHOD_FUNC(rb_aref), 1);
|
61
|
+
rb_define_method(rb_klass, "initialize", RUBY_METHOD_FUNC(rb_initialize), -1);
|
62
|
+
rb_define_method(rb_klass, "alive?", RUBY_METHOD_FUNC(rb_alive_q), 0);
|
63
|
+
rb_define_method(rb_klass, "destroy", RUBY_METHOD_FUNC(rb_destroy), 0);
|
64
|
+
rb_define_singleton_method(rb_klass, "destroy_all", RUBY_METHOD_FUNC(rb_destroy_all), 0);
|
65
|
+
rb_define_method(rb_klass, "resize", RUBY_METHOD_FUNC(rb_resize), -1);
|
66
|
+
rb_define_method(rb_klass, "move", RUBY_METHOD_FUNC(rb_move), -1);
|
67
|
+
rb_define_method(rb_klass, "show_image", RUBY_METHOD_FUNC(rb_show_image), 1);
|
68
|
+
rb_define_alias(rb_klass, "show", "show_image");
|
69
|
+
rb_define_method(rb_klass, "set_trackbar", RUBY_METHOD_FUNC(rb_set_trackbar), -1);
|
70
|
+
rb_define_method(rb_klass, "set_mouse_callback", RUBY_METHOD_FUNC(rb_set_mouse_callback), 0);
|
71
|
+
rb_define_alias(rb_klass, "on_mouse", "set_mouse_callback");
|
72
|
+
}
|
73
|
+
|
74
|
+
VALUE
|
75
|
+
rb_allocate(VALUE klass)
|
76
|
+
{
|
77
|
+
return Data_Wrap_Struct(klass, mark, free, 0);
|
78
|
+
}
|
79
|
+
|
80
|
+
void
|
81
|
+
mark(void *ptr)
|
82
|
+
{
|
83
|
+
st_table *holder;
|
84
|
+
if (st_lookup(windows, (st_data_t)ptr, (st_data_t*)&holder)) {
|
85
|
+
st_foreach(holder, (int (*)(ANYARGS))each_protect, 0);
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
VALUE
|
90
|
+
each_protect(VALUE key, VALUE value)
|
91
|
+
{
|
92
|
+
rb_gc_mark(value);
|
93
|
+
return ST_CONTINUE;
|
94
|
+
}
|
95
|
+
|
96
|
+
void
|
97
|
+
free(void *ptr)
|
98
|
+
{
|
99
|
+
cvFree(&ptr);
|
100
|
+
}
|
101
|
+
|
102
|
+
/*
|
103
|
+
* call-seq:
|
104
|
+
* [<i>name</i>]
|
105
|
+
*
|
106
|
+
* Return window named <i>name</i> if exist, otherwise nil.
|
107
|
+
*/
|
108
|
+
VALUE
|
109
|
+
rb_aref(VALUE klass, VALUE name)
|
110
|
+
{
|
111
|
+
VALUE window;
|
112
|
+
Check_Type(name, T_STRING);
|
113
|
+
void *handle = cvGetWindowHandle(StringValueCStr(name));
|
114
|
+
st_table *holder;
|
115
|
+
if (st_lookup(windows, (st_data_t)handle, (st_data_t*)&holder) &&
|
116
|
+
st_lookup(holder, 0, (st_data_t*)&window)) {
|
117
|
+
return window;
|
118
|
+
}
|
119
|
+
return Qnil;
|
120
|
+
}
|
121
|
+
|
122
|
+
/*
|
123
|
+
* call-seq:
|
124
|
+
* new(<i>name[,autosize]</i>)
|
125
|
+
*
|
126
|
+
* Create new window named <i>name</i>.
|
127
|
+
* If <i>autoresize</i> is true(default), window size automatically resize when image given.
|
128
|
+
*/
|
129
|
+
VALUE
|
130
|
+
rb_initialize(int argc, VALUE *argv, VALUE self)
|
131
|
+
{
|
132
|
+
VALUE name, autosize;
|
133
|
+
rb_scan_args(argc, argv, "11", &name, &autosize);
|
134
|
+
Check_Type(name, T_STRING);
|
135
|
+
int mode;
|
136
|
+
if (argc < 2)
|
137
|
+
mode = CV_WINDOW_AUTOSIZE;
|
138
|
+
else{
|
139
|
+
switch (TYPE(autosize)) {
|
140
|
+
case T_TRUE:
|
141
|
+
mode = CV_WINDOW_AUTOSIZE;
|
142
|
+
break;
|
143
|
+
case T_FALSE:
|
144
|
+
mode = 0;
|
145
|
+
break;
|
146
|
+
default:
|
147
|
+
rb_raise(rb_eTypeError, "argument 2 (auto-size) should be true or false.");
|
148
|
+
}
|
149
|
+
}
|
150
|
+
cvNamedWindow(StringValueCStr(name), mode);
|
151
|
+
void *handle = cvGetWindowHandle(StringValueCStr(name));
|
152
|
+
if (st_lookup(windows, (st_data_t)handle, 0)) {
|
153
|
+
rb_raise(rb_eStandardError, "window name should be unique.");
|
154
|
+
}
|
155
|
+
DATA_PTR(self) = handle;
|
156
|
+
st_table *holder = st_init_numtable();
|
157
|
+
st_insert(holder, (st_data_t)0, (st_data_t)self);
|
158
|
+
st_insert(windows, (st_data_t)handle, (st_data_t)holder);
|
159
|
+
return self;
|
160
|
+
}
|
161
|
+
|
162
|
+
/*
|
163
|
+
* Return alive status of window. Return true if alive, otherwise return false.
|
164
|
+
*/
|
165
|
+
VALUE
|
166
|
+
rb_alive_q(VALUE self)
|
167
|
+
{
|
168
|
+
if (st_lookup(windows, (st_data_t)DATA_PTR(self), 0)) {
|
169
|
+
return Qtrue;
|
170
|
+
}
|
171
|
+
return Qfalse;
|
172
|
+
}
|
173
|
+
|
174
|
+
/*
|
175
|
+
* Destroys a window. alive status of window be false.
|
176
|
+
*/
|
177
|
+
VALUE
|
178
|
+
rb_destroy(VALUE self)
|
179
|
+
{
|
180
|
+
void *handle = DATA_PTR(self);
|
181
|
+
st_table *holder;
|
182
|
+
if (st_delete(windows, (st_data_t*)&handle, (st_data_t*)&holder)) {
|
183
|
+
st_free_table(holder);
|
184
|
+
}
|
185
|
+
cvDestroyWindow(GET_WINDOW_NAME(self));
|
186
|
+
return self;
|
187
|
+
}
|
188
|
+
|
189
|
+
/*
|
190
|
+
* Destorys all the windows.
|
191
|
+
*/
|
192
|
+
VALUE
|
193
|
+
rb_destroy_all(VALUE klass)
|
194
|
+
{
|
195
|
+
st_free_table(windows);
|
196
|
+
windows = st_init_numtable();
|
197
|
+
cvDestroyAllWindows();
|
198
|
+
return Qnil;
|
199
|
+
}
|
200
|
+
|
201
|
+
/*
|
202
|
+
* call-seq:
|
203
|
+
* resize(<i>size</i>)
|
204
|
+
* resize(<i>width, height</i>)
|
205
|
+
*
|
206
|
+
* Set window size.
|
207
|
+
*/
|
208
|
+
VALUE
|
209
|
+
rb_resize(int argc, VALUE *argv, VALUE self)
|
210
|
+
{
|
211
|
+
CvSize size;
|
212
|
+
switch (argc) {
|
213
|
+
case 1:
|
214
|
+
size = VALUE_TO_CVSIZE(argv[0]);
|
215
|
+
break;
|
216
|
+
case 2:
|
217
|
+
size = cvSize(FIX2INT(argv[0]), FIX2INT(argv[1]));
|
218
|
+
break;
|
219
|
+
default:
|
220
|
+
rb_raise(rb_eArgError, "wrong number of arguments (1 or 2)");
|
221
|
+
}
|
222
|
+
cvResizeWindow(GET_WINDOW_NAME(self), size.width, size.height);
|
223
|
+
return self;
|
224
|
+
}
|
225
|
+
|
226
|
+
/*
|
227
|
+
* call-seq:
|
228
|
+
* move(<i>point</i>)
|
229
|
+
* move(<i>x, y</i>)
|
230
|
+
*
|
231
|
+
* Set window position.
|
232
|
+
*/
|
233
|
+
VALUE
|
234
|
+
rb_move(int argc, VALUE *argv, VALUE self)
|
235
|
+
{
|
236
|
+
CvPoint point;
|
237
|
+
switch (argc) {
|
238
|
+
case 1:
|
239
|
+
point = VALUE_TO_CVPOINT(argv[0]);
|
240
|
+
break;
|
241
|
+
case 2:
|
242
|
+
point = cvPoint(FIX2INT(argv[0]), FIX2INT(argv[1]));
|
243
|
+
break;
|
244
|
+
default:
|
245
|
+
rb_raise(rb_eArgError, "wrong number of arguments (1 or 2)");
|
246
|
+
}
|
247
|
+
cvMoveWindow(GET_WINDOW_NAME(self), point.x, point.y);
|
248
|
+
return self;
|
249
|
+
}
|
250
|
+
|
251
|
+
/*
|
252
|
+
* call-seq:
|
253
|
+
* show_image(<i>image</i>)
|
254
|
+
*
|
255
|
+
* Show the image. If the window was created with <i>autosize</i> = true then the image is shown
|
256
|
+
* with its original size, otherwize the image is scaled to fit the window.
|
257
|
+
*/
|
258
|
+
VALUE
|
259
|
+
rb_show_image(VALUE self, VALUE image)
|
260
|
+
{
|
261
|
+
if (!rb_obj_is_kind_of(image, cCvMat::rb_class())) {
|
262
|
+
rb_raise(rb_eTypeError, "argument should be %s.", rb_class2name(cCvMat::rb_class()));
|
263
|
+
}
|
264
|
+
cvShowImage(GET_WINDOW_NAME(self), CVARR(image));
|
265
|
+
st_table *holder;
|
266
|
+
if (st_lookup(windows, (st_data_t)DATA_PTR(self), (st_data_t*)&holder)) {
|
267
|
+
st_insert(holder, cCvMat::rb_class(), image);
|
268
|
+
return self;
|
269
|
+
}else
|
270
|
+
rb_raise(rb_eFatal, "invalid window operation.");
|
271
|
+
return self;
|
272
|
+
}
|
273
|
+
|
274
|
+
/*
|
275
|
+
* call-seq:
|
276
|
+
* set_trackbar(<i>trackbar</i>)
|
277
|
+
* set_trackbar(<i>name,maxval[,val],&block</i>)
|
278
|
+
* set_trackbar(<i>name,maxval[,val]</i>){|value| ... }
|
279
|
+
*
|
280
|
+
* Create Trackbar on this window. Return new Trackbar.
|
281
|
+
* see Trackbar.new
|
282
|
+
*/
|
283
|
+
VALUE
|
284
|
+
rb_set_trackbar(int argc, VALUE *argv, VALUE self)
|
285
|
+
{
|
286
|
+
VALUE instance;
|
287
|
+
if (argc == 1 && rb_obj_is_kind_of(argv[0], cTrackbar::rb_class())) {
|
288
|
+
instance = argv[0];
|
289
|
+
}else{
|
290
|
+
instance = cTrackbar::rb_initialize(argc, argv, cTrackbar::rb_allocate(cTrackbar::rb_class()));
|
291
|
+
}
|
292
|
+
Trackbar *trackbar = TRACKBAR(instance);
|
293
|
+
void *callback = (void *)alloc_callback(&trackbar_callback, trackbar->block);
|
294
|
+
cvCreateTrackbar(trackbar->name, GET_WINDOW_NAME(self), &trackbar->val, trackbar->maxval, (CvTrackbarCallback)callback);
|
295
|
+
st_table *holder;
|
296
|
+
if (st_lookup(windows, (st_data_t)DATA_PTR(self), (st_data_t*)&holder)) {
|
297
|
+
st_insert(holder, (st_data_t)&trackbar->name, (st_data_t)instance);
|
298
|
+
}
|
299
|
+
return instance;
|
300
|
+
}
|
301
|
+
|
302
|
+
/*
|
303
|
+
* call-seq:
|
304
|
+
* set_mouse_callback(&block)
|
305
|
+
* set_mouse_callback{|| ... }
|
306
|
+
*
|
307
|
+
* Set mouse callback.
|
308
|
+
* When the mouse is operated on the window, block will be called.
|
309
|
+
* Return Proc object.
|
310
|
+
* block given mouse event object, see GUI::Window::MouseEvent
|
311
|
+
*
|
312
|
+
* e.g. display mouse event on console.
|
313
|
+
* window = OpenCV::GUI::Window.new "sample window"
|
314
|
+
* image = OpenCV::IplImage::load "sample.png"
|
315
|
+
* window.show(image)
|
316
|
+
* window.set_mouse_callback{|mouse|
|
317
|
+
* e = "#{mouse.x}, #{mouse.y} : #{mouse.event} : "
|
318
|
+
* e << "<L>" if mouse.left_button?
|
319
|
+
* e << "<R>" if mouse.right_button?
|
320
|
+
* e << "<M>" if mouse.middle_button?
|
321
|
+
* e << "[CTRL]" if mouse.ctrl_key?
|
322
|
+
* e << "[SHIFT]" if mouse.shift_key?
|
323
|
+
* e << "[ALT]" if mouse.alt_key?
|
324
|
+
* puts e
|
325
|
+
* }
|
326
|
+
* OpenCV::GUI::wait_key
|
327
|
+
*/
|
328
|
+
VALUE
|
329
|
+
rb_set_mouse_callback(VALUE self)
|
330
|
+
{
|
331
|
+
VALUE block = rb_block_given_p() ? rb_block_proc() : 0;
|
332
|
+
if (!block) {rb_raise(rb_eArgError, "block not given.");}
|
333
|
+
void *callback = (void *)alloc_callback(&mouse_callback, block);
|
334
|
+
cvSetMouseCallback(GET_WINDOW_NAME(self), (CvMouseCallback)callback);
|
335
|
+
st_table *holder;
|
336
|
+
if (st_lookup(windows, (st_data_t)DATA_PTR(self), (st_data_t*)&holder)) {
|
337
|
+
st_insert(holder, rb_cProc, block);
|
338
|
+
}else{
|
339
|
+
rb_raise(rb_eStandardError, "window is destroied.");
|
340
|
+
}
|
341
|
+
return block;
|
342
|
+
}
|
343
|
+
|
344
|
+
void
|
345
|
+
trackbar_callback(VALUE block, va_alist ap)
|
346
|
+
{
|
347
|
+
va_start_void(ap);
|
348
|
+
rb_funcall(block, rb_intern("call"), 1, INT2FIX(va_arg_int(ap)));
|
349
|
+
va_return_void(ap);
|
350
|
+
}
|
351
|
+
|
352
|
+
void
|
353
|
+
mouse_callback(VALUE block, va_alist ap)
|
354
|
+
{
|
355
|
+
va_start_void(ap);
|
356
|
+
//VALUE ary = rb_ary_new2(4);
|
357
|
+
//for (int i = 0; i < 4; i++)
|
358
|
+
// rb_ary_store(ary, i, INT2FIX(va_arg_int(ap)));
|
359
|
+
//rb_apply(block, rb_intern("call"), ary);
|
360
|
+
rb_funcall(block, rb_intern("call"), 1, cMouseEvent::new_object(va_arg_int(ap),va_arg_int(ap),va_arg_int(ap),va_arg_int(ap)));
|
361
|
+
va_return_void(ap);
|
362
|
+
}
|
363
|
+
|
364
|
+
__NAMESPACE_END_WINDOW
|
365
|
+
__NAMESPACE_END_GUI
|
366
|
+
__NAMESPACE_END_OPENCV
|
367
|
+
|
368
|
+
#endif // HAVE_CALLBACK_H
|