gpt4 book ai didi

javascript - 如何将图像帧相机传递给 wasm (C++) 中的函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:08 26 4
gpt4 key购买 nike

我正在尝试构建一个 C++ 函数并使用 Emscripten 将其编译为 Wasm。
此函数将做的是接收图像并对其进行一些处理并返回结果。
我的第一个 POC 成功了,用户使用 file 输入上传图像,我使用 FileReader API 传递图像数据:

const fileReader = new FileReader();
fileReader.onload = (event) => {
const uint8Arr = new Uint8Array(event.target.result);
passToWasm(event.target.result);
};

fileReader.readAsArrayBuffer(file); // I got this `file` from `change` event of the file input.

但是当我实现相机馈送并开始获取帧以将其传递给 Wasm 时,我开始在 C++ 端遇到异常,这是 JS 实现:

let imageData = canvasCtx.getImageData(0, 0, videoWidth, videoHeight);
var data=imageData.data.buffer;
var uint8Arr = new Uint8Array(data);
passToWasm(uint8Arr);

这个在 C++ 端抛出异常。

现在 passToWasm 实现是:

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._myWasmFunc(dataOnHeap.byteOffset, uint8ArrData.length);
}

虽然 C++ 实现将是这样的:

void EMSCRIPTEN_KEEPALIVE checkImageQuality(uint8_t* buffer, size_t size) {
// I'm using OpenCV in C++ to process the image data
// So I read the data of the image
cv::Mat raw_data = cv::Mat(1, size, CV_8UC1, buffer);

// Then I convert it
cv::Mat img_data = cv::imdecode(raw_data, cv::IMREAD_COLOR | cv::IMREAD_IGNORE_ORIENTATION);

// in one of the following steps I'm using cvtColor function which causes the issue for some reason
}

我因为相机实现而得到的异常说:

OpenCV(4.1.0-dev) ../modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'

使用 file 输入并获取数据传递给它和从 canvas 获取数据有什么区别,只要它们都将其转换为Uint8Array

最佳答案

我找到了一个解决方案(也许只适合我的情况)。
当您尝试从 canvas 获取图像数据时,您会得到它作为 4 个 channel (RGBA 就像 PNG 中的一样),并且根据您的图像处理代码,您需要处理它。
我的代码考虑图像应该是 3 个 channel (RGB 就像在 jpeg 中一样)所以我不得不使用这个代码转换它:

canvasBuffer.toBlob(function (blob) {
passToWASM(blob);
},'image/jpeg');

关于javascript - 如何将图像帧相机传递给 wasm (C++) 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55845033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com