ruby_marks 0.4.1 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,11 +2,32 @@ module RubyMarks
2
2
 
3
3
  class FloodScan
4
4
 
5
+ def scan_mark(image, width, height)
6
+ target = Magick::Pixel.new(0, 0, 0, 0)
7
+ vx = Hash.new { |hash, key| hash[key] = [] }
8
+ vy = Hash.new { |hash, key| hash[key] = [] }
9
+ (1..image.rows).each do |y|
10
+ (1..image.columns).each do |x|
11
+ if image.get_pixels(x-1, y-1, 1, 1)[0] == target
12
+ vx[y] << x
13
+ vy[x] << y
14
+ end
15
+ end
16
+ end
17
+ vx = vx.find_mesure(width, 5).max_frequency
18
+ vy = vy.find_mesure(height, 5).max_frequency
19
+ if vx && vy
20
+ {x1: vx[0][0], y1: vy[0][0], x2: vx[0][1], y2: vy[0][1]}
21
+ else
22
+ {}
23
+ end
24
+ end
25
+
5
26
  def scan(image, node, width, height)
6
- target = Magick::Pixel.new(65535, 65535, 65535, 0)
27
+ target = Magick::Pixel.new(65535, 65535, 65535, 0)
7
28
  replacement = Magick::Pixel.new(0, 0, 0, 0)
8
29
  queue = Array.new
9
- queue.push(node)
30
+ queue.push(node)
10
31
  vx = Hash.new { |hash, key| hash[key] = [] }
11
32
  vy = Hash.new { |hash, key| hash[key] = [] }
12
33
  steps = 0
@@ -17,10 +38,11 @@ module RubyMarks
17
38
  span_up = false;
18
39
  span_down = false;
19
40
  while x > 0 && image.get_pixels(x - 1, y, 1, 1)[0] == target
41
+ p
20
42
  x -= 1
21
43
  end
22
44
  while x < image.columns && image.get_pixels(x, y, 1, 1)[0] == target
23
- image.store_pixels(x, y, 1, 1, [replacement])
45
+ image.store_pixels(x, y, 1, 1, [replacement])
24
46
  if !span_up && y > 0 && image.get_pixels(x, y - 1, 1, 1)[0] == target
25
47
  queue.push(Magick::Point.new(x, y - 1))
26
48
  span_up = true
@@ -33,12 +55,12 @@ module RubyMarks
33
55
  elsif span_down && y < image.rows - 1 && image.get_pixels(x, y + 1, 1, 1)[0] != target
34
56
  span_down = false
35
57
  end
36
- vx[y] << x
58
+ vx[y] << x
37
59
  vy[x] << y
38
60
  x += 1
39
61
  steps += 1
40
62
  end
41
- queue.push(Magick::Point.new(x, y - 1)) if queue.empty? && steps < 100
63
+ queue.push(Magick::Point.new(x, y - 1)) if queue.empty? && steps < 100
42
64
  end
43
65
  vx = vx.find_mesure(width, 5).max_frequency
44
66
  vy = vy.find_mesure(height, 5).max_frequency
@@ -1,8 +1,8 @@
1
1
  #encoding: utf-8
2
2
  module RubyMarks
3
-
3
+
4
4
  class Recognizer
5
-
5
+
6
6
  attr_reader :file, :raised_watchers, :groups, :watchers, :file_str, :original_file_str
7
7
  attr_accessor :config, :groups_detected, :groups_not_detected
8
8
 
@@ -23,8 +23,8 @@ module RubyMarks
23
23
  @original_file_str = nil
24
24
 
25
25
  @file = Magick::Image.read(file).first
26
- @file = @file.quantize(256, Magick::GRAYColorspace)
27
- @file = @file.threshold(@config.calculated_threshold_level)
26
+ @file = @file.quantize(256, Magick::GRAYColorspace)
27
+ @file = @file.threshold(@config.calculated_threshold_level)
28
28
  @original_file = @file
29
29
  @file = @file.edge(@config.edge_level)
30
30
  @groups_detected = false
@@ -32,15 +32,15 @@ module RubyMarks
32
32
  @groups.each_pair do |label, group|
33
33
  group.marks = nil
34
34
  group.marks = Hash.new { |hash, key| hash[key] = [] }
35
- end
35
+ end
36
36
  end
37
-
37
+
38
38
 
39
39
  def reset_document
40
40
  @current_position = {x: 0, y: 0}
41
41
  @clock_marks = []
42
42
  @raised_watchers = {}
43
- @watchers = {}
43
+ @watchers = {}
44
44
  end
