sqed 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +2 -2
- data/lib/sqed/boundaries.rb +22 -7
- data/lib/sqed/boundary_finder/color_line_finder.rb +26 -19
- data/lib/sqed/boundary_finder.rb +2 -2
- data/lib/sqed/extractor.rb +33 -17
- data/lib/sqed/parser/barcode_parser.rb +32 -16
- data/lib/sqed/parser/ocr_parser.rb +24 -6
- data/lib/sqed/parser.rb +7 -0
- data/lib/sqed/result.rb +54 -6
- data/lib/sqed/version.rb +1 -1
- data/lib/sqed.rb +37 -12
- data/lib/sqed_config.rb +14 -8
- data/spec/lib/sqed/boundaries_spec.rb +26 -1
- data/spec/lib/sqed/boundary_finder_spec.rb +89 -1
- data/spec/lib/sqed/extractor_spec.rb +50 -76
- data/spec/lib/sqed/parser/barcode_spec.rb +25 -0
- data/spec/lib/sqed/parser/ocr_spec.rb +16 -0
- data/spec/lib/sqed/parser_spec.rb +6 -1
- data/spec/lib/sqed/result_spec.rb +24 -0
- data/spec/lib/sqed_spec.rb +58 -144
- data/spec/support/files/barcode_images/code_128_barcode.png +0 -0
- data/spec/support/files/barcode_images/datamatrix_barcode.png +0 -0
- data/spec/support/files/{2Dbarcode.png → barcode_images/osuc_datamatrix_barcode.png} +0 -0
- data/spec/support/files/label_images/basic1.png +0 -0
- data/spec/support/files/label_images/basic2.png +0 -0
- data/spec/support/files/label_images/readme.png +0 -0
- data/spec/support/files/{types_21.jpg → misc_images/types_21.jpg} +0 -0
- data/spec/support/files/{types_8.jpg → misc_images/types_8.jpg} +0 -0
- data/spec/support/files/{CrossyBlackLinesSpecimen.jpg → stage_images/CrossyBlackLinesSpecimen.jpg} +0 -0
- data/spec/support/files/{CrossyGreenLinesSpecimen.jpg → stage_images/CrossyGreenLinesSpecimen.jpg} +0 -0
- data/spec/support/files/{black_stage_green_line_specimen.jpg → stage_images/black_stage_green_line_specimen.jpg} +0 -0
- data/spec/support/files/{boundary_cross_green.jpg → stage_images/boundary_cross_green.jpg} +0 -0
- data/spec/support/files/{boundary_left_t_yellow.jpg → stage_images/boundary_left_t_yellow.jpg} +0 -0
- data/spec/support/files/{boundary_offset_cross_red.jpg → stage_images/boundary_offset_cross_red.jpg} +0 -0
- data/spec/support/files/{boundary_right_t_green.jpg → stage_images/boundary_right_t_green.jpg} +0 -0
- data/spec/support/files/stage_images/frost_stage.jpg +0 -0
- data/spec/support/files/{greenlineimage.jpg → stage_images/greenlineimage.jpg} +0 -0
- data/spec/support/files/test4.jpg +0 -0
- data/spec/support/image_helpers.rb +61 -33
- data/sqed.gemspec +3 -2
- metadata +58 -34
- data/spec/support/files/Quadrant_2_3.jpg +0 -0
- data/spec/support/files/test4OLD.jpg +0 -0
- data/spec/support/files/test_barcode.JPG +0 -0
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Sqed::Boundaries do
|
4
4
|
|
5
|
-
let(:s) { Sqed::Boundaries.new}
|
5
|
+
let(:s) { Sqed::Boundaries.new }
|
6
6
|
let(:layout) {:horizontal_split}
|
7
7
|
|
8
8
|
specify "#coordinates defaults to a Hash when no layout provided" do
|
@@ -32,4 +32,29 @@ describe Sqed::Boundaries do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
context '#offset' do
|
36
|
+
let(:s) { Sqed.new(image: ImageHelpers.crossy_green_line_specimen, pattern: :offset_cross) }
|
37
|
+
let(:offset_boundaries) {
|
38
|
+
s.crop_image
|
39
|
+
s.boundaries.offset(s.stage_boundary)
|
40
|
+
}
|
41
|
+
|
42
|
+
specify "offset and size should match internal found areas " do
|
43
|
+
sbx = s.stage_boundary.x_for(0)
|
44
|
+
sby = s.stage_boundary.y_for(0)
|
45
|
+
|
46
|
+
total_sections = s.boundaries.coordinates.count
|
47
|
+
expect(offset_boundaries.complete).to be(true)
|
48
|
+
|
49
|
+
(0..total_sections - 1).each do |i|
|
50
|
+
# check all the x/y
|
51
|
+
expect(offset_boundaries.x_for(i)).to eq(s.boundaries.x_for(i) + sbx)
|
52
|
+
expect(offset_boundaries.y_for(i)).to eq(s.boundaries.y_for(i) + sby)
|
53
|
+
|
54
|
+
# check all width/heights
|
55
|
+
expect(offset_boundaries.width_for(i)).to eq(s.boundaries.width_for(i))
|
56
|
+
expect(offset_boundaries.height_for(i)).to eq(s.boundaries.height_for(i))
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
35
60
|
end
|
@@ -104,5 +104,93 @@ describe Sqed::BoundaryFinder do
|
|
104
104
|
expect( Sqed::BoundaryFinder.frequency_stats(i, 15)).to eq(nil)
|
105
105
|
end
|
106
106
|
end
|
107
|
-
|
107
|
+
|
108
|
+
context 'offset boundaries from crossy_black_line_specimen image ' do
|
109
|
+
before(:all) {
|
110
|
+
@s = Sqed.new(image: ImageHelpers.crossy_black_line_specimen, pattern: :offset_cross, boundary_color: :black)
|
111
|
+
@s.crop_image
|
112
|
+
@offset_boundaries = @s.boundaries.offset(@s.stage_boundary)
|
113
|
+
true
|
114
|
+
}
|
115
|
+
|
116
|
+
##**** actually fails (?!)
|
117
|
+
specify "offset and size should match internal found areas " do
|
118
|
+
sbx = @s.stage_boundary.x_for(0)
|
119
|
+
sby = @s.stage_boundary.y_for(0)
|
120
|
+
|
121
|
+
sl = @s.boundaries.coordinates.length # may be convenient to clone this model for other than 4 boundaries found
|
122
|
+
expect(sl).to eq(4) #for offset cross pattern and valid image
|
123
|
+
expect(@s.boundaries.complete).to be(true)
|
124
|
+
expect(@offset_boundaries.complete).to be(true)
|
125
|
+
(0..sl - 1).each do |i|
|
126
|
+
# check all the x/y
|
127
|
+
expect(@offset_boundaries.x_for(i)).to eq(@s.boundaries.x_for(i) + sbx)
|
128
|
+
expect(@offset_boundaries.y_for(i)).to eq(@s.boundaries.y_for(i) + sby)
|
129
|
+
|
130
|
+
# check all width/heights
|
131
|
+
expect(@offset_boundaries.width_for(i)).to eq(@s.boundaries.width_for(i))
|
132
|
+
expect(@offset_boundaries.height_for(i)).to eq(@s.boundaries.height_for(i))
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
context 'offset boundaries from black_green_line_specimen image ' do
|
138
|
+
before(:all) {
|
139
|
+
@s = Sqed.new(image: ImageHelpers.black_stage_green_line_specimen, pattern: :offset_cross)
|
140
|
+
@s.crop_image
|
141
|
+
@offset_boundaries = @s.boundaries.offset(@s.stage_boundary)
|
142
|
+
true
|
143
|
+
}
|
144
|
+
|
145
|
+
specify "offset and size should match internal found areas " do
|
146
|
+
sbx = @s.stage_boundary.x_for(0)
|
147
|
+
sby = @s.stage_boundary.y_for(0)
|
148
|
+
|
149
|
+
sl = @s.boundaries.coordinates.count # may be convenient to clone this model for other than 4 boundaries found
|
150
|
+
expect(sl).to eq(4) #for offset cross pattern and valid image
|
151
|
+
expect(@s.boundaries.complete).to be(true)
|
152
|
+
expect(@offset_boundaries.complete).to be(true)
|
153
|
+
(0..sl - 1).each do |i|
|
154
|
+
# check all the x/y
|
155
|
+
expect(@offset_boundaries.x_for(i)).to eq(@s.boundaries.x_for(i) + sbx)
|
156
|
+
expect(@offset_boundaries.y_for(i)).to eq(@s.boundaries.y_for(i) + sby)
|
157
|
+
|
158
|
+
# check all width/heights
|
159
|
+
expect(@offset_boundaries.width_for(i)).to eq(@s.boundaries.width_for(i))
|
160
|
+
expect(@offset_boundaries.height_for(i)).to eq(@s.boundaries.height_for(i))
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context 'offset boundaries from original red_line image ' do
|
166
|
+
before(:all) {
|
167
|
+
@s = Sqed.new(image: ImageHelpers.offset_cross_red, pattern: :right_t, boundary_color: :red)
|
168
|
+
@s.crop_image
|
169
|
+
@offset_boundaries = @s.boundaries.offset(@s.stage_boundary)
|
170
|
+
}
|
171
|
+
|
172
|
+
specify "offset and size should match internal found areas " do
|
173
|
+
sbx = @s.stage_boundary.x_for(0) # only a single boundary
|
174
|
+
sby = @s.stage_boundary.y_for(0)
|
175
|
+
pct = 0.02
|
176
|
+
|
177
|
+
sl = @s.boundaries.coordinates.count
|
178
|
+
expect(sl).to eq(3)
|
179
|
+
expect(@s.boundaries.complete).to be(true)
|
180
|
+
expect(@offset_boundaries.complete).to be(true)
|
181
|
+
expect(@s.stage_boundary.width_for(0)).to be_within(pct*800).of(800)
|
182
|
+
expect(@s.stage_boundary.height_for(0)).to be_within(pct*600).of(600)
|
183
|
+
(0..sl - 1).each do |i|
|
184
|
+
# check all the x/y
|
185
|
+
expect(@offset_boundaries.x_for(i)).to eq(@s.boundaries.x_for(i) + sbx)
|
186
|
+
expect(@offset_boundaries.y_for(i)).to eq(@s.boundaries.y_for(i) + sby)
|
187
|
+
|
188
|
+
# check all width/heights
|
189
|
+
expect(@offset_boundaries.width_for(i)).to eq(@s.boundaries.width_for(i))
|
190
|
+
expect(@offset_boundaries.height_for(i)).to eq(@s.boundaries.height_for(i))
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
|
108
196
|
end
|
@@ -1,82 +1,56 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
|
3
2
|
describe Sqed::Extractor do
|
4
3
|
|
5
|
-
let(:
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
#
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
#
|
35
|
-
|
4
|
+
let(:metadata_map) {
|
5
|
+
{0 => :specimen, 1 => :identifier, 2 => :nothing, 3 => :image_registration }
|
6
|
+
}
|
7
|
+
|
8
|
+
let(:image) { ImageHelpers.crossy_green_line_specimen }
|
9
|
+
|
10
|
+
let(:boundaries) {
|
11
|
+
Sqed::BoundaryFinder::CrossFinder.new(
|
12
|
+
image: image
|
13
|
+
).boundaries
|
14
|
+
}
|
15
|
+
|
16
|
+
let(:e) {
|
17
|
+
Sqed::Extractor.new(
|
18
|
+
boundaries: boundaries,
|
19
|
+
image: image,
|
20
|
+
metadata_map: metadata_map
|
21
|
+
)
|
22
|
+
}
|
23
|
+
|
24
|
+
context 'attributes' do
|
25
|
+
specify '#image' do
|
26
|
+
expect(e).to respond_to(:image)
|
27
|
+
end
|
28
|
+
|
29
|
+
specify '#metadata_map' do
|
30
|
+
expect(e).to respond_to(:metadata_map)
|
31
|
+
end
|
32
|
+
|
33
|
+
specify '#boundaries' do
|
34
|
+
expect(e).to respond_to(:boundaries)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'extracting to a #result' do
|
39
|
+
let(:r) { e.result }
|
40
|
+
|
41
|
+
specify '#result retuns a Sqed::Result' do
|
42
|
+
expect(r.class.name).to eq('Sqed::Result')
|
43
|
+
end
|
44
|
+
|
45
|
+
specify '#result is populated with images' do
|
46
|
+
expect(r.images.values.first.class.name).to eq('Magick::Image')
|
47
|
+
end
|
48
|
+
|
49
|
+
specify '#result is populated with text' do
|
50
|
+
expect(r.text_for(:identifier)).to match('000085067')
|
51
|
+
end
|
52
|
+
end
|
36
53
|
|
37
|
-
|
38
|
-
# eb = Sqed::BarcodeParser.new(image: ImageHelpers.barcode_image) # was barcode_image
|
39
|
-
# bc = eb.barcodes
|
40
|
-
# expect(bc).to be_truthy
|
41
|
-
# expect(bc[2]).to eq('CODE-128:013117001040986')
|
42
|
-
# expect(bc[3]).to eq('CODE-128:SDLXHD1QTDVGJ')
|
43
|
-
# expect(bc[4]).to eq('CODE-128:1PPD368LL/A')
|
44
|
-
# expect(bc[5]).to eq('EAN-13:0885909541171')
|
45
|
-
# expect(bc[6]).to eq('EAN-13:885909270334')
|
46
|
-
# expect(bc[7]).to be(nil)
|
47
|
-
# end
|
48
|
-
|
49
|
-
# specify 'INHS specimen labels' do
|
50
|
-
# eg = Sqed.new(image: ImageHelpers.labels_image)
|
51
|
-
# # eg = Sqed.new(image: ImageHelpers.foo3_image)
|
52
|
-
# eg.image.rotate!(270.0)
|
53
|
-
# eg.image.write('foo5.jpg')
|
54
|
-
# egt = eg.text_from_quadrant(3)
|
55
|
-
# expect(egt).to match(/529 234/)
|
56
|
-
# end
|
57
|
-
|
58
|
-
# context "foo.jpg" do
|
59
|
-
# let(:eg) { Sqed.new(image: ImageHelpers.ocr_image) }
|
60
|
-
|
61
|
-
# specify 'all together' do
|
62
|
-
# # eg = Sqed.new(image: ImageHelpers.ocr_image)
|
63
|
-
# egt = eg.text_from_quadrant(3)
|
54
|
+
end
|
64
55
|
|
65
|
-
# expect(egt).to match(/Designed by Apple in California/)
|
66
|
-
# expect(egt).to match(/8 85909 27035/)
|
67
|
-
# expect(egt).to match(/EASY/)
|
68
|
-
# expect(eg.text_from_quadrant(3)).to match(/013‘1700104U986/) #ACTUALLY 013117001040986
|
69
56
|
|
70
|
-
# eg = Sqed.new(image: ImageHelpers.ocr_image)
|
71
|
-
# egb = eg.text_from_quadrant(2)
|
72
|
-
# u = 1 #pre-test breakpoint
|
73
|
-
# expect(egb.barcodes[0]).to eq('QR-Code:http://youtu.be/h9fkPPp8Y1c')
|
74
|
-
# expect(egb.barcodes[1]).to eq('EAN-13:0885909270354')
|
75
|
-
# expect(egb.barcodes[2]).to eq('CODE-128:013117001040986')
|
76
|
-
# expect(egb.barcodes[3]).to eq('CODE-128:SDLXHD1QTDVGJ')
|
77
|
-
# expect(egb.barcodes[4]).to eq('CODE-128:1PPD368LL/A')
|
78
|
-
# expect(egb.barcodes[5]).to eq('EAN-13:0885909541171')
|
79
|
-
# expect(egb.barcodes[6]).to be(nil)
|
80
|
-
# end
|
81
|
-
# end
|
82
|
-
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# Test barcodes where generated here: http://www.terryburton.co.uk/barcodewriter/generator/, thanks Terry!
|
4
|
+
#
|
5
|
+
# http://metafloor.github.io/bwip-js/demo/demo.html
|
6
|
+
describe Sqed::Parser::BarcodeParser do
|
7
|
+
|
8
|
+
let(:image) { ImageHelpers.code_128_barcode_image }
|
9
|
+
let(:p) { Sqed::Parser::BarcodeParser.new(image) }
|
10
|
+
|
11
|
+
|
12
|
+
specify '#image' do
|
13
|
+
expect(p).to respond_to(:image)
|
14
|
+
end
|
15
|
+
|
16
|
+
specify '#barcode' do
|
17
|
+
expect(p).to respond_to(:barcode)
|
18
|
+
end
|
19
|
+
|
20
|
+
specify '#barcode returns some text' do
|
21
|
+
expect(p.barcode).to eq('Count01234567!')
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Sqed::Parser::OcrParser do
|
4
|
+
|
5
|
+
let(:image) { ImageHelpers.readme_text }
|
6
|
+
let(:p) { Sqed::Parser::OcrParser.new(image) }
|
7
|
+
|
8
|
+
specify '#image' do
|
9
|
+
expect(p).to respond_to(:image)
|
10
|
+
end
|
11
|
+
|
12
|
+
specify '#text returns some text' do
|
13
|
+
expect(p.text).to eq('README.md')
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -4,6 +4,7 @@ describe Sqed::Result do
|
|
4
4
|
let(:r) {Sqed::Result.new}
|
5
5
|
|
6
6
|
context "attributes are derived from SqedConfig::LAYOUT_SECTION_TYPES" do
|
7
|
+
|
7
8
|
SqedConfig::LAYOUT_SECTION_TYPES.each do |type|
|
8
9
|
specify "##{type}" do
|
9
10
|
expect(r.respond_to?(type.to_sym)).to be_truthy
|
@@ -12,6 +13,29 @@ describe Sqed::Result do
|
|
12
13
|
specify "##{type}_image" do
|
13
14
|
expect(r.respond_to?("#{type}_image".to_sym)).to be_truthy
|
14
15
|
end
|
16
|
+
|
17
|
+
specify "##{type} initializes to {}" do
|
18
|
+
expect(r.send(type.to_sym)).to eq({})
|
19
|
+
end
|
15
20
|
end
|
16
21
|
end
|
22
|
+
|
23
|
+
context 'with a new() result' do
|
24
|
+
specify '#text_for(section)' do
|
25
|
+
expect(r.text_for(:specimen)).to eq(nil)
|
26
|
+
end
|
27
|
+
|
28
|
+
specify '#barcode_text_for(section)' do
|
29
|
+
expect(r.barcode_text_for(:identifier)).to eq(nil)
|
30
|
+
end
|
31
|
+
|
32
|
+
specify '#text' do
|
33
|
+
expect(r.text).to eq({})
|
34
|
+
end
|
35
|
+
|
36
|
+
specify '#images' do
|
37
|
+
expect(r.text).to eq({})
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
17
41
|
end
|
data/spec/lib/sqed_spec.rb
CHANGED
@@ -16,6 +16,22 @@ describe Sqed do
|
|
16
16
|
specify '#stage_image' do
|
17
17
|
expect(s).to respond_to(:image)
|
18
18
|
end
|
19
|
+
|
20
|
+
specify '#stage_boundary' do
|
21
|
+
expect(s).to respond_to(:stage_boundary)
|
22
|
+
end
|
23
|
+
|
24
|
+
specify '#boundaries' do
|
25
|
+
expect(s).to respond_to(:boundaries)
|
26
|
+
end
|
27
|
+
|
28
|
+
specify '#auto_detect_border' do
|
29
|
+
expect(s).to respond_to(:auto_detect_border)
|
30
|
+
end
|
31
|
+
|
32
|
+
specify '#boundary_color' do
|
33
|
+
expect(s).to respond_to(:boundary_color)
|
34
|
+
end
|
19
35
|
end
|
20
36
|
|
21
37
|
context 'initialization' do
|
@@ -24,37 +40,26 @@ describe Sqed do
|
|
24
40
|
end
|
25
41
|
end
|
26
42
|
|
27
|
-
context '
|
43
|
+
context '#result' do
|
28
44
|
specify 'without providing an image returns false' do
|
29
45
|
expect(s.result).to eq(false)
|
30
46
|
end
|
31
47
|
end
|
32
48
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
specify '#crop_image' do #should expand to multiple cases of image border types
|
49
|
+
# test intent is to just test wrapping functionality, see
|
50
|
+
# other tests for specifics on finders
|
51
|
+
context '#crop_image (with bordered stage)' do
|
52
|
+
specify 'finds a cropped image smaller than original' do
|
53
|
+
s.image = ImageHelpers.test3_image
|
40
54
|
expect(s.crop_image).to be_truthy
|
41
|
-
expect(s.stage_image.columns <
|
42
|
-
expect(s.stage_image.rows <
|
43
|
-
end
|
44
|
-
|
45
|
-
specify '#boundaries returns a Sqed::Boundaries instance' do
|
46
|
-
s.pattern = :standard_cross
|
47
|
-
expect(s.boundaries.class).to eq(Sqed::Boundaries)
|
55
|
+
expect(s.stage_image.columns < s.image.columns).to be(true)
|
56
|
+
expect(s.stage_image.rows < s.image.rows).to be(true)
|
48
57
|
end
|
49
|
-
end
|
50
58
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
s.crop_image
|
56
|
-
}
|
57
|
-
specify 'stage boundary is created for standard_ cross_green ~ (100,94, 800, 600)' do
|
59
|
+
specify 'properly sets stage boundaries ' do
|
60
|
+
s.image = ImageHelpers.standard_cross_green
|
61
|
+
s.crop_image
|
62
|
+
# ~ (100,94, 800, 600)
|
58
63
|
expect(s.stage_boundary.x_for(0)).to be_within(2).of 100
|
59
64
|
expect(s.stage_boundary.y_for(0)).to be_within(2).of 94
|
60
65
|
expect(s.stage_boundary.width_for(0)).to be_within(2).of 800
|
@@ -62,139 +67,48 @@ describe Sqed do
|
|
62
67
|
end
|
63
68
|
end
|
64
69
|
|
65
|
-
context '
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
specify "offset and size should match internal found areas " do
|
74
|
-
sbx = @s.stage_boundary.x_for(0)
|
75
|
-
sby = @s.stage_boundary.y_for(0)
|
76
|
-
|
77
|
-
sl = @s.boundaries.coordinates.length # may be convenient to clone this model for other than 4 boundaries found
|
78
|
-
expect(sl).to eq(4) #for offset cross pattern and valid image
|
79
|
-
expect(@s.boundaries.complete).to be(true)
|
80
|
-
expect(@offset_boundaries.complete).to be(true)
|
81
|
-
(0..sl - 1).each do |i|
|
82
|
-
# check all the x/y
|
83
|
-
expect(@offset_boundaries.x_for(i)).to eq(@s.boundaries.x_for(i) + sbx)
|
84
|
-
expect(@offset_boundaries.y_for(i)).to eq(@s.boundaries.y_for(i) + sby)
|
85
|
-
|
86
|
-
# check all width/heights
|
87
|
-
expect(@offset_boundaries.width_for(i)).to eq(@s.boundaries.width_for(i))
|
88
|
-
expect(@offset_boundaries.height_for(i)).to eq(@s.boundaries.height_for(i))
|
89
|
-
end
|
70
|
+
context 'all together' do
|
71
|
+
let(:image) { ImageHelpers.frost_stage }
|
72
|
+
let(:pattern) { :offset_cross }
|
73
|
+
let(:s) { Sqed.new(image: image, pattern: pattern) }
|
74
|
+
|
75
|
+
specify '#boundaries returns a Sqed::Boundaries instance' do
|
76
|
+
# s.pattern = :standard_cross
|
77
|
+
expect(s.boundaries.class.name).to eq('Sqed::Boundaries')
|
90
78
|
end
|
91
79
|
|
92
|
-
specify
|
93
|
-
|
94
|
-
poc = Sqed::Parser::OcrParser.new(bc.extract_image(@offset_boundaries.coordinates[1]))
|
95
|
-
expect(poc.text).to eq('000085067')
|
80
|
+
specify '#stage_image returns an Magick::Image' do
|
81
|
+
expect(s.stage_image.class.name).to eq('Magick::Image')
|
96
82
|
end
|
97
83
|
|
98
|
-
|
84
|
+
specify '#crop_image returns an Magick::Image' do
|
85
|
+
expect(s.crop_image.class.name).to eq('Magick::Image')
|
86
|
+
end
|
99
87
|
|
100
|
-
|
101
|
-
|
102
|
-
@s = Sqed.new(image: ImageHelpers.crossy_black_line_specimen, pattern: :offset_cross, boundary_color: :black)
|
103
|
-
@s.crop_image
|
104
|
-
@offset_boundaries = @s.boundaries.offset(@s.stage_boundary)
|
105
|
-
wtf = 0
|
106
|
-
}
|
107
|
-
|
108
|
-
specify "offset and size should match internal found areas " do ##**** actually fails
|
109
|
-
|
110
|
-
sbx = @s.stage_boundary.x_for(0)
|
111
|
-
sby = @s.stage_boundary.y_for(0)
|
112
|
-
|
113
|
-
sl = @s.boundaries.coordinates.length # may be convenient to clone this model for other than 4 boundaries found
|
114
|
-
expect(sl).to eq(4) #for offset cross pattern and valid image
|
115
|
-
expect(@s.boundaries.complete).to be(true)
|
116
|
-
expect(@offset_boundaries.complete).to be(true)
|
117
|
-
(0..sl - 1).each do |i|
|
118
|
-
# check all the x/y
|
119
|
-
expect(@offset_boundaries.x_for(i)).to eq(@s.boundaries.x_for(i) + sbx)
|
120
|
-
expect(@offset_boundaries.y_for(i)).to eq(@s.boundaries.y_for(i) + sby)
|
121
|
-
|
122
|
-
# check all width/heights
|
123
|
-
expect(@offset_boundaries.width_for(i)).to eq(@s.boundaries.width_for(i))
|
124
|
-
expect(@offset_boundaries.height_for(i)).to eq(@s.boundaries.height_for(i))
|
125
|
-
end
|
88
|
+
specify '#crop_image returns #stage_image' do
|
89
|
+
expect(s.crop_image).to eq(s.stage_image)
|
126
90
|
end
|
127
|
-
end
|
128
91
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
@offset_boundaries = @s.boundaries.offset(@s.stage_boundary)
|
134
|
-
wtf = 0
|
135
|
-
}
|
136
|
-
|
137
|
-
specify "offset and size should match internal found areas " do
|
138
|
-
sbx = @s.stage_boundary.x_for(0)
|
139
|
-
sby = @s.stage_boundary.y_for(0)
|
140
|
-
|
141
|
-
sl = @s.boundaries.coordinates.length # may be convenient to clone this model for other than 4 boundaries found
|
142
|
-
expect(sl).to eq(4) #for offset cross pattern and valid image
|
143
|
-
expect(@s.boundaries.complete).to be(true)
|
144
|
-
expect(@offset_boundaries.complete).to be(true)
|
145
|
-
(0..sl - 1).each do |i|
|
146
|
-
# check all the x/y
|
147
|
-
expect(@offset_boundaries.x_for(i)).to eq(@s.boundaries.x_for(i) + sbx)
|
148
|
-
expect(@offset_boundaries.y_for(i)).to eq(@s.boundaries.y_for(i) + sby)
|
149
|
-
|
150
|
-
# check all width/heights
|
151
|
-
expect(@offset_boundaries.width_for(i)).to eq(@s.boundaries.width_for(i))
|
152
|
-
expect(@offset_boundaries.height_for(i)).to eq(@s.boundaries.height_for(i))
|
92
|
+
context '#result' do
|
93
|
+
let(:r) { s.result }
|
94
|
+
specify 'returns a Sqed::Result' do
|
95
|
+
expect(r.class.name).to eq('Sqed::Result')
|
153
96
|
end
|
154
|
-
end
|
155
97
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
poc = Sqed::Parser::OcrParser.new(bc.extract_image(@offset_boundaries.coordinates[3]).crop(400, 140, 1420, 600, true))
|
161
|
-
# expect(poc.text).to eq('000085067')
|
162
|
-
ppc = Sqed::Parser::OcrParser.new(ImageHelpers.black_stage_green_line_specimen_label)
|
163
|
-
poc.image.write('tmp/poc.jpg')
|
164
|
-
ppc.image.write('tmp/ppc.jpg')
|
165
|
-
expect(ppc.text).to eq(poc.text)
|
166
|
-
end
|
98
|
+
context 'extracted data' do
|
99
|
+
specify 'for an :identifier section' do
|
100
|
+
expect(r.text_for(:identifier)).to match('000041196')
|
101
|
+
end
|
167
102
|
|
168
|
-
|
103
|
+
specify 'for a specimen section' do
|
104
|
+
expect(r.text_for(:specimen)).to match('Saucier Creek')
|
105
|
+
end
|
169
106
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
@s.crop_image
|
174
|
-
@offset_boundaries = @s.boundaries.offset(@s.stage_boundary)
|
175
|
-
wtf = 0
|
176
|
-
}
|
177
|
-
|
178
|
-
specify "offset and size should match internal found areas " do
|
179
|
-
sbx = @s.stage_boundary.x_for(0) # only a single boundary
|
180
|
-
sby = @s.stage_boundary.y_for(0)
|
181
|
-
pct = 0.02
|
182
|
-
|
183
|
-
sl = @s.boundaries.coordinates.length # may be convenient to clone this model for other than 4 boundaries found
|
184
|
-
expect(sl).to eq(3) #for offset cross pattern and valid image
|
185
|
-
expect(@s.boundaries.complete).to be(true)
|
186
|
-
expect(@offset_boundaries.complete).to be(true)
|
187
|
-
expect(@s.stage_boundary.width_for(0)).to be_within(pct*800).of(800)
|
188
|
-
expect(@s.stage_boundary.height_for(0)).to be_within(pct*600).of(600)
|
189
|
-
(0..sl - 1).each do |i|
|
190
|
-
# check all the x/y
|
191
|
-
expect(@offset_boundaries.x_for(i)).to eq(@s.boundaries.x_for(i) + sbx)
|
192
|
-
expect(@offset_boundaries.y_for(i)).to eq(@s.boundaries.y_for(i) + sby)
|
193
|
-
|
194
|
-
# check all width/heights
|
195
|
-
expect(@offset_boundaries.width_for(i)).to eq(@s.boundaries.width_for(i))
|
196
|
-
expect(@offset_boundaries.height_for(i)).to eq(@s.boundaries.height_for(i))
|
107
|
+
specify 'for a curator_metadata section' do
|
108
|
+
expect(r.text_for(:curator_metadata)).to match('Frost Entomological Museum')
|
109
|
+
end
|
197
110
|
end
|
198
111
|
end
|
199
112
|
end
|
113
|
+
|
200
114
|
end
|
Binary file
|
Binary file
|
File without changes
|
Binary file
|
Binary file
|
Binary file
|
File without changes
|
File without changes
|
data/spec/support/files/{CrossyBlackLinesSpecimen.jpg → stage_images/CrossyBlackLinesSpecimen.jpg}
RENAMED
File without changes
|
data/spec/support/files/{CrossyGreenLinesSpecimen.jpg → stage_images/CrossyGreenLinesSpecimen.jpg}
RENAMED
File without changes
|
File without changes
|
File without changes
|
data/spec/support/files/{boundary_left_t_yellow.jpg → stage_images/boundary_left_t_yellow.jpg}
RENAMED
File without changes
|
data/spec/support/files/{boundary_offset_cross_red.jpg → stage_images/boundary_offset_cross_red.jpg}
RENAMED
File without changes
|
data/spec/support/files/{boundary_right_t_green.jpg → stage_images/boundary_right_t_green.jpg}
RENAMED
File without changes
|
Binary file
|
File without changes
|
Binary file
|