magickcam 0.1.0 → 0.1.1

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 (2) hide show
  1. data/lib/magickcam.rb +174 -1
  2. metadata +3 -5
data/lib/magickcam.rb CHANGED
@@ -2,8 +2,180 @@
2
2
 
3
3
  # file: magickcam.rb
4
4
 
5
- require 'rb_webcam'
5
+ #require 'rb_webcam'
6
6
  require 'RMagick'
7
+ require 'nice-ffi'
8
+
9
+ # wrapper module of OpenCV::Highgui
10
+ module Highgui
11
+ extend NiceFFI::Library
12
+
13
+ load_library("opencv_highgui")
14
+
15
+ class CvCapture < NiceFFI::OpaqueStruct
16
+ end
17
+
18
+ SIGNED_FLAG = 0x80000000
19
+ enum :color_depth, [ :unsinged_1bit, 1,
20
+ :unsigned_8bit, 8,
21
+ :unsigned_16bit, 16,
22
+ :unsinged_32bit, 32,
23
+ :signed_8bit, SIGNED_FLAG | 8,
24
+ :signed_16bit, SIGNED_FLAG | 16,
25
+ :signed_32bit, SIGNED_FLAG | 32 ]
26
+
27
+ # Grabbed webcam image will be stored in this structure.
28
+ # http://opencv.willowgarage.com/documentation/basic_structures.html#iplimage
29
+ class IplImage < NiceFFI::Struct
30
+ layout :n_size, :int,
31
+ :id, :int,
32
+ :n_channels, :int,
33
+ :alpha_channel, :int,
34
+ :depth, :color_depth,
35
+ :color_mode, [:char, 4], # pointer to char[4]
36
+ :channel_seq, [:char, 4], # pointer to char[4]
37
+ :data_order, :int,
38
+ :origin, :int,
39
+ :align, :int,
40
+ :width, :int,
41
+ :height, :int,
42
+ :roi, :pointer, # pointer to struct _IplROI
43
+ :mask_roi, :pointer, # pointer to struct _IplImage
44
+ :image_id, :pointer, # pointer to void
45
+ :tile_info, :pointer, # pointer to struct _IplTileInfo
46
+ :image_size, :int,
47
+ :image_data, :pointer, # pointer to char array
48
+ :width_step, :int,
49
+ :border_mode, [:int, 4], # pointer to int[4]
50
+ :border_const, [:int, 4], # pointer to int[4]
51
+ :image_data_origin, :pointer # pointer to char array
52
+ end
53
+
54
+ enum :property, [ :position_msec, 0,
55
+ :position_frames,
56
+ :position_avi_ratio,
57
+ :width,
58
+ :height,
59
+ :fps,
60
+ :fourcc,
61
+ :frame_count,
62
+ :format,
63
+ :mode,
64
+ :brightness,
65
+ :contrast,
66
+ :saturation,
67
+ :hue,
68
+ :gain,
69
+ :exposure,
70
+ :convert_rgb,
71
+ :white_balance,
72
+ :rectification ]
73
+
74
+ attach_function :create_camera_capture, :cvCreateCameraCapture, [:int], :pointer
75
+ attach_function :release_capture, :cvReleaseCapture, [:pointer], :void
76
+ attach_function :query, :cvQueryFrame, [:pointer], IplImage.typed_pointer
77
+ attach_function :get_property, :cvGetCaptureProperty, [:pointer, :property], :double
78
+ attach_function :set_property, :cvSetCaptureProperty, [:pointer, :property, :double], :int
79
+ attach_function :save_image, :cvSaveImage, [:string, IplImage], :int
80
+ end
81
+
82
+ # Class to controll your webcam.
83
+ # Initialize camera, grab image, then close.
84
+ class Webcam
85
+ # Open camera with 'method with block' sentence.
86
+ # This will open then close at start and end of block.
87
+ # ex.
88
+ # Webcam.open { |camera| @image = camera.grab }
89
+ def self.open(camera_id=0)
90
+ webcam = Webcam.new(camera_id)
91
+ yield webcam
92
+ webcam.close
93
+ end
94
+
95
+ # Open camera with camera_id, and size.
96
+ # camera_id: '0' to autodetect.
97
+ def initialize(camera_id=0)
98
+ @capture_handler = Highgui.create_camera_capture(camera_id)
99
+ end
100
+
101
+ # Grab a frame from camera and returns IplImage struct.
102
+ # This needs camera still opened.
103
+ def grab
104
+ raise "Camera has'nt be initialized" if @capture_handler.nil?
105
+ image = Highgui.query(@capture_handler)
106
+ return Image.new(image)
107
+ end
108
+
109
+ # Close camera. You need close opened camera for cleaner behavior.
110
+ def close
111
+ Highgui.release_capture(FFI::MemoryPointer.new(:pointer).write_pointer(@capture_handler))
112
+ @capture_handler = nil
113
+ end
114
+
115
+ # Set resolution of camera output.
116
+ # [usage] @webcam.resolution_mode = {width: 160, height: 120}
117
+ # Available resolution_mode is depends on your camera.
118
+ def resolution_mode=(resolution)
119
+ Highgui.set_property(@capture_handler, :width, resolution[:width])
120
+ Highgui.set_property(@capture_handler, :height, resolution[:height])
121
+ end
122
+
123
+ # Get resolution mode of camera.
124
+ # return format is written in resolution_mode=(resolution)
125
+ def resolution_mode
126
+ {width: Highgui.get_property(@capture_handler, :width),
127
+ height: Highgui.get_property(@capture_handler, :height)}
128
+ end
129
+
130
+ # Getter for debug use.
131
+ # Internally used to call OpenCV C functions for specified camera.
132
+ attr_reader :capture_handler
133
+
134
+ # Property Container of image from webcam.
135
+ # Get size, color_depth, mode, etc.. of image.
136
+ # Each instance have IplImage struct data.
137
+ # TODO: Having pointer to IplImage struct will be good for performance?
138
+ # (Does whole structure copying occur at Image.new(iplimage) ?)
139
+ class Image
140
+ def initialize(iplimage_struct)
141
+ @iplimage_struct = iplimage_struct
142
+ end
143
+
144
+ # get size of image. Hash with :width, :height elements.
145
+ def size
146
+ {width: @iplimage_struct.width, height: @iplimage_struct.height}
147
+ end
148
+
149
+ # get color depth of image.
150
+ def color_depth
151
+ @iplimage_struct.depth
152
+ end
153
+
154
+ # String of image data
155
+ def data
156
+ self.data_pointer.read_string(self.data_size)
157
+ end
158
+
159
+ # FFI::Pointer to image data
160
+ def data_pointer
161
+ @iplimage_struct.image_data
162
+ end
163
+
164
+ # data size of image
165
+ def data_size
166
+ @iplimage_struct.image_size
167
+ end
168
+
169
+ # save the image to "name" incl. extension
170
+ def save(name)
171
+ Highgui.save_image name, @iplimage_struct
172
+ end
173
+
174
+ # IplImage structure stored grabbed image from camera.
175
+ attr_reader :iplimage_struct
176
+ end
177
+ end
178
+
7
179
 
8
180
  class MagickCam
9
181
 
@@ -21,6 +193,7 @@ class MagickCam
21
193
  img.store_pixels(0, i, width, 1, q)
22
194
  end
23
195
  img.format = 'jpg'
196
+ puts 'saving ' + filename
24
197
  img.write filename
25
198
  end
26
199
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: magickcam
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.0
5
+ version: 0.1.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - James Robertson
@@ -10,8 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-12-15 00:00:00 +00:00
14
- default_executable:
13
+ date: 2012-12-01 00:00:00 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: rmagick
@@ -34,7 +33,6 @@ extra_rdoc_files: []
34
33
 
35
34
  files:
36
35
  - lib/magickcam.rb
37
- has_rdoc: true
38
36
  homepage:
39
37
  licenses: []
40
38
 
@@ -58,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
56
  requirements: []
59
57
 
60
58
  rubyforge_project:
61
- rubygems_version: 1.5.2
59
+ rubygems_version: 1.8.23
62
60
  signing_key:
63
61
  specification_version: 3
64
62
  summary: magickcam = rb_webcam + rmagick