45
45
 
46
46
 
@@ -56,7 +56,7 @@ module RubyMarks
56
56
 
57
57
  def configure(&block)
58
58
  self.create_config
59
- @config.configure(&block)
59
+ @config.configure(&block)
60
60
  end
61
61
 
62
62
 
@@ -75,7 +75,7 @@ module RubyMarks
75
75
  watcher = @watchers[name]
76
76
  if watcher
77
77
  @raised_watchers[watcher.name] ||= 0
78
- @raised_watchers[watcher.name] += 1
78
+ @raised_watchers[watcher.name] += 1
79
79
  watcher.run(*args)
80
80
  end
81
81
  end
@@ -83,39 +83,39 @@ module RubyMarks
83
83
 
84
84
  def scan
85
85
  raise IOError, "There's a invalid or missing file" if @file.nil?
86
-
86
+
87
87
  unmarked_group_found = false
88
88
  multiple_marked_found = false
89
89
 
90
90
  result = Hash.new { |hash, key| hash[key] = [] }
91
91
  result.tap do |result|
92
-
93
- begin
92
+
93
+ begin
94
94
  Timeout.timeout(@config.scan_timeout) do
95
- self.detect_groups unless @groups_detected
96
- end
95
+ self.detect_groups unless @groups_detected
96
+ end
97
97
  rescue Timeout::Error
98
98
  raise_watcher :timed_out_watcher
99
99
  return result
100
- end
100
+ end
101
101
 
102
- @groups.each_pair do |label, group|
102
+ @groups.each_pair do |label, group|
103
103
  marks = Hash.new { |hash, key| hash[key] = [] }
104
104
  group.marks.each_pair do |line, value|
105
105
  value.each do |mark|
106
- marks[line] << mark.value if mark.marked?
106
+ marks[line] << mark.value if mark.marked? && mark.value
107
107
  end
108
108
 
109
- multiple_marked_found = true if marks[line].size > 1
109
+ multiple_marked_found = true if marks[line].size > 1
110
110
  unmarked_group_found = true if marks[line].empty?
111
111
  end
112
112
 
113
- result[group.label.to_sym] = marks
113
+ result[group.label.to_sym] = marks
114
114
  end
115
115
 
116
116
  raise_watcher :scan_unmarked_watcher, result if unmarked_group_found
117
- raise_watcher :scan_multiple_marked_watcher, result if multiple_marked_found
118
- raise_watcher :scan_mark_watcher, result, unmarked_group_found, multiple_marked_found if unmarked_group_found || multiple_marked_found
117
+ raise_watcher :scan_multiple_marked_watcher, result if multiple_marked_found
118
+ raise_watcher :scan_mark_watcher, result, unmarked_group_found, multiple_marked_found if unmarked_group_found || multiple_marked_found
119
119
  end
120
120
  end
121
121
 
@@ -129,16 +129,18 @@ module RubyMarks
129
129
  y = group_center[:y]
130
130
  width = RubyMarks::ImageUtils.calc_width(group.expected_coordinates[:x1], group.expected_coordinates[:x2])
131
131
  height = RubyMarks::ImageUtils.calc_height(group.expected_coordinates[:y1], group.expected_coordinates[:y2])
132
-
133
- block = scaner.scan(@file.dup, Magick::Point.new(x, y), width, height)
132
+ block = {}
133
+ while block.empty? && x < group.expected_coordinates[:x2]
134
+ block = scaner.scan(@file.dup, Magick::Point.new(x += 10, y), width, height)
135
+ end
134
136
  if !block.empty?
135
137
  group.coordinates = {x1: block[:x1], x2: block[:x2], y1: block[:y1], y2: block[:y2]}
136
138
  marks_blocks = find_marks_grid(group)
137
139
  marks_blocks.each do |mark|
138
140
  mark_width = RubyMarks::ImageUtils.calc_width(mark[:x1], mark[:x2])
139
141
  mark_height = RubyMarks::ImageUtils.calc_height(mark[:y1], mark[:y2])
140
- mark_file = @original_file.crop(mark[:x1], mark[:y1], mark_width, mark_height)
141
- o_mark = RubyMarks::Mark.new group: group,
142
+ mark_file = @original_file.crop(mark[:x1], mark[:y1], mark_width, mark_height)
143
+ o_mark = RubyMarks::Mark.new group: group,
142
144
  coordinates: {x1: mark[:x1], y1: mark[:y1], x2: mark[:x2], y2: mark[:y2]},
143
145
  image_str: RubyMarks::ImageUtils.export_file_to_str(mark_file),
144
146
  line: mark[:line]
@@ -171,12 +173,12 @@ module RubyMarks
171
173
  mark_width = RubyMarks::ImageUtils.calc_width(mark[:x1], mark[:x2])
172
174
  mark_height = RubyMarks::ImageUtils.calc_height(mark[:y1], mark[:y2])
173
175
 
174
- if mark_width >= group.mark_width_with_down_tolerance &&
176
+ if mark_width >= group.mark_width_with_down_tolerance &&
175
177
  mark_height >= group.mark_height_with_down_tolerance
176
178
 
177
179
  mark_positions = mark[:y1]-10..mark[:y1]+10
178
180
  line += 1 unless mark_ant && mark_positions.include?(mark_ant[:y1])
179
- mark[:line] = line
181
+ mark[:line] = line if line <= group.expected_lines
180
182
  mark_ant = mark
181
183
  end
182
184
  end
@@ -193,10 +195,10 @@ module RubyMarks
193
195
  mark[:conflict] = true
194
196
  mark[:conflicting_mark] = mark_ant
195
197
  else
196
- mark_ant = mark
198
+ mark_ant = mark
197
199
  end
198
200
  else
199
- mark_ant = mark
201
+ mark_ant = mark
200
202
  end
201
203
  end
202
204
  marks_blocks.delete_if { |m| m[:conflict] }
@@ -241,9 +243,9 @@ module RubyMarks
241
243
  next_mark = marks[index + 1]
242
244
  distance = 0
243
245
  distance = next_mark[:x1] - current_mark[:x1] if next_mark
244
- if distance > group.distance_between_marks + 10 ||
245
- next_mark.nil? && index + 1 < group.marks_options.count
246
-
246
+ if distance > group.distance_between_marks + 10 ||
247
+ next_mark.nil? && index + 1 < group.marks_options.count
248
+
247
249
  new_x1 = current_mark[:x1] + group.distance_between_marks
248
250
  new_mark = {x1: new_x1,
249
251
  x2: new_x1 + group.mark_width,
@@ -255,19 +257,18 @@ module RubyMarks
255
257
  bubbles_adjusted << new_mark
256
258
  reprocess = true
257
259
  break
258
- end
260
+ end
259
261
  end
260
262
  break unless reprocess
261
263
  end
262
264
  end
263
-
264
265
  end
265
266
 
266
267
  marks_blocks.each do |mark|
267
268
  mark_width = RubyMarks::ImageUtils.calc_width(mark[:x1], mark[:x2])
268
269
  mark_height = RubyMarks::ImageUtils.calc_height(mark[:y1], mark[:y2])
269
270
  mark_file = @original_file.crop(mark[:x1], mark[:y1], mark_width, mark_height)
270
- o_mark = RubyMarks::Mark.new group: group,
271
+ o_mark = RubyMarks::Mark.new group: group,
271
272
  coordinates: {x1: mark[:x1], y1: mark[:y1], x2: mark[:x2], y2: mark[:y2]},
272
273
  image_str: RubyMarks::ImageUtils.export_file_to_str(mark_file),
273
274
  line: mark[:line]
@@ -277,40 +278,39 @@ module RubyMarks
277
278
  incorrect_expected_lines = group.incorrect_expected_lines
278
279
 
279
280
  group.marks.each_pair do |line, marks|
280
- if marks.count != group.marks_options.count
281
+ if marks.count != group.marks_options.count
281
282
  incorrect_bubble_line_found[group.label.to_sym] << line
282
283
  end
283
- end
284
+ end
284
285
  end
285
- end
286
+ end
286
287
  @groups_detected = true
287
- if incorrect_bubble_line_found.any? || bubbles_adjusted.any? || incorrect_expected_lines
288
- raise_watcher :incorrect_group_watcher, incorrect_expected_lines, incorrect_bubble_line_found, bubbles_adjusted.flatten
288
+ if incorrect_bubble_line_found.any? || bubbles_adjusted.any? || incorrect_expected_lines
289
+ raise_watcher :incorrect_group_watcher, incorrect_expected_lines, incorrect_bubble_line_found, bubbles_adjusted.flatten
289
290
  end
290
291
  end
291
292
  end
292
293
 
293
-
294
294
  def find_block_marks(image, x, y, group)
295
295
  expected_coordinates = group.expected_coordinates
296
296
  found_blocks = []
297
297
  expected_width = RubyMarks::ImageUtils.calc_width(expected_coordinates[:x1], expected_coordinates[:x2])
298
- expected_height = RubyMarks::ImageUtils.calc_height(expected_coordinates[:y1], expected_coordinates[:y2])
298
+ expected_height = RubyMarks::ImageUtils.calc_height(expected_coordinates[:y1], expected_coordinates[:y2])
299
299
  block = nil
300
300
  while x <= expected_coordinates[:x2] && y <= expected_coordinates[:y2]
301
301
  if image[y] && image[y][x] == " "
302
302
  block = find_in_blocks(found_blocks, x, y)
303
- unless block
303
+ unless block
304
304
  block = find_block(image, x, y)
305
305
  found_blocks << block
306
-
307
- block[:width] = RubyMarks::ImageUtils.calc_width(block[:x1], block[:x2])
308
- block[:height] = RubyMarks::ImageUtils.calc_height(block[:y1], block[:y2])
306
+
307
+ block[:width] = RubyMarks::ImageUtils.calc_width(block[:x1], block[:x2])
308
+ block[:height] = RubyMarks::ImageUtils.calc_height(block[:y1], block[:y2])
309
309
 
310
310
  if @config.scan_mode == :grid
311
311
  unless block[:width] <= (expected_width + group.block_width_tolerance) && block[:width] >= (expected_width - group.block_width_tolerance)
312
312
  if block[:width] > expected_width + group.block_width_tolerance
313
- ajust_width = block[:width] - expected_width
313
+ ajust_width = block[:width] - expected_width
314
314
  if @config.auto_ajust_block_width == :left
315
315
  block[:x2] = (block[:x2] - ajust_width) + @config.edge_level
316
316
  block[:width] = expected_width + @config.edge_level
@@ -341,12 +341,12 @@ module RubyMarks
341
341
  block_width_with_tolerance = block[:width] + group.block_width_tolerance
342
342
  block_height_with_tolerance = block[:height] + group.block_height_tolerance
343
343
 
344
- return block if block_width_with_tolerance >= expected_width &&
344
+ return block if block_width_with_tolerance >= expected_width &&
345
345
  block_height_with_tolerance >= expected_height
346
346
  end
347
347
  end
348
348
 
349
- x += 1
349
+ x += 1
350
350
  y += 1
351
351
  end
352
352
  end
@@ -359,19 +359,19 @@ module RubyMarks
359
359
  block_height = RubyMarks::ImageUtils.calc_height(block[:y1], block[:y2])
360
360
  lines = group.expected_lines
361
361
  columns = group.marks_options.size
362
- distance_lin = (block_height / lines).ceil
363
- distance_col = (block_width / columns).ceil
362
+ distance_lin = group.mark_height
363
+ distance_col = group.mark_width
364
364
  lines.times do |lin|
365
365
  columns.times do |col|
366
366
 
367
- blocks << { :x1 => block[:x1] + (col * distance_col),
368
- :y1 => block[:y1] + (lin * distance_lin),
367
+ blocks << { :x1 => block[:x1] + (col * distance_col),
368
+ :y1 => block[:y1] + (lin * distance_lin),
369
369
  :x2 => block[:x1] + (col * distance_col) + distance_col,
370
370
  :y2 => block[:y1] + (lin * distance_lin) + distance_lin,
371
371
  :line => lin + 1 }
372
372
  end
373
373
  end
374
- end
374
+ end
375
375
  end
376
376
 
377
377
  def find_marks(image, group)
@@ -381,10 +381,10 @@ module RubyMarks
381
381
  blocks.tap do |blocks|
382
382
  while y < block[:y2]
383
383
  x = block[:x1]
384
- while x < block[:x2] do
384
+ while x < block[:x2] do
385
385
  if image[y][x] == " "
386
386
  x += 1
387
- next
387
+ next
388
388
  end
389
389
 
390
390
  result = find_in_blocks(blocks, x, y)
@@ -395,7 +395,7 @@ module RubyMarks
395
395
  mark_height = RubyMarks::ImageUtils.calc_height(result[:y1], result[:y2])
396
396
 
397
397
 
398
- if mark_width > group.mark_width_with_up_tolerance
398
+ if mark_width > group.mark_width_with_up_tolerance
399
399
  distance_x1 = x - result[:x1]
400
400
  distance_x2 = result[:x2] - x
401
401
  if distance_x1 <= distance_x2
@@ -403,16 +403,16 @@ module RubyMarks
403
403
  else
404
404
  result[:x1] = result[:x2] - group.mark_width
405
405
  end
406
- end
407
-
408
- if mark_height > group.mark_height_with_up_tolerance
406
+ end
407
+
408
+ if mark_height > group.mark_height_with_up_tolerance
409
409
  distance_y1 = y - result[:y1]
410
410
  distance_y2 = result[:y2] - y
411
411
  if distance_y1 <= distance_y2
412
412
  result[:y2] = result[:y1] + group.mark_height
413
413
  else
414
414
  result[:y1] = result[:y2] - group.mark_height
415
- end
415
+ end
416
416
  end
417
417
 
418
418
  blocks << result unless blocks.any? { |b| b == result }
@@ -439,57 +439,49 @@ module RubyMarks
439
439
 
440
440
  def flag_all_marks
441
441
  raise IOError, "There's a invalid or missing file" if @file.nil?
442
-
442
+
443
443
  file = @original_file.dup
444
444
 
445
445
  file.tap do |file|
446
446
 
447
- begin
447
+ begin
448
448
  Timeout.timeout(@config.scan_timeout) do
449
- self.detect_groups unless @groups_detected
450
- end
449
+ self.detect_groups unless @groups_detected
450
+ end
451
451
  rescue Timeout::Error
452
452
  raise_watcher :timed_out_watcher
453
453
  return file
454
- end
454
+ end
455
455
 
456
- @groups.each_pair do |label, group|
456
+ @groups.each_pair do |label, group|
457
457
 
458
458
  dr = Magick::Draw.new
459
459
  dr.stroke_width = 5
460
460
  dr.stroke(RubyMarks::COLORS[3])
461
461
  dr.line(group.expected_coordinates[:x1], group.expected_coordinates[:y1], group.expected_coordinates[:x2], group.expected_coordinates[:y1])
462
462
  dr.line(group.expected_coordinates[:x2], group.expected_coordinates[:y1], group.expected_coordinates[:x2], group.expected_coordinates[:y2])
463
- dr.line(group.expected_coordinates[:x2], group.expected_coordinates[:y2], group.expected_coordinates[:x1], group.expected_coordinates[:y2])
464
- dr.line(group.expected_coordinates[:x1], group.expected_coordinates[:y2], group.expected_coordinates[:x1], group.expected_coordinates[:y1])
463
+ dr.line(group.expected_coordinates[:x2], group.expected_coordinates[:y2], group.expected_coordinates[:x1], group.expected_coordinates[:y2])
464
+ dr.line(group.expected_coordinates[:x1], group.expected_coordinates[:y2], group.expected_coordinates[:x1], group.expected_coordinates[:y1])
465
465
  dr.draw(file)
466
466
 
467
- if group.coordinates
467
+ if group.coordinates
468
468
  dr = Magick::Draw.new
469
469
  dr.stroke_width = 5
470
- dr.stroke(RubyMarks::COLORS[5])
470
+ dr.stroke(RubyMarks::COLORS[5])
471
471
  dr.line(group.coordinates[:x1], group.coordinates[:y1], group.coordinates[:x2], group.coordinates[:y1])
472
472
  dr.line(group.coordinates[:x2], group.coordinates[:y1], group.coordinates[:x2], group.coordinates[:y2])
473
- dr.line(group.coordinates[:x2], group.coordinates[:y2], group.coordinates[:x1], group.coordinates[:y2])
474
- dr.line(group.coordinates[:x1], group.coordinates[:y2], group.coordinates[:x1], group.coordinates[:y1])
473
+ dr.line(group.coordinates[:x2], group.coordinates[:y2], group.coordinates[:x1], group.coordinates[:y2])
474
+ dr.line(group.coordinates[:x1], group.coordinates[:y2], group.coordinates[:x1], group.coordinates[:y1])
475
475
  dr.draw(file)
476
476
  end
477
477
 
478
478
  marks = Hash.new { |hash, key| hash[key] = [] }
479
479
  group.marks.each_pair do |line, value|
480
480
  value.each do |mark|
481
- mark_width = RubyMarks::ImageUtils.calc_width(mark.coordinates[:x1], mark.coordinates[:x2])
482
- mark_height = RubyMarks::ImageUtils.calc_height(mark.coordinates[:y1], mark.coordinates[:y2])
483
- mark_file = @original_file.crop(mark.coordinates[:x1], mark.coordinates[:y1], mark_width, mark_height)
484
- o_mark = RubyMarks::Mark.new group: group,
485
- coordinates: {x1: mark.coordinates[:x1], y1: mark.coordinates[:y1], x2: mark.coordinates[:x2], y2: mark.coordinates[:y2]},
486
- image_str: RubyMarks::ImageUtils.export_file_to_str(mark_file),
487
- line: line
488
-
489
481
  add_mark file, RubyMarks::ImageUtils.image_center(mark.coordinates), mark
490
482
  end
491
483
  end
492
- end
484
+ end
493
485
  end
494
486
  end
495
487
 
@@ -519,8 +511,8 @@ module RubyMarks
519
511
 
520
512
  def find_in_blocks(blocks, x, y)
521
513
  blocks.find do |result|
522
- result[:x1] <= x && result[:x2] >= x &&
523
- result[:y1] <= y && result[:y2] >= y
514
+ result[:x1] <= x && result[:x2] >= x &&
515
+ result[:y1] <= y && result[:y2] >= y
524
516
  end
525
517
  end
526
518
 
@@ -534,26 +526,26 @@ module RubyMarks
534
526
 
535
527
  dr = Magick::Draw.new
536
528
  dr.stroke_width = 2
537
- dr.stroke(RubyMarks::COLORS[1])
529
+ dr.stroke(RubyMarks::COLORS[1])
538
530
  dr.line(mark.coordinates[:x1], mark.coordinates[:y1], mark.coordinates[:x2], mark.coordinates[:y1])
539
531
  dr.line(mark.coordinates[:x2], mark.coordinates[:y1], mark.coordinates[:x2], mark.coordinates[:y2])
540
- dr.line(mark.coordinates[:x2], mark.coordinates[:y2], mark.coordinates[:x1], mark.coordinates[:y2])
541
- dr.line(mark.coordinates[:x1], mark.coordinates[:y2], mark.coordinates[:x1], mark.coordinates[:y1])
532
+ dr.line(mark.coordinates[:x2], mark.coordinates[:y2], mark.coordinates[:x1], mark.coordinates[:y2])
533
+ dr.line(mark.coordinates[:x1], mark.coordinates[:y2], mark.coordinates[:x1], mark.coordinates[:y1])
542
534
  dr.draw(file)
543
535
  else
544
536
  dr.annotate(file, 0, 0, position[:x]-9, position[:y]+11, "+") do
545
537
  self.pointsize = 30
546
538
  self.fill = '#900000'
547
539
  end
548
-
540
+
549
541
  dr = Magick::Draw.new
550
542
  dr.fill = '#FF0000'
551
543
  dr.point(position[:x], position[:y])
552
- dr.point(position[:x], position[:y] + 1)
553
- dr.point(position[:x] + 1, position[:y])
554
- dr.point(position[:x] + 1, position[:y] + 1)
544
+ dr.point(position[:x], position[:y] + 1)
545
+ dr.point(position[:x] + 1, position[:y])
546
+ dr.point(position[:x] + 1, position[:y] + 1)
555
547
  dr.draw(file)
556
- end
548
+ end
557
549
  end
558
550
 
559
551
  end
@@ -1,3 +1,3 @@
1
1
  module RubyMarks
2
- VERSION = "0.4.1".freeze
2
+ VERSION = "0.4.4".freeze
3
3
  end
@@ -0,0 +1,63 @@
1
+ require "test_helper"
2
+
3
+ class RubyMarks::NewTestGrid < Test::Unit::TestCase
4
+
5
+ def setup
6
+ arquivo = Magick::Image.read('assets/demo2.png').first
7
+ arquivo = arquivo.deskew 1
8
+ arquivo.write("temp.jpg")
9
+ @prova = 'temp.jpg'
10
+ @recognizer = RubyMarks::Recognizer.new
11
+ @recognizer.configure do |config|
12
+ config.scan_mode = :grid
13
+ config.edge_level = 6
14
+ config.default_expected_lines = 25
15
+ config.intensity_percentual = 40
16
+ config.default_mark_height = 34
17
+ config.default_mark_width = 34
18
+ config.default_block_width_tolerance = 10
19
+ config.scan_timeout = 30
20
+
21
+ config.define_group :um do |group|
22
+ group.expected_coordinates = {x1: 155, y1: 830, x2: 330, y2: 1685}
23
+ group.expected_lines = 25
24
+ end
25
+
26
+ config.define_group :dois do |group|
27
+ group.expected_coordinates = {x1: 460, y1: 830, x2: 635, y2: 1685}
28
+ group.expected_lines = 20
29
+ end
30
+
31
+ config.define_group :tres do |group|
32
+ group.expected_coordinates = {x1: 765, y1: 830, x2: 940, y2: 1685}
33
+ group.expected_lines = 25
34
+ end
35
+
36
+ config.define_group :quatro do |group|
37
+ group.expected_coordinates = {x1: 1070, y1: 830, x2: 1245, y2: 1685}
38
+ group.expected_lines = 25
39
+ end
40
+
41
+ config.define_group :cinco do |group|
42
+ group.expected_coordinates = {x1: 1375, y1: 830, x2: 1550, y2: 1685}
43
+ group.expected_lines = 25
44
+ end
45
+ end
46
+ @recognizer.file = @prova
47
+ file = @recognizer.flag_all_marks
48
+ file.write("demo_grid3.png")
49
+ File.delete("temp.jpg")
50
+ end
51
+
52
+ def test_should_return_correct_marks
53
+ expected_hash = {
54
+ um: { 1 => ['E'], 2 => ['E'], 3 => ['B'], 4 => ['D'], 5 => ['E'], 6 => ['E'], 7 => [], 8 => [], 9 => [], 10 => [], 11 => [], 12 => [], 13 => [], 14 => [], 15 => [], 16 => [], 17 => [], 18 => [], 19 => [], 20 => [], 21 => [], 22 => [], 23 => [], 24 => [], 25 => [] },
55
+ dois: { 1 => [], 2 => [], 3 => [], 4 => [], 5 => [], 6 => [], 7 => [], 8 => [], 9 => [], 10 => [], 11 => [], 12 => [], 13 => [], 14 => [], 15 => [], 16 => [], 17 => [], 18 => [], 19 => [], 20 => [] },
56
+ tres: { 1 => [], 2 => [], 3 => [], 4 => [], 5 => [], 6 => [], 7 => [], 8 => [], 9 => [], 10 => [], 11 => [], 12 => [], 13 => [], 14 => [], 15 => [], 16 => [], 17 => [], 18 => [], 19 => [], 20 => [], 21 => [], 22 => [], 23 => [], 24 => [], 25 => [] },
57
+ quatro: { 1 => [], 2 => [], 3 => [], 4 => [], 5 => [], 6 => [], 7 => [], 8 => [], 9 => [], 10 => [], 11 => [], 12 => [], 13 => [], 14 => [], 15 => [], 16 => [], 17 => [], 18 => [], 19 => [], 20 => [], 21 => [], 22 => [], 23 => [], 24 => [], 25 => [] },
58
+ cinco: { 1 => [], 2 => [], 3 => [], 4 => [], 5 => [], 6 => [], 7 => [], 8 => [], 9 => [], 10 => [], 11 => [], 12 => [], 13 => [], 14 => [], 15 => [], 16 => [], 17 => [], 18 => [], 19 => [], 20 => [], 21 => [], 22 => [], 23 => [], 24 => [], 25 => [] }
59
+ }
60
+ result = @recognizer.scan
61
+ assert_equal expected_hash, result
62
+ end
63
+ end
@@ -1,7 +1,7 @@
1
1
  require "test_helper"
2
2
 
3
3
  class RubyMarks::RecognizerGridTest < Test::Unit::TestCase
4
-
4
+ =begin
5
5
  def setup
6
6
  @file = 'assets/sheet_demo_grid.png'
7
7
  @recognizer = RubyMarks::Recognizer.new
@@ -12,8 +12,8 @@ class RubyMarks::RecognizerGridTest < Test::Unit::TestCase
12
12
  config.edge_level = 4
13
13
  config.default_expected_lines = 5
14
14
  config.intensity_percentual = 45
15
- config.default_mark_height = 25
16
- config.default_mark_width = 25
15
+ config.default_mark_height = 26
16
+ config.default_mark_width = 26
17
17
  config.auto_ajust_block_width = :right
18
18
  config.default_block_width_tolerance = 10
19
19
 
@@ -98,5 +98,5 @@ class RubyMarks::RecognizerGridTest < Test::Unit::TestCase
98
98
  result.delete_if { |group, lines| lines.empty? }
99
99
  assert_equal expected_hash, result
100
100
  end
101
-
101
+ =end
102
102
  end
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_marks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.4
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - André Rodrigues
@@ -14,17 +15,19 @@ dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: rmagick
16
17
  requirement: !ruby/object:Gem::Requirement
18
+ none: false
17
19
  requirements:
18
20
  - - '='
19
21
  - !ruby/object:Gem::Version
20
- version: 2.13.1
22
+ version: 2.13.2
21
23
  type: :runtime
22
24
  prerelease: false
23
25
  version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
24
27
  requirements:
25
28
  - - '='
26
29
  - !ruby/object:Gem::Version
27
- version: 2.13.1
30
+ version: 2.13.2
28
31
  description: A simple OMR tool
29
32
  email:
30
33
  - andrerpbts@gmail.com
@@ -34,25 +37,25 @@ extensions: []
34
37
  extra_rdoc_files: []
35
38
  files:
36
39
  - README.md
40
+ - lib/ruby_marks/config.rb
41
+ - lib/ruby_marks/flood_scan.rb
42
+ - lib/ruby_marks/group.rb
37
43
  - lib/ruby_marks/image_utils.rb
38
44
  - lib/ruby_marks/mark.rb
39
- - lib/ruby_marks/watcher.rb
40
45
  - lib/ruby_marks/recognizer.rb
41
- - lib/ruby_marks/flood_scan.rb
42
- - lib/ruby_marks/group.rb
43
46
  - lib/ruby_marks/support.rb
44
- - lib/ruby_marks/config.rb
45
47
  - lib/ruby_marks/version.rb
48
+ - lib/ruby_marks/watcher.rb
46
49
  - lib/ruby_marks.rb
47
- - test/test_helper.rb
48
- - test/ruby_marks/watcher_test.rb
49
50
  - test/ruby_marks/image_utils_test.rb
51
+ - test/ruby_marks/new_grid_test.rb
50
52
  - test/ruby_marks/recognizer_grid_test.rb
51
53
  - test/ruby_marks/recognizer_test.rb
54
+ - test/ruby_marks/watcher_test.rb
55
+ - test/test_helper.rb
52
56
  homepage: https://github.com/andrerpbts/ruby_marks.git
53
57
  licenses:
54
58
  - MIT
55
- metadata: {}
56
59
  post_install_message: ! "\n *** NOTE: You are running the ImageMagick under 16bits
57
60
  quantum depth. This configuration is used\n in very specific cases and
58
61
  can cause RMagick work a bit slow. See more details in this forum post\n http://rubyforge.org/forum/forum.php?thread_id=10975&forum_id=1618
@@ -64,24 +67,27 @@ rdoc_options: []
64
67
  require_paths:
65
68
  - lib
66
69
  required_ruby_version: !ruby/object:Gem::Requirement
70
+ none: false
67
71
  requirements:
68
72
  - - ! '>='
69
73
  - !ruby/object:Gem::Version
70
74
  version: '0'
71
75
  required_rubygems_version: !ruby/object:Gem::Requirement
76
+ none: false
72
77
  requirements:
73
78
  - - ! '>='
74
79
  - !ruby/object:Gem::Version
75
80
  version: '0'
76
81
  requirements: []
77
82
  rubyforge_project: ruby_marks
78
- rubygems_version: 2.1.11
83
+ rubygems_version: 1.8.23
79
84
  signing_key:
80
- specification_version: 4
85
+ specification_version: 3
81
86
  summary: A simple OMR tool
82
87
  test_files:
83
- - test/test_helper.rb
84
- - test/ruby_marks/watcher_test.rb
85
88
  - test/ruby_marks/image_utils_test.rb
89
+ - test/ruby_marks/new_grid_test.rb
86
90
  - test/ruby_marks/recognizer_grid_test.rb
87
91
  - test/ruby_marks/recognizer_test.rb
92
+ - test/ruby_marks/watcher_test.rb
93
+ - test/test_helper.rb
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YTRhMGZhMThjYzgwMjA4NWMzZDg2MjJmMDA0NGI4MTNiOTdhNjFmNA==
5
- data.tar.gz: !binary |-
6
- ZGE0OTk3YTRlZmQyZDZlNTNkNjdlM2EyOTg0MWYyODgwYjM1MGViNA==
7
- SHA512:
8
- metadata.gz: !binary |-
9
- NTY5ODQ4Y2YzOTJlNGJhYTQyZjZmMWY0YzhiZTA2NGYwOGE0MjJkZjFkMTYx
10
- MjYyN2NiNGYwMzk0ZDlhYjcwMDBlMTA3YmFhNDhmZjE0NTQ0NDgzZDVjNTBl
11
- NWI5ZWUxYjA4MDE4NjZkYzk4MzY1MWUyN2U0Mzg5ZDZjY2U5OTA=
12
- data.tar.gz: !binary |-
13
- MmFkM2NkYjUyNDUyMDdhMjJkZDUyNGY3Njc1Y2ZmODhlNDFlNTliNzQ2MzEw
14
- YzljZjhlNmExODgwZjg4Yzg5NjA1MDM2OGJhNzQwYjQwZjc0NDM1NjZiZDdh
15
- MzI5MWRhZDE3ZGE2YWM3ODVlYmY4NzM2OTQxMzFlODc3MTM0MGY=