Факт 1: веб-работникам разрешено получать модуль WASM в качестве аргумента метода WebWorker.postMessage()
. См., Например, this .
Fact 2: OpenCv.js
библиотека может быть скомпилирована в WASM .
То, что я не могу понять, это как раз OpenCV . js загружен, скомпилирован и готов к использованию (подтверждается вызовом некоторых методов в экземпляре OpenCV, таких как: new window.cv.Mat()
), его можно передать в качестве аргумента метода postMessage
, поэтому веб-работнику не требуется загрузить саму библиотеку.
Попытка передать экземпляр window.cv
, например, метод worker.postMessage("some_data", [window.cv])
, выдает ошибку DataCloneError
, чего я и ожидал, поскольку window.cv
является объектом, а не ArrayBuffer
.
Итак, как я могу получить OpenCV. js WASM скомпилированный модуль как ArrayBuffer
, чтобы его можно было передать веб-работнику?
Редактировать
Я видел этот пост , где кодировка base64 двоичных данных может быть извлечена из файла opencv. js. Затем попытка следовать инструкциям на этой странице для создания модуля wasm из декодированного ArrayBuffer base64 завершается с ошибкой:
Wasm decoding failed: expected magic word 00 61 73 6d
// Code executed in Node.js
const base64 = require('./opencv.wasm').wasmBinaryFile;
const buffer = base64ToArrayBuffer(base64);
const wasmModule = new WebAssembly.Module(buffer);
function base64ToArrayBuffer(base64) {
var binary_string = new Buffer(base64).toString('base64');
var len = binary_string.length;
var bytes = new Uint8Array(len);
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
// file opencv.wasm with the contents of OpenCV.js wasm code (only a fraction of the base64 string is displayed)
exports.wasmBinaryFile="data:application/wasm;base64,AGFzbQ ...... ";