hwping 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c18dfab7c8e9e20c071cc51f6a36f6d0e2c21c04
4
- data.tar.gz: 08c791adf1bd917fc072b880c28b4d24d7d65ddf
3
+ metadata.gz: 32cbdfd706a94a81aecf8807cd2de61b4ade411c
4
+ data.tar.gz: 22eb2499eb61d123e2d1e5307cf2ca2d9d978e1a
5
5
  SHA512:
6
- metadata.gz: 1d0d79a4f4dfef09e164812079e186828d2e70f16f29a147e0a76991b83649e32b59eecee8cc8ba0122c5f93dae3401a3e67ac3866bf04b33f79abbb7110b9b1
7
- data.tar.gz: 6c8c25675325b49a02dd98be552241fbbdc060a633aeaf2f22c1b290690205b14aeae3777a11c5caf875e9536330f4a1349c072b003bd7e8a26f8da5ad4cca20
6
+ metadata.gz: 4dc074af5d06181bd539ef541cc940eb659f4505880d1278f449eaef4cc46e388df2e26c72d3ede91813acc8015ba0093a3fa4b148acf43ff5e91fa9639a9bbe
7
+ data.tar.gz: 5171b07619fc5debb1b11fbf087b63e02fa53c8de66ab768e3a06ad7853ef205efd438dcf75831f6663c9340c5b784940084186a668556808d9acb9b2edd59c4
@@ -0,0 +1,12 @@
1
+ require 'mkmf'
2
+ $CFLAGS = '--std=gnu++14 -O3'
3
+ $LDFLAGS = '-lopencv_core -lopencv_highgui -lopencv_stitching'
4
+
5
+ have_library('opencv_core')
6
+ have_library('opencv_highui')
7
+ have_library('opencv_stitching')
8
+
9
+ create_header
10
+ extension_name = 'webcam'
11
+ dir_config(extension_name)
12
+ create_makefile(extension_name)
@@ -0,0 +1,70 @@
1
+ #include "webcam.h"
2
+
3
+ using namespace cv;
4
+ VALUE mHWPing = Qnil;
5
+
6
+ void destroy_snapshot(void *ptr) {
7
+ ((Mat*) ptr)->release();
8
+ delete (Mat*) ptr;
9
+ }
10
+
11
+ void* stitch_without_gvl(void *data) {
12
+ cv::Stitcher stitcher = cv::Stitcher::createDefault();
13
+ VALUE snapshots = *((VALUE*)data);
14
+ std::vector<Mat> images;
15
+ Mat *image, panorama;
16
+
17
+ for (int i = 0; i < RARRAY_LEN(snapshots); i++) {
18
+ Data_Get_Struct(rb_ary_entry(snapshots, i), Mat, image);
19
+ images.push_back(*image);
20
+ }
21
+
22
+ stitcher.stitch(images, panorama);
23
+ images.clear();
24
+
25
+ image = new Mat(panorama.rows, panorama.cols, CV_8U, 3);
26
+ panorama.copyTo(*image);
27
+ return (void*) image;
28
+ }
29
+
30
+ static VALUE rb_create_snapshot(VALUE self) {
31
+ VideoCapture cap(0);
32
+ cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
33
+ cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720);
34
+ Mat frame, *image = new Mat(frame.rows, frame.cols, CV_8U, 3);
35
+
36
+ Scalar mean;
37
+ cap >> frame;
38
+ for (int i=0; i<3; i++) {
39
+ mean = cv::mean(frame);
40
+ if (mean[0] + mean[1] + mean[2] > 100) break;
41
+ frame.release();
42
+ cap >> frame;
43
+ }
44
+
45
+ frame.copyTo(*image);
46
+ frame.release();
47
+ cap.release();
48
+
49
+ return Data_Wrap_Struct(self, NULL, destroy_snapshot, image);
50
+ }
51
+
52
+ static VALUE rb_save_snapshot(VALUE self, VALUE file) {
53
+ Mat *image;
54
+ Data_Get_Struct(self, Mat, image);
55
+ return INT2NUM(imwrite(StringValuePtr(file), *image));
56
+ }
57
+
58
+ static VALUE rb_stitch_snapshots(VALUE self, VALUE snapshots) {
59
+ Mat *image = (Mat*) rb_thread_call_without_gvl(stitch_without_gvl, (void*) &snapshots, RUBY_UBF_IO, NULL);
60
+ return Data_Wrap_Struct(self, NULL, destroy_snapshot, image);
61
+ }
62
+
63
+ void Init_webcam(void) {
64
+ mHWPing = rb_define_module("HWPing");
65
+
66
+ VALUE webcam = rb_define_class_under(mHWPing, "Webcam", rb_cObject);
67
+ rb_define_alloc_func(webcam, rb_create_snapshot);
68
+ rb_define_method(webcam, "write", RUBY_METHOD_FUNC(rb_save_snapshot), 1);
69
+ rb_define_singleton_method(webcam, "stitch", RUBY_METHOD_FUNC(rb_stitch_snapshots), 1);
70
+ }
@@ -0,0 +1,17 @@
1
+ #ifndef __hwping_webcam_h__
2
+ #define __hwping_webcam_h__
3
+
4
+ #include <ruby.h>
5
+ #include <ruby/thread.h>
6
+ #include <opencv2/opencv.hpp>
7
+ #include <opencv2/stitching/stitcher.hpp>
8
+
9
+ extern VALUE mHWPing;
10
+
11
+ extern "C" void Init_webcam(void);
12
+
13
+ static VALUE rb_create_snapshot(VALUE self);
14
+ static VALUE rb_save_snapshot(VALUE self, VALUE file);
15
+ static VALUE rb_stitch_snapshots(VALUE self, VALUE snapshots);
16
+
17
+ #endif
data/lib/hwping.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'hwping/constants'
2
2
  require 'hwping/config'
