Updated test-runner; Added integration-tests for EAN; Fixed error-measure for EAN

pull/40/head
Christoph Oberhofer 10 years ago
parent eb9d5ba8dc
commit d4ba4ccaae

14
dist/quagga.js vendored

@ -463,7 +463,7 @@ define(
error = 0, error = 0,
singleError = 0, singleError = 0,
modulo = this.MODULO, modulo = this.MODULO,
maxSingleError = 0.9; maxSingleError = this.SINGLE_CODE_ERROR || 0.9;
for (i = 0; i < counter.length; i++) { for (i = 0; i < counter.length; i++) {
singleError = Math.abs(code[i] - counter[i]); singleError = Math.abs(code[i] - counter[i]);
@ -1121,7 +1121,9 @@ define(
[3, 1, 2, 1], [3, 1, 2, 1],
[2, 1, 1, 3] [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); EANReader.prototype = Object.create(BarcodeReader.prototype, properties);
@ -1162,7 +1164,7 @@ define(
} }
} }
bestMatch.end = i; bestMatch.end = i;
if (bestMatch.error > 0.5) { if (bestMatch.error > self.AVG_CODE_ERROR) {
return null; return null;
} }
return bestMatch; return bestMatch;
@ -1205,7 +1207,7 @@ define(
} }
if ( epsilon === undefined) { if ( epsilon === undefined) {
epsilon = 0.5; epsilon = self.AVG_CODE_ERROR;
} }
for ( i = 0; i < pattern.length; i++) { 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 // iterate over extrema and convert to binary based on avg between minmax
for ( i = 1; i < extrema.length - 1; i++) { for ( i = 1; i < extrema.length - 1; i++) {
if (extrema[i + 1].val > extrema[i].val) { 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 { } 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++) { for ( j = extrema[i].pos; j < extrema[i + 1].pos; j++) {

@ -6,20 +6,32 @@ module.exports = function(config) {
'test-main.js', 'test-main.js',
'src/vendor/glMatrix.js', 'src/vendor/glMatrix.js',
'src/typedefs.js', 'src/typedefs.js',
{pattern: 'node_modules/async/lib/async.js', included: false},
{pattern: 'src/*.js', included: false}, {pattern: 'src/*.js', included: false},
{pattern: 'spec/**/*.js', included: false}, {pattern: 'spec/**/*.js', included: false},
{pattern: 'test/**/*.*', included: false}
], ],
exclude: [ exclude: [
], ],
preprocessors: { preprocessors: {
'src/*.js': ['coverage'] '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'], reporters: ['progress', 'coverage'],
port: 9876, port: 9876,
colors: true, colors: true,
logLevel: config.LOG_INFO, logLevel: config.LOG_INFO,
autoWatch: true, autoWatch: true,
browsers: ['PhantomJS'], browsers: ['Chrome'],
singleRun: false, singleRun: false,
coverageReporter: { coverageReporter: {
type : 'html', type : 'html',

@ -4,6 +4,7 @@
"description": "An advanced barcode-scanner written in JavaScript", "description": "An advanced barcode-scanner written in JavaScript",
"main": "dist/quagga.js", "main": "dist/quagga.js",
"devDependencies": { "devDependencies": {
"async": "^0.9.0",
"grunt": "~0.4.5", "grunt": "~0.4.5",
"grunt-contrib-jshint": "~0.10.0", "grunt-contrib-jshint": "~0.10.0",
"grunt-contrib-nodeunit": "~0.4.1", "grunt-contrib-nodeunit": "~0.4.1",
@ -12,7 +13,8 @@
"grunt-requirejs": "^0.4.2", "grunt-requirejs": "^0.4.2",
"karma": "latest", "karma": "latest",
"karma-chai": "latest", "karma-chai": "latest",
"karma-coverage": "^0.2.7", "karma-chrome-launcher": "^0.1.12",
"karma-coverage": "^0.3.1",
"karma-mocha": "latest", "karma-mocha": "latest",
"karma-phantomjs-launcher": "^0.1.4", "karma-phantomjs-launcher": "^0.1.4",
"karma-requirejs": "^0.2.2", "karma-requirejs": "^0.2.2",

@ -31,6 +31,9 @@ define(['camera_access'], function(CameraAccess){
src: null, src: null,
addEventListener: function() { addEventListener: function() {
},
removeEventListener: function() {
}, },
play: function() { play: function() {

@ -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() {});
});
});

@ -29,7 +29,7 @@ define(
error = 0, error = 0,
singleError = 0, singleError = 0,
modulo = this.MODULO, modulo = this.MODULO,
maxSingleError = 0.9; maxSingleError = this.SINGLE_CODE_ERROR || 0.9;
for (i = 0; i < counter.length; i++) { for (i = 0; i < counter.length; i++) {
singleError = Math.abs(code[i] - counter[i]); singleError = Math.abs(code[i] - counter[i]);

@ -162,9 +162,9 @@ define(["cv_utils", "image_wrapper"], function(CVUtils, ImageWrapper) {
// iterate over extrema and convert to binary based on avg between minmax // iterate over extrema and convert to binary based on avg between minmax
for ( i = 1; i < extrema.length - 1; i++) { for ( i = 1; i < extrema.length - 1; i++) {
if (extrema[i + 1].val > extrema[i].val) { 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 { } 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++) { for ( j = extrema[i].pos; j < extrema[i + 1].pos; j++) {

@ -41,7 +41,9 @@ define(
[3, 1, 2, 1], [3, 1, 2, 1],
[2, 1, 1, 3] [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); EANReader.prototype = Object.create(BarcodeReader.prototype, properties);
@ -82,7 +84,7 @@ define(
} }
} }
bestMatch.end = i; bestMatch.end = i;
if (bestMatch.error > 0.5) { if (bestMatch.error > self.AVG_CODE_ERROR) {
return null; return null;
} }
return bestMatch; return bestMatch;
@ -125,7 +127,7 @@ define(
} }
if ( epsilon === undefined) { if ( epsilon === undefined) {
epsilon = 0.5; epsilon = self.AVG_CODE_ERROR;
} }
for ( i = 0; i < pattern.length; i++) { for ( i = 0; i < pattern.length; i++) {

@ -22,7 +22,31 @@ require.config({
'cluster': 'src/cluster', 'cluster': 'src/cluster',
'camera_access': 'src/camera_access', 'camera_access': 'src/camera_access',
'events': 'src/events', '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, deps: allTestFiles,
callback: window.__karma__.start callback: window.__karma__.start

Loading…
Cancel
Save