ojos
Version:
High level API on top of Mirada (opencv.js) supporting bth browser and node.
132 lines • 5.22 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __spreadArrays = (this && this.__spreadArrays) || function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
Object.defineProperty(exports, "__esModule", { value: true });
var mirada_1 = require("mirada");
var misc_utils_of_mine_generic_1 = require("misc-utils-of-mine-generic");
var util_1 = require("../util");
var AbstractOperation = /** @class */ (function () {
function AbstractOperation(defaultOptions) {
this.defaultOptions = defaultOptions;
this.description = 'TODO';
this.noInPlace = false;
this.sameSizeAndType = false;
this.isInPlace = false;
this.noDst = false;
this.validateEachExec = false;
this.validated = false;
this.validChannels = undefined;
}
AbstractOperation.prototype.validate = function (o) {
return;
};
AbstractOperation.prototype.exec = function (o) {
var options = this.checkOptions(o);
this.checkInPlaceBefore(options);
if (!this.validated || this.validateEachExec) {
var s = this.validate(options);
if (s) {
throw new Error(this.name + " validation error: " + s);
}
this.validated = true;
}
this._exec(options);
this.checkInPlaceAfter(options);
this.afterExec(options);
return options.dst;
};
AbstractOperation.prototype.afterExec = function (options) {
};
AbstractOperation.prototype.checkInputImage = function (o) {
};
AbstractOperation.prototype.checkOptions = function (o) {
if (!o && !this.defaultOptions) {
throw new Error('No options provided not in the constructor or in exec() call. Aborting.');
}
Object.assign(o, this.defaultOptions, o);
var options = o;
this.checkInputImage(options);
if (this.validChannels && this.validChannels.length && !this.validChannels.includes(options.src.channels())) {
throw new Error("Invalid number of channels for input image which has " + options.src.channels() + " and must be in [" + this.validChannels.join(',') + "]");
}
if (mirada_1.isSize(util_1.toSize(options.ksize))) {
var ksize = util_1.toSize(options.ksize);
ksize.width = ksize.width < 3 ? 3 : ksize.width % 2 !== 1 ? ksize.width - 1 : ksize.width;
ksize.height = ksize.height < 3 ? 3 : ksize.height % 2 !== 1 ? ksize.height - 1 : ksize.height;
}
this.checkDst(options);
return options;
};
AbstractOperation.prototype.checkDst = function (options) {
if (!options.dst) {
if (this.noDst) {
options.dst = options.src.clone();
}
else if (this.sameSizeAndType) {
options.dst = cv.Mat.zeros(options.src.rows, options.src.cols, options.src.type());
}
else {
options.dst = new cv.Mat();
}
}
else {
if (this.noDst) {
options.src.copyTo(options.dst);
}
}
};
AbstractOperation.prototype.checkInPlaceBefore = function (o) {
if (this.noInPlace && o.dst === o.src) {
this.isInPlace = true;
o.dst = o.src.clone();
}
else {
this.isInPlace = false;
}
};
AbstractOperation.prototype.checkInPlaceAfter = function (o) {
if (this.isInPlace && this.noInPlace && o.dst) {
this.isInPlace = false;
o.dst.copyTo(o.src);
misc_utils_of_mine_generic_1.checkThrow(o.dst !== o.src, 'Expected src and dst to be different objects');
o.dst.delete();
o.dst = o.src;
}
};
AbstractOperation.prototype.allChannels = function (o, op) {
if (o.src.channels() === 1 || !o.channels) {
op(o);
}
else {
var rgbaPlanes_1 = new cv.MatVector();
cv.split(o.src, rgbaPlanes_1);
var mats_1 = [];
(Array.isArray(o.channels) ? o.channels : misc_utils_of_mine_generic_1.array(o.src.channels() === 4 ? 3 : o.src.channels())).forEach(function (i) {
var M = rgbaPlanes_1.get(i);
mats_1.push(M);
op(__assign(__assign({}, o), { src: M, dst: M }));
});
cv.merge(rgbaPlanes_1, o.dst);
mirada_1.del.apply(void 0, __spreadArrays(mats_1, [rgbaPlanes_1]));
}
};
return AbstractOperation;
}());
exports.AbstractOperation = AbstractOperation;
//# sourceMappingURL=abstractOperation.js.map