3
3
  require 'hwping/launcher'
4
+ require 'hwping/webcam'
4
5
  require 'hwping/handler'
5
6
  require 'hwping/bot'
6
7
  require 'hwping/hwping'
data/lib/hwping/bot.rb CHANGED
@@ -4,6 +4,7 @@ module HWPing
4
4
  class Bot
5
5
  MESSAGES = {
6
6
  :unauthorized => "Sorry, you're unauthorized to use this bot!",
7
+ :image => 'Image saved at http://%s/%s',
7
8
  :firing => 'Firing rocket in 5 seconds!',
8
9
  :notarget => 'Unknown target!',
9
10
  :fire => 'Rocket launch initiated!',
data/lib/hwping/config.rb CHANGED
@@ -1,10 +1,11 @@
1
1
  module HWPing
2
2
  class Config
3
- attr_reader :server
4
- attr_reader :port
5
- attr_reader :nick
6
- attr_reader :channels
7
3
  attr_reader :auth
4
+ attr_reader :channels
5
+ attr_reader :nick
6
+ attr_reader :port
7
+ attr_reader :server
8
+ attr_reader :webcam
8
9
  attr_accessor :targets
9
10
 
10
11
  def initialize(hash = {})
@@ -14,6 +15,7 @@ module HWPing
14
15
  @channels = Array(hash.fetch('channels', ['hwping-test']))
15
16
  @auth = Array(hash.fetch('auth', []))
16
17
  @targets = hash.fetch('targets', {}).to_h
18
+ @webcam = hash.fetch('webcam', {}).to_h
17
19
  end
18
20
 
19
21
  def to_hash
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module HWPing
3
- VERSION = '0.2'.freeze
3
+ VERSION = '0.3'.freeze
4
4
  APP_NAME = 'hwping'.freeze
5
5
  REPO_URL = 'http://github.com/skateman/hwping'.freeze
6
6
  CONFIG_FILE = 'config.yml'.freeze
@@ -5,6 +5,7 @@ module HWPing
5
5
  @targets = config.targets
6
6
  @auth = config.auth
7
7
  @nick = config.nick
8
+ @webcam = config.webcam
8
9
  @launcher = launcher
9
10
  end
10
11
 
@@ -28,6 +29,10 @@ module HWPing
28
29
  def private(event)
29
30
  if authorized?(event.user.to_s)
30
31
  case event.message
32
+ when 'snap'
33
+ return [:image, ip_address(event), Webcam.new(@webcam).save]
34
+ when 'panorama'
35
+ return [:image, ip_address(event), panorama]
31
36
  when 'fire'
32
37
  @launcher.fire
33
38
  return [:fire]
@@ -79,5 +84,22 @@ module HWPing
79
84
  end
80
85
  false
81
86
  end
87
+
88
+ def panorama
89
+ @launcher.reset
90
+ images = []
91
+ 12.times do
92
+ images << Webcam.new(@webcam)
93
+ @launcher.right(400)
94
+ end
95
+ @launcher.reset
96
+ pano = Webcam.panorama(images, @webcam)
97
+ images.clear # garbage collection
98
+ pano.save
99
+ end
100
+
101
+ def ip_address(event)
102
+ event.bot.irc.socket.addr[3]
103
+ end
82
104
  end
83
105
  end
@@ -0,0 +1,22 @@
1
+ require 'hwping/webcam.so'
2
+
3
+ module HWPing
4
+ class Webcam
5
+ def initialize(options = {})
6
+ @dir = options.fetch('path', './tmp')
7
+ @path = 'image.jpg'
8
+ end
9
+
10
+ def save
11
+ write(File.join(@dir, @path))
12
+ @path
13
+ end
14
+
15
+ def self.panorama(images, options = {})
16
+ pano = stitch(images)
17
+ pano.instance_variable_set(:@dir, options.fetch('path', './tmp'))
18
+ pano.instance_variable_set(:@path, 'image.jpg')
19
+ pano
20
+ end
21
+ end
22
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hwping
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dávid Halász
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-06 00:00:00.000000000 Z
11
+ date: 2016-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: libusb
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 2.3.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.9.7
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.9.7
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: codecov
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -112,10 +126,14 @@ description: IRC bot for HW pinging with the Dream Cheeky Thunder missile launch
112
126
  email: skateman@skateman.eu
113
127
  executables:
114
128
  - hwping
115
- extensions: []
129
+ extensions:
130
+ - ext/hwping/extconf.rb
116
131
  extra_rdoc_files: []
117
132
  files:
118
133
  - bin/hwping
134
+ - ext/hwping/extconf.rb
135
+ - ext/hwping/webcam.cpp
136
+ - ext/hwping/webcam.h
119
137
  - lib/hwping.rb
120
138
  - lib/hwping/bot.rb
121
139
  - lib/hwping/config.rb
@@ -123,6 +141,7 @@ files:
123
141
  - lib/hwping/handler.rb
124
142
  - lib/hwping/hwping.rb
125
143
  - lib/hwping/launcher.rb
144
+ - lib/hwping/webcam.rb
126
145
  homepage: http://github.com/skateman/hwping
127
146
  licenses:
128
147
  - GPL-2