From d4ba4ccaaed211ed46ebc0f6053145f7badc973b Mon Sep 17 00:00:00 2001 From: Christoph Oberhofer Date: Sun, 17 May 2015 23:39:48 +0200 Subject: [PATCH] Updated test-runner; Added integration-tests for EAN; Fixed error-measure for EAN --- dist/quagga.js | 14 +++--- karma.conf.js | 14 +++++- package.json | 4 +- spec/camera_access.spec.js | 3 ++ spec/ean_integration.spec.js | 82 ++++++++++++++++++++++++++++++++++++ src/barcode_reader.js | 2 +- src/bresenham.js | 4 +- src/ean_reader.js | 8 ++-- test-main.js | 26 +++++++++++- 9 files changed, 142 insertions(+), 15 deletions(-) create mode 100644 spec/ean_integration.spec.js diff --git a/dist/quagga.js b/dist/quagga.js index 5e1fd8b..f7cbce1 100644 --- a/dist/quagga.js +++ b/dist/quagga.js @@ -463,7 +463,7 @@ define( error = 0, singleError = 0, modulo = this.MODULO, - maxSingleError = 0.9; + maxSingleError = this.SINGLE_CODE_ERROR || 0.9; for (i = 0; i < counter.length; i++) { singleError = Math.abs(code[i] - counter[i]); @@ -1121,7 +1121,9 @@ define( [3, 1, 2, 1], [2, 1, 1, 3] ]}, - CODE_FREQUENCY : {value: [0, 11, 13, 14, 19, 25, 28, 21, 22, 26]} + CODE_FREQUENCY : {value: [0, 11, 13, 14, 19, 25, 28, 21, 22, 26]}, + SINGLE_CODE_ERROR: {value: 1}, + AVG_CODE_ERROR: {value: 0.5} }; EANReader.prototype = Object.create(BarcodeReader.prototype, properties); @@ -1162,7 +1164,7 @@ define( } } bestMatch.end = i; - if (bestMatch.error > 0.5) { + if (bestMatch.error > self.AVG_CODE_ERROR) { return null; } return bestMatch; @@ -1205,7 +1207,7 @@ define( } if ( epsilon === undefined) { - epsilon = 0.5; + epsilon = self.AVG_CODE_ERROR; } for ( i = 0; i < pattern.length; i++) { @@ -6604,9 +6606,9 @@ define('bresenham',["cv_utils", "image_wrapper"], function(CVUtils, ImageWrapper // iterate over extrema and convert to binary based on avg between minmax for ( i = 1; i < extrema.length - 1; i++) { if (extrema[i + 1].val > extrema[i].val) { - threshold = (extrema[i].val + (extrema[i + 1].val - extrema[i].val) / 2) | 0; + threshold = (extrema[i].val + ((extrema[i + 1].val - extrema[i].val) / 3) * 2) | 0; } else { - threshold = (extrema[i + 1].val + (extrema[i].val - extrema[i + 1].val) / 2) | 0; + threshold = (extrema[i + 1].val + ((extrema[i].val - extrema[i + 1].val) / 3)) | 0; } for ( j = extrema[i].pos; j < extrema[i + 1].pos; j++) { diff --git a/karma.conf.js b/karma.conf.js index 012a59a..915c56d 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -6,20 +6,32 @@ module.exports = function(config) { 'test-main.js', 'src/vendor/glMatrix.js', 'src/typedefs.js', + {pattern: 'node_modules/async/lib/async.js', included: false}, {pattern: 'src/*.js', included: false}, {pattern: 'spec/**/*.js', included: false}, + {pattern: 'test/**/*.*', included: false} ], exclude: [ ], preprocessors: { 'src/*.js': ['coverage'] }, + plugins: [ + 'karma-chrome-launcher', + 'karma-coverage', + 'karma-mocha', + 'karma-requirejs', + 'karma-chai', + 'karma-sinon', + 'karma-sinon-chai', + 'karma-phantomjs-launcher' + ], reporters: ['progress', 'coverage'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: true, - browsers: ['PhantomJS'], + browsers: ['Chrome'], singleRun: false, coverageReporter: { type : 'html', diff --git a/package.json b/package.json index 57525d8..ba2f5e7 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "An advanced barcode-scanner written in JavaScript", "main": "dist/quagga.js", "devDependencies": { + "async": "^0.9.0", "grunt": "~0.4.5", "grunt-contrib-jshint": "~0.10.0", "grunt-contrib-nodeunit": "~0.4.1", @@ -12,7 +13,8 @@ "grunt-requirejs": "^0.4.2", "karma": "latest", "karma-chai": "latest", - "karma-coverage": "^0.2.7", + "karma-chrome-launcher": "^0.1.12", + "karma-coverage": "^0.3.1", "karma-mocha": "latest", "karma-phantomjs-launcher": "^0.1.4", "karma-requirejs": "^0.2.2", diff --git a/spec/camera_access.spec.js b/spec/camera_access.spec.js index 2254c4b..a47a711 100644 --- a/spec/camera_access.spec.js +++ b/spec/camera_access.spec.js @@ -31,6 +31,9 @@ define(['camera_access'], function(CameraAccess){ src: null, addEventListener: function() { + }, + removeEventListener: function() { + }, play: function() { diff --git a/spec/ean_integration.spec.js b/spec/ean_integration.spec.js new file mode 100644 index 0000000..e4026b0 --- /dev/null +++ b/spec/ean_integration.spec.js @@ -0,0 +1,82 @@ + + +define(['quagga', 'async'], function(Quagga, async) { + describe('decodeSingle', function () { + var config; + + this.timeout(10000); + + beforeEach(function () { + config = { + inputStream: { + size: 640 + }, + locator: { + patchSize: "medium", + halfSample: true + }, + numOfWorkers: 0, + decoder: { + readers: ["ean_reader"] + }, + locate: true, + src: null + }; + }); + + var folder = "base/test/fixtures/ean/", + testSet = [{ + "name": "image-001.jpg", + "result": "3574660239843" + }, + { + "name": "image-002.jpg", + "result": "8032754490297" + }, + { + "name": "image-003.jpg", + "result": "4006209700068" + }, + { + "name": "image-004.jpg", + "result": "9002233139084" + }, + { + "name": "image-005.jpg", + "result": "8004030044005" + }, + { + "name": "image-006.jpg", + "result": "4003626011159" + }, + { + "name": "image-007.jpg", + "result": "2111220009686" + }, + { + "name": "image-008.jpg", + "result": "9000275609022" + }, + { + "name": "image-009.jpg", + "result": "9004593978587" + }, + { + "name": "image-010.jpg", + "result": "9002244845578" + } + ]; + + async.each(testSet, function (sample, callback) { + it('should decode ' + sample.name + " correctly", function(done) { + config.src = folder + sample.name; + Quagga.decodeSingle(config, function (result) {}); + Quagga.onProcessed(function(result) { + expect(result.codeResult.code).to.equal(sample.result); + done(); + callback(); + }); + }); + }, function() {}); + }); +}); \ No newline at end of file diff --git a/src/barcode_reader.js b/src/barcode_reader.js index c668410..1e13067 100644 --- a/src/barcode_reader.js +++ b/src/barcode_reader.js @@ -29,7 +29,7 @@ define( error = 0, singleError = 0, modulo = this.MODULO, - maxSingleError = 0.9; + maxSingleError = this.SINGLE_CODE_ERROR || 0.9; for (i = 0; i < counter.length; i++) { singleError = Math.abs(code[i] - counter[i]); diff --git a/src/bresenham.js b/src/bresenham.js index dec9cf4..b9a789c 100644 --- a/src/bresenham.js +++ b/src/bresenham.js @@ -162,9 +162,9 @@ define(["cv_utils", "image_wrapper"], function(CVUtils, ImageWrapper) { // iterate over extrema and convert to binary based on avg between minmax for ( i = 1; i < extrema.length - 1; i++) { if (extrema[i + 1].val > extrema[i].val) { - threshold = (extrema[i].val + (extrema[i + 1].val - extrema[i].val) / 2) | 0; + threshold = (extrema[i].val + ((extrema[i + 1].val - extrema[i].val) / 3) * 2) | 0; } else { - threshold = (extrema[i + 1].val + (extrema[i].val - extrema[i + 1].val) / 2) | 0; + threshold = (extrema[i + 1].val + ((extrema[i].val - extrema[i + 1].val) / 3)) | 0; } for ( j = extrema[i].pos; j < extrema[i + 1].pos; j++) { diff --git a/src/ean_reader.js b/src/ean_reader.js index d957fb9..c211805 100644 --- a/src/ean_reader.js +++ b/src/ean_reader.js @@ -41,7 +41,9 @@ define( [3, 1, 2, 1], [2, 1, 1, 3] ]}, - CODE_FREQUENCY : {value: [0, 11, 13, 14, 19, 25, 28, 21, 22, 26]} + CODE_FREQUENCY : {value: [0, 11, 13, 14, 19, 25, 28, 21, 22, 26]}, + SINGLE_CODE_ERROR: {value: 1}, + AVG_CODE_ERROR: {value: 0.5} }; EANReader.prototype = Object.create(BarcodeReader.prototype, properties); @@ -82,7 +84,7 @@ define( } } bestMatch.end = i; - if (bestMatch.error > 0.5) { + if (bestMatch.error > self.AVG_CODE_ERROR) { return null; } return bestMatch; @@ -125,7 +127,7 @@ define( } if ( epsilon === undefined) { - epsilon = 0.5; + epsilon = self.AVG_CODE_ERROR; } for ( i = 0; i < pattern.length; i++) { diff --git a/test-main.js b/test-main.js index 79cd514..c9da393 100644 --- a/test-main.js +++ b/test-main.js @@ -22,7 +22,31 @@ require.config({ 'cluster': 'src/cluster', 'camera_access': 'src/camera_access', 'events': 'src/events', - 'html_utils': 'src/html_utils' + 'html_utils': 'src/html_utils', + 'quagga': 'src/quagga', + 'barcode_decoder': 'src/barcode_decoder', + 'barcode_locator': 'src/barcode_locator', + 'barcode_reader': 'src/barcode_reader', + 'bresenham': 'src/bresenham', + 'codabar_reader': 'src/codabar_reader', + 'code_39_reader': 'src/code_39_reader', + 'code_39_vin_reader': 'src/code_39_vin_reader', + 'code_128_reader': 'src/code_128_reader', + 'config': 'src/config', + 'ean_8_reader': 'src/ean_8_reader', + 'ean_reader': 'src/ean_reader', + 'frame_grabber': 'src/frame_grabber', + 'image_debug': 'src/image_debug', + 'image_loader': 'src/image_loader', + 'image_wrapper': 'src/image_wrapper', + 'input_stream': 'src/input_stream', + 'rasterizer': 'src/rasterizer', + 'skeletonizer': 'src/skeletonizer', + 'subImage': 'src/subImage', + 'tracer': 'src/tracer', + 'upc_e_reader': 'src/upc_e_reader', + 'upc_reader': 'src/upc_reader', + 'async': 'node_modules/async/lib/async' }, deps: allTestFiles, callback: window.__karma__.start