如何将图像缓冲区传递给wasm

时间:2019-12-11 21:09:02

标签: c++ opencv emscripten webassembly

我正在尝试将数组缓冲区js传递给wasm OpenCV,但有时使用imdecode函数时会引发异常或某些时间为空白数组。 简单的HTML:

when:manual

JavaScript代码

<input type='file' id accept='image/*' onchange='openFile(event)'>

C ++代码:

 var openFile = function (e) {
            const fileReader = new FileReader();
            fileReader.onload = (event) => {
                const uint8Arr = new Uint8Array(event.target.result);
                passToWasm(uint8Arr);
            };
            fileReader.readAsArrayBuffer(e.target.files[0]);
        };

   function passToWasm(uint8ArrData) {
            // copying the uint8ArrData to the heap
            const numBytes = uint8ArrData.length * uint8ArrData.BYTES_PER_ELEMENT;
            const dataPtr = Module._malloc(numBytes);
            const dataOnHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, numBytes);
            dataOnHeap.set(uint8ArrData);
            // calling the Wasm function
            const res = Module._image_input(dataOnHeap.byteOffset, uint8ArrData.length);
        }

请帮助我,我已经花了很多天来解决这个问题。 在以下问题的帮助下,我正在尝试相同的方法。

How to pass image frames camera to a function in wasm (C++)?

1 个答案:

答案 0 :(得分:1)

malloc()HEAP8.set()可用于实现这一目标。 Surma's article描述了如何详细执行此操作。另一个示例是此decode()函数,该函数从JavaScript ArrayBuffer设置Wasm中的值。