cv ::将图像从JS解码到C ++(opencv,emscripten)

问题描述 投票:1回答:1

我正在尝试做的事情:

  • 用户在html中加载图像
  • opencv用C ++接收该图像并对其进行一些工作。

我所做的或多或少与此处描述的相同:

https://answers.opencv.org/question/222994/how-to-pass-image-data-from-javascript-to-opencv-c-webassembly/

这里是javascript部分(来自给定链接的冗长部分:]:>

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
    console.log(dataOnHeap.byteOffset);
    const res = Module._image_input(dataOnHeap.byteOffset, uint8ArrData.length);

    Module._free(dataPtr);
}

这是C ++部分(几乎逐字记录:)>

int image_input(int offset, size_t size) //query image input
    {
      uint8_t* pos;
       pos = reinterpret_castw<uint8_t*>(offset);
        cv::Mat raw_data = cv::Mat(1, size, CV_8UC1, pos);
         cout << raw_data << endl;
        img_object = cv::imdecode(raw_data, cv::IMREAD_GRAYSCALE);
        cout << img_object << endl;
    }

[当我使用一些jpg图像进行测试时,C ++部分的raw_data和JS部分的uint8ArrData包含相同的信息:这是15253个数字的列表,例如

[255, 216, 255, 224, ..., 184, 227, 255, 217]

现在,行

img_object = cv::imdecode(raw_data, cv::IMREAD_GRAYSCALE);

返回一个空矩阵[]

我做错了什么?我必须在JS端进行一些预处理吗?

我正在尝试做的事情:用户在html中加载图像opencv在C ++中接收该图像并对其进行一些工作。我所做的与此处所述大致相同:https://answers.opencv ....

javascript opencv emscripten
1个回答
0
投票

如所提供的链接中所述,解决方案是使用画布并将像素列表(以4x480x640数字为例)发送到C ++。

在JS方面,您有

© www.soinside.com 2019 - 2024. All rights reserved.