sqed 0.0.4 → 0.1.0
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.
- 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
|