Как передать экземпляр OpenCv. js веб-работнику - PullRequest
0 голосов
/ 17 апреля 2020

Факт 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 ...... ";
...