如何在 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
)。
我使用 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
)。