OpenCV (C ++) для обработки данных изображения, поступающих из JavaScript / Web Assembly - PullRequest
0 голосов
/ 18 июня 2020
• 1000 чтобы открыть два изображения, которые передаются через cli - что-то вроде:
#include <opencv.hpp>
using namespace cv;

int calc(int argc, char** argv) {
    Mat img1_temp, img2_temp;
    img1_temp = imread(argv[1],-1);
    img2_temp = imread(argv[2],-1);
    // further processing ...
}

это работает из CLI, например: ./app one.jpg two.jpg.

При переносе приложения на wasm, я больше не могу использовать интерфейс командной строки для отправки изображения и, конечно, я не могу отправить файл (ы), поэтому у меня появился следующий код (теперь это клиентская сторона JavaScript):

// url is a remote image
const urlToUint8Array = async url => {
  const response = await fetch(url);
  const buffer = await response.arrayBuffer();
  const arr = new Uint8Array(buffer);
  return arr;
};

const waModule = await WAModule();
document.getElementById('calculate').addEventListener('click', () => {
  waModule.FS.writeFile('in1.ext', one, { encoding: 'binary' });
  waModule.FS.writeFile('in2.ext', two, { encoding: 'binary' });
  waModule._calc('in1.ext', 'in2.ext')); // this does not work
});

Вопрос, как отправить изображение с JS на wasm. Я также попытался изменить файл C ++, чтобы использовать imdecode вместо imread (и перекомпилировать wasm), но я не уверен, что это правильный путь.

Подводя итог, я ищу способ отправки данных изображения для дальнейшего анализа со стороны моего клиента JavaScript в WASM для обработки OpenCV.

1 Ответ

0 голосов
/ 19 июня 2020

Здравствуйте, я в основном использовал enscripten и ни в коем случае не являюсь экспертом в этом. Даю свои 2 цента на случай, если это может вам помочь:

  1. У Васма своя память. Это песочница, в которую вы transfer данные. Это означает, что если вы создали некоторую память на стороне JS, то будет копия этих данных при передаче на сторону C ++.
  2. В целях безопасности эта память не используется совместно. Один из способов выделить память и использовать ее как для WASM, так и для JS - выделить память на стороне WASM и использовать ее в JS. (Module.HEAP8 et c.).

Теперь возвращаясь к вашему вопросу, имея в виду следующее:

Фактически вы можете предоставить WASM разрешения безопасности на чтение из определенную папку или дать какие-то разрешения файловой системе. (https://emscripten.org/docs/porting/files/file_systems_overview.html#file -system-runtime-environment ) и здесь у вас есть пример на основе библиотеки enscripten https://github.com/emscripten-core/emscripten/blob/master/tests/fs/test_nodefs_rw.c.

Вы можете выделить память буфер на стороне WASM, используйте Uint8Buffer для чтения данных, которые совместно используются обоими, и вы выполняете свои вычисления.

...