opencv 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|