wildfire 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f3923d97b745897c8551c939ae94471a758ff463
4
+ data.tar.gz: aea6cfa9f096b92b16f4192cbaa0b4d5d1689fc2
5
+ SHA512:
6
+ metadata.gz: 98e035d850728440e53a0e8107dee91022eef889e08cd7b781a92e6fcad2ebb71bc2e17d4e6fadc71388e9ad761491a40d24cc68fc14962947f0d6270df42842
7
+ data.tar.gz: 765b9d40498062f08408edb80060d0d83bd7cf1e3e89936683ec4f0ca0e20c0fb35ae4fef1cad84d8e2198c5c49fc0ca4d04c3b24b2f481a0e8851545606030a
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /spec/support/big_page.jpg
11
+ /spec/support/screen_*.jpg
12
+ *.bundle
13
+ *.so
14
+ *.o
15
+ *.a
16
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in wildfire.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Domas
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,55 @@
1
+ # Wildfire
2
+
3
+ Uses computer vision to cut objects from images.
4
+
5
+ Something like this.
6
+
7
+ ![Page Rectangle](https://cloud.githubusercontent.com/assets/1877286/4446183/244f081a-4800-11e4-8b71-b7abe348e2c1.png)
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'wildfire'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install wildfire
24
+
25
+ ## Usage
26
+
27
+ Use it from command line:
28
+ ```sh
29
+ bin/wildfire a4 spec/support/printed-iphones-on-a4.jpg
30
+ # => The page was cut and placed at spec/support/big_page.jpg
31
+
32
+ bin/wildfire printed_screens spec/support/printed-iphones-on-a4.jpg
33
+ # => The screens were cut and placed at spec/support/screen_0.jpg,
34
+ # spec/support/screen_1.jpg, spec/support/screen_2.jpg, spec/support/screen_3.jpg
35
+ ```
36
+
37
+ Use it from Ruby code:
38
+ ```ruby
39
+ manager = Wildfire::Manager.new(image_path)
40
+ manager.predicted_page_coords
41
+ # => [[0,0], [0, 50], [50, 0], [50, 50]]
42
+ manager.cut_page!(manager.predicted_page_coords)
43
+ # => cut_page_path.jpg
44
+
45
+ Wildfire::ScreenCutter.new('cut_page_path.jpg').paths
46
+ # => ['screen_1.jpg', 'screen_2.jpg', ...]
47
+ ```
48
+
49
+ ## Contributing
50
+
51
+ 1. Fork it ( https://github.com/[my-github-username]/wildfire/fork )
52
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
53
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
54
+ 4. Push to the branch (`git push origin my-new-feature`)
55
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env ruby
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require_relative '../lib/wildfire'
6
+
7
+ description_of_generate = "'wildfire a4 <filename-of-image>'"
8
+ description_of_printed_screens = "'wildfire printed_screens <filename-of-image>'"
9
+
10
+ slop = Slop.new(help: true, banner: true) do
11
+ banner('Usage: wildfire [options]')
12
+ on :v, :version, 'Print version.' do
13
+ puts "Your version is #{Wildfire::VERSION}"
14
+ end
15
+
16
+ command('a4', description: description_of_generate) do
17
+ run do |opts, args|
18
+ cut_page_filename = Wildfire::Runner.cut_a4(args.shift)
19
+ puts "The page was cut and placed at #{cut_page_filename}"
20
+ end
21
+ end
22
+
23
+ command('printed_screens', description: description_of_printed_screens) do
24
+ run do |opts, args|
25
+ screen_filenames = Wildfire::Runner.cut_printed_screens(args.shift)
26
+ puts "The screens were cut and placed at #{screen_filenames.join(', ')}"
27
+ end
28
+ end
29
+ end
30
+
31
+ puts slop.help if ARGV.empty?
32
+ slop.parse
@@ -0,0 +1,28 @@
1
+ require 'pry'
2
+ require 'pry-stack_explorer'
3
+ require 'require_all'
4
+ require 'ropencv'
5
+ require 'memoist'
6
+
7
+ require_relative 'wildfire/manager'
8
+ require_relative 'wildfire/screen_cutter'
9
+ require_rel 'wildfire/converter'
10
+
11
+ module Wildfire
12
+ class Runner
13
+ class << self
14
+ def cut_a4(source_image_path)
15
+ manager = Manager.new(source_image_path)
16
+ manager.cut_page!(manager.predicted_page_coords)
17
+ end
18
+
19
+ def cut_printed_screens(source_image_path)
20
+ a4_path = cut_a4(source_image_path)
21
+ screen_cutter = Converter::ScreenCutter.new(a4_path)
22
+ screen_cutter.cut_screens!
23
+
24
+ screen_cutter.screen_paths
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,64 @@
1
+ module Wildfire
2
+ module Converter
3
+ class Analizer < Core
4
+ def initialize(big_cvmat)
5
+ @big_cvmat = big_cvmat
6
+ @resizer = Resizer.new(@big_cvmat)
7
+ end
8
+
9
+ def shaped_points
10
+ page_contour.to_a.map { |p| @resizer.big_point(p) }
11
+ end
12
+
13
+ def shaped_rect(rect)
14
+ top = rect.tl
15
+ bottom = rect.br
16
+
17
+ Cv::Rect.new(top.x * @resizer.to_big_ratio,
18
+ top.y * @resizer.to_big_ratio,
19
+ (bottom.x - top.x) * @resizer.to_big_ratio,
20
+ (bottom.y - top.y) * @resizer.to_big_ratio)
21
+ end
22
+
23
+ def page_contour
24
+ greyed = Transformer.grey(@resizer.to_small)
25
+ medianed = Transformer.median_blur(greyed)
26
+ eroded = Transformer.erode(medianed)
27
+ dilated = Transformer.dilate(medianed)
28
+ substracted = Transformer.substract(dilated, eroded)
29
+ binaried = Transformer.binary(substracted)
30
+
31
+
32
+ result = Transformer.approximate(longest_contour)
33
+ Orderer.to_tl_tr_br_bl(result.to_a)
34
+ end
35
+
36
+ def longest_contour
37
+ sorted_by_length = contours.to_a.sort_by do |contour|
38
+ Cv.arc_length(contour, false)
39
+ end
40
+
41
+ sorted_by_length.last
42
+ end
43
+
44
+ def contours
45
+ greyed = Transformer.grey(@resizer.to_small)
46
+ blurred = Transformer.blur(greyed)
47
+ cannied = Transformer.canny(blurred)
48
+
49
+ input_and_output = cannied.dup
50
+ execute_contour_find(input_and_output)
51
+ end
52
+
53
+ def execute_contour_find(mat)
54
+ contour_mat = temp_mat
55
+ output_array_of_arrays_contours = Std::Vector::Cv_Mat.new
56
+
57
+ Cv.find_contours(mat, output_array_of_arrays_contours, contour_mat,
58
+ CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE)
59
+
60
+ output_array_of_arrays_contours
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,27 @@
1
+ module Wildfire
2
+ module Converter
3
+ class Core
4
+ include OpenCV
5
+ RED = Cv::Scalar.new(255, 0, 0)
6
+
7
+ def temp_mat
8
+ Cv.imread('/tmp/paper_god.jpg')
9
+ end
10
+
11
+ def quick_save(mat)
12
+ Cv.imwrite("#{Dir.home}/quick_photo.jpg", mat)
13
+ end
14
+
15
+ def save(filename, image)
16
+ path = generate_path(filename)
17
+ Cv.imwrite(path, image)
18
+ path
19
+ end
20
+
21
+ def generate_path(name)
22
+ nodes = @full_path.split('/')[0...-1] + [name]
23
+ nodes.join('/')
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,48 @@
1
+ module Wildfire
2
+ module Converter
3
+ class Manager < Core
4
+ attr_reader :screens
5
+
6
+ def initialize(full_path)
7
+ @full_path = full_path
8
+ @page_cutter = PageCutter.new(full)
9
+ @screens = []
10
+ end
11
+
12
+ def predicted_page_coords
13
+ @page_cutter.small_coords
14
+ end
15
+
16
+ def cut_page!(coords)
17
+ page = @page_cutter.cut_page(coords)
18
+ save('big_page.jpg', page)
19
+ end
20
+
21
+ def small_full_path
22
+ save('small_full.jpg', small)
23
+ end
24
+
25
+ def converted_path
26
+ generate_path('converted.jpg')
27
+ end
28
+
29
+ private
30
+
31
+ def serialize_points(points)
32
+ points.to_a.map { |p| serialize_point(p) }
33
+ end
34
+
35
+ def serialize_point(point)
36
+ { x: point.first, y: point.last }
37
+ end
38
+
39
+ def full
40
+ Transformer.rotate(Cv.imread(@full_path), 3)
41
+ end
42
+
43
+ def small
44
+ Resizer.new(full).to_small
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,18 @@
1
+ module Wildfire
2
+ module Converter
3
+ class Orderer
4
+ class << self
5
+ def to_tl_tr_br_bl(points)
6
+ bottom_left = points.sort { |p| p[0] + p[1] }.last
7
+ top_right = points.sort { |p| p[0] + p[1] }.first
8
+ other = points - [top_right, bottom_left]
9
+
10
+ bottom_right = other.sort { |p| p[0] - p[1] }.first
11
+ top_left = other.sort { |p| p[0] - p[1] }.last
12
+
13
+ [top_left, top_right, bottom_right, bottom_left]
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ module Wildfire
2
+ module Converter
3
+ class PageCutter < Core
4
+ attr_reader :page
5
+
6
+ def initialize(big_cvmat)
7
+ @big_cvmat = big_cvmat
8
+ @analizer = Analizer.new(@big_cvmat)
9
+ @resizer = Resizer.new(@big_cvmat)
10
+ end
11
+
12
+ def small_coords
13
+ @analizer.page_contour
14
+ end
15
+
16
+ def cut_page(coords)
17
+ @page = Transformer.four_point_transform(@big_cvmat,
18
+ @resizer.to_big_coords(coords))
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,44 @@
1
+ module Wildfire
2
+ module Converter
3
+ class Resizer < Core
4
+ def initialize(original, small_height: 500.0)
5
+ @original = original
6
+ @small_height = small_height
7
+ end
8
+
9
+ def to_small
10
+ new_sized_mat = temp_mat
11
+ Cv.resize(@original, new_sized_mat, small_size)
12
+ new_sized_mat
13
+ end
14
+
15
+ def small_size
16
+ new_size = @original.size.dup
17
+ new_size.height = @small_height
18
+ new_size.width = new_size.height * to_small_ratio
19
+ new_size
20
+ end
21
+
22
+ def to_small_ratio
23
+ @original.size.width / @original.size.height.to_f
24
+ end
25
+
26
+ def to_big_ratio
27
+ @original.size.height / @small_height
28
+ end
29
+
30
+ # def big_point(point)
31
+ # big = point.map { |xy| (xy * to_big_ratio).to_i }
32
+ # Cv::Point.new(*big)
33
+ # end
34
+
35
+ def big_point(coords)
36
+ coords.map { |coord| (coord * to_big_ratio).to_i }
37
+ end
38
+
39
+ def to_big_coords(rect)
40
+ rect.map { |coords| big_point(coords) }
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,40 @@
1
+ module Wildfire
2
+ module Converter
3
+ class ScreenCutter < Core
4
+ COORDS = {
5
+ tl: [30, 47],
6
+ tr: [150, 47],
7
+ bl: [25, 280],
8
+ br: [150, 280],
9
+ }.freeze
10
+
11
+ attr_reader :screen_paths
12
+
13
+ def initialize(full_path)
14
+ @full_path = full_path
15
+ @analizer = Analizer.new(full)
16
+ @resizer = Resizer.new(full)
17
+ end
18
+
19
+ def screens
20
+ COORDS.map do |which, coords|
21
+ rect_args = @resizer.to_big_coords([coords + [95, 160]]).flatten
22
+ rect = Cv::Rect.new(*rect_args)
23
+ full.block(rect)
24
+ end
25
+ end
26
+
27
+ def cut_screens!
28
+ @screen_paths = screens.map.with_index do |screen, i|
29
+ save("screen_#{i}.jpg", screen)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def full
36
+ Cv.imread(@full_path)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,32 @@
1
+ module Wildfire
2
+ module Converter
3
+ class SizeCalculator < Core
4
+ attr_reader :points
5
+
6
+ def initialize(points)
7
+ @points = Orderer.to_tl_tr_br_bl(points)
8
+ end
9
+
10
+ def max_width
11
+ tl, tr, br, bl = @points
12
+
13
+ width_bottom = difference(br, bl)
14
+ width_top = difference(tr, tl)
15
+ [width_top.to_i, width_bottom.to_i].max
16
+ end
17
+
18
+ def max_height
19
+ tl, tr, br, bl = @points
20
+
21
+ height_right = difference(tr, br)
22
+ height_left = difference(tl, bl)
23
+ [height_right.to_i, height_left.to_i].max
24
+ end
25
+
26
+ def difference(point1, point2)
27
+ d = (point2[0] - point1[0])**2 + (point2[1] - point1[1])**2
28
+ Math.sqrt(d)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,136 @@
1
+ module Wildfire
2
+ module Converter
3
+ class Transformer < Core
4
+ class << self
5
+ include OpenCV
6
+
7
+ # just duping
8
+ def temp_mat
9
+ Cv.imread('/tmp/paper_god.jpg')
10
+ end
11
+
12
+ def quick_save(mat)
13
+ Cv.imwrite('/home/domas/quick_photo.jpg', mat)
14
+ end
15
+
16
+ def approximate(mat)
17
+ accuracy = 0.02 * Cv.arc_length(mat, false)
18
+
19
+ approxed_curve = temp_mat
20
+ Cv.approx_polydp(mat, approxed_curve, accuracy, true)
21
+ approxed_curve
22
+ end
23
+
24
+ def grey(mat)
25
+ grey_mat = temp_mat
26
+ Cv.cvt_color(mat, grey_mat, CV_BGR2GRAY)
27
+ grey_mat
28
+ end
29
+
30
+ def blur(mat)
31
+ blur_mat = temp_mat
32
+ Cv.gaussian_blur(mat, blur_mat, Cv::Size.new(5, 5), 0)
33
+ blur_mat
34
+ end
35
+
36
+ def median_blur(mat)
37
+ blur_mat = temp_mat
38
+ Cv.median_blur(mat, blur_mat, 3)
39
+ blur_mat
40
+ end
41
+
42
+ def erode(mat)
43
+ eroded_mat = temp_mat
44
+ kernel = temp_mat
45
+ Cv.erode(mat, eroded_mat, kernel)
46
+ eroded_mat
47
+ end
48
+
49
+ def dilate(mat)
50
+ dilated_mat = temp_mat
51
+ kernel = temp_mat
52
+ Cv.dilate(mat, dilated_mat, kernel)
53
+ dilated_mat
54
+ end
55
+
56
+ def canny(mat)
57
+ cannied = temp_mat
58
+ Cv.canny(mat, cannied, 100, 50)
59
+ cannied
60
+ end
61
+
62
+ def substract(mat1, mat2)
63
+ result = temp_mat
64
+ Cv.subtract(mat1, mat2, result)
65
+ result
66
+ end
67
+
68
+ def binary(mat)
69
+ binaried = temp_mat
70
+ Cv.threshold(mat, binaried, 1, 1, Cv::THRESH_OTSU)
71
+ # Cv.threshold(mat, binaried, Cv::THRESH_BINARY)
72
+ binaried
73
+ end
74
+
75
+ def four_point_transform(mat, points)
76
+ calculator = Converter::SizeCalculator.new(points)
77
+
78
+ destination = [
79
+ [0, 0],
80
+ [calculator.max_width - 1, 0],
81
+ [calculator.max_width - 1, calculator.max_height - 1],
82
+ [0, calculator.max_height - 1],
83
+ ]
84
+
85
+ input = cv_point_array(destination)
86
+ output = cv_point_array(calculator.points.map { |p| [p[0], p[1]] })
87
+ perspective = Cv.get_perspective_transform(input, output)
88
+
89
+ new_size = Cv::Size.new(calculator.max_width, calculator.max_height)
90
+ warped = warp(mat, perspective, new_size)
91
+ rotate(transpose(warped), 3)
92
+ end
93
+
94
+ def cv_point_array(array)
95
+ mat = Cv::Mat.new(array)
96
+ mat.convert_to(mat, Cv::CV_32FC2)
97
+ mat
98
+ end
99
+
100
+ def warp(mat, perspective, new_size)
101
+ warped = temp_mat
102
+ Cv.warp_perspective(mat, warped, perspective, new_size,
103
+ Cv::INTER_LINEAR | Cv::WARP_INVERSE_MAP)
104
+ quick_save(warped)
105
+ warped
106
+ end
107
+
108
+ def transpose(mat)
109
+ transposed = temp_mat
110
+ Cv.transpose(mat, transposed)
111
+ transposed
112
+ end
113
+
114
+ def flip(mat)
115
+ flipped = temp_mat
116
+ Cv.flip(mat, flipped, 0)
117
+ flipped
118
+ end
119
+
120
+ def rotate(mat, repetitions)
121
+ result = mat
122
+
123
+ repetitions.times do
124
+ result = one_rotation(result)
125
+ end
126
+
127
+ result
128
+ end
129
+
130
+ def one_rotation(mat)
131
+ flip(transpose(mat))
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,11 @@
1
+ module Wildfire
2
+ class Manager
3
+ extend Forwardable
4
+
5
+ def initialize(*args)
6
+ @instance = Converter::Manager.new(*args)
7
+ end
8
+
9
+ def_delegators :@instance, :predicted_page_coords, :cut_page!, :small_full_path
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module Wildfire
2
+ class ScreenCutter
3
+ def initialize(*args)
4
+ @screen_cutter = Converter::ScreenCutter.new(*args)
5
+ @screen_cutter.cut_screens!
6
+ end
7
+
8
+ def paths
9
+ @screen_cutter.screen_paths
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module Wildfire
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'wildfire/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'wildfire'
8
+ spec.version = Wildfire::VERSION
9
+ spec.authors = ['Domas']
10
+ spec.email = ['domas.bitvinskas@me.com']
11
+ spec.summary = %q(Cut objects from images like crazy)
12
+ spec.description = %q(Uses computer vision to cut objects from images.)
13
+ spec.homepage = 'https://github.com/Nedomas/Wildfire'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = ['wildfire']
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_runtime_dependency 'ropencv', '~> 0.0.17'
22
+ spec.add_runtime_dependency 'slop', '~> 3.4'
23
+ spec.add_runtime_dependency 'andand', '~> 1.3'
24
+ spec.add_runtime_dependency 'pry', '~> 0.9'
25
+ spec.add_runtime_dependency 'pry-stack_explorer', '~> 0.4'
26
+ spec.add_runtime_dependency 'require_all', '~> 1.3'
27
+ spec.add_runtime_dependency 'memoist'
28
+ spec.add_development_dependency 'bundler', '~> 1.6'
29
+ spec.add_development_dependency 'rake', '~> 10.0'
30
+ spec.add_development_dependency 'rspec'
31
+ end
metadata ADDED
@@ -0,0 +1,210 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wildfire
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Domas
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ropencv
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.17
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.17
27
+ - !ruby/object:Gem::Dependency
28
+ name: slop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: andand
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-stack_explorer
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.4'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: require_all
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.3'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: memoist
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: bundler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.6'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.6'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '10.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '10.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Uses computer vision to cut objects from images.
154
+ email:
155
+ - domas.bitvinskas@me.com
156
+ executables:
157
+ - wildfire
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - ".gitignore"
162
+ - Gemfile
163
+ - LICENSE.txt
164
+ - README.md
165
+ - Rakefile
166
+ - bin/wildfire
167
+ - lib/wildfire.rb
168
+ - lib/wildfire/converter/analizer.rb
169
+ - lib/wildfire/converter/core.rb
170
+ - lib/wildfire/converter/manager.rb
171
+ - lib/wildfire/converter/orderer.rb
172
+ - lib/wildfire/converter/page_cutter.rb
173
+ - lib/wildfire/converter/resizer.rb
174
+ - lib/wildfire/converter/screen_cutter.rb
175
+ - lib/wildfire/converter/size_calculator.rb
176
+ - lib/wildfire/converter/transformer.rb
177
+ - lib/wildfire/manager.rb
178
+ - lib/wildfire/screen_cutter.rb
179
+ - lib/wildfire/version.rb
180
+ - spec/support/printed-iphones-on-a4.jpg
181
+ - spec/support/single-iphone-on-a4.jpg
182
+ - wildfire.gemspec
183
+ homepage: https://github.com/Nedomas/Wildfire
184
+ licenses:
185
+ - MIT
186
+ metadata: {}
187
+ post_install_message:
188
+ rdoc_options: []
189
+ require_paths:
190
+ - lib
191
+ required_ruby_version: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ required_rubygems_version: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ requirements: []
202
+ rubyforge_project:
203
+ rubygems_version: 2.2.2
204
+ signing_key:
205
+ specification_version: 4
206
+ summary: Cut objects from images like crazy
207
+ test_files:
208
+ - spec/support/printed-iphones-on-a4.jpg
209
+ - spec/support/single-iphone-on-a4.jpg
210
+ has_rdoc: