如何在 nodejs 插件中 return cv::Mat

How to return cv::Mat in nodejs addon

我使用 V8 编写了 nodejs 插件。我被困在尝试 return Mat 但我得到的只是大小为 2mb 的损坏图像(对于特定图像)。难道我做错了什么?我如何使用 V8 执行此操作?

CPP 代码片段

cv::Mat image = ...
std::string my_cv_mat(image.begin<unsigned char>(), image.end<unsigned char>());
args.GetReturnValue().Set(v8::String::NewFromUtf8(isolate, my_cv_mat.c_str()).ToLocalChecked());

Nodejs 代码片段

// body is express's req.body
let bodyBuffer = new Buffer.from(body, "binary");
let detectedFaces = faceDetect.detect(bodyBuffer)  //here I'm reading above Mat image into char string
const out_file = path.basename("output.png")
fs.writeFileSync(out_file, new Buffer.from(detectedFaces, "binary"))

--- 更新 ---

我已经更新了代码,但输出仍然不是图像,它的大小现在是 23mb,而它应该是 700kb。

CPP 更新代码段

  unsigned int img_size = image.total() * image.elemSize();
  char* image_char = reinterpret_cast<char*>(image.data);
  Nan::MaybeLocal<v8::Object> imageBuffer = Nan::CopyBuffer(image_char, img_size);
  args.GetReturnValue().Set(imageBuffer.ToLocalChecked());

nodejs 代码片段

    let detectedFaces = faceDetect.detect(bodyBuffer)
    const out_file = path.basename("output.png")
    fs.writeFileSync(out_file, new Buffer.from(detectedFaces, "binary"))

我不认为是 UTF-8 编码的字符串(或者,更准确地说:从原始图像数据构造一个 JavaScript 字符串,您告诉 String 构造函数将其视为 UTF-8 并解码因此)是完成这项工作的正确工具。

尝试直接在您的插件中创建缓冲区,并将其作为调用结果返回(而不是 v8::String)。