简体   繁体   English

将图像数据形式 node.js 发送并格式化到节点 c++ 插件问题?

[英]send and format image data form node.js to node c++ addon problem?

how to convert info[0] to uchar array??如何将 info[0] 转换为 uchar 数组?

js "uint8clampedarray" js“uint8clampedarray”

-> ->

info Nan::FunctionCallbackInfo<v8::Value>信息Nan::FunctionCallbackInfo<v8::Value>

info[0] class v8::Local<class v8::Value>信息[0] class v8::Local<class v8::Value>

-> ->

uchar data[]字符数据[]

-> ->

cv::Mat or ZXing::ImageView cv::Mat 或 ZXing::ImageView

need use image uchar data[];需要使用图像uchar数据[];

-> ->

DecodeBarcodes(cv::Mat) or ZXing::ReadBarcodes(ZXing::ImageView, {}) DecodeBarcodes(cv::Mat) 或 ZXing::ReadBarcodes(ZXing::ImageView, {})

get qrcode detect result获取二维码检测结果

ZXing::Result Convert Json and return ZXing::Result 转换 Json 并返回

let addon = require("bindings")("addon.node");
// uint8clampedarray from front end browser
let imageData = [255,255,0,0,255,255.....]; // uint8clampedarray
addon.decodeQRcode(imageData )
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include "ReadBarcode.h" // ZXing-cpp

// return ZXing::ImageView
inline ZXing::ImageView ImageViewFromMat(const cv::Mat& image)
{
    using ZXing::ImageFormat;
    auto fmt = ImageFormat::None;
    switch (image.channels()) {
        case 1: fmt = ImageFormat::Lum; break;
        case 3: fmt = ImageFormat::BGR; break;
        case 4: fmt = ImageFormat::BGRX; break;
    }
    if (image.depth() != CV_8U || fmt == ImageFormat::None)
        return { nullptr, 0, 0, ImageFormat::None };
    return { image.data, image.cols, image.rows, fmt };
}

// return ZXing::Results
inline ZXing::Results DecodeBarcodes(const cv::Mat& image, const ZXing::DecodeHints& hints = {})
{
    return ZXing::ReadBarcodes(ImageViewFromMat(image), hints);
}

void DecodeQRcode(const Nan::FunctionCallbackInfo<v8::Value> &info)
{
  Isolate *isolate = info.GetIsolate();

  Local<Array> arr = Local<Array>::Cast(info[0]);
  printf("size %d\n", arr->Length());
  
  // convert info[0] to uchar array
  // uchar data[] = {}; <- from node js uint8clampedarray data convert ??
  // cv::Mat QRCodeImage(imgHeight,imgWidth, CV_8UC4, data);
  // auto results = ReadBarcodes(QRCodeImage);
  // convert ZXing::Results to js object?

  info.GetReturnValue().Set(results );
}
void Init(v8::Local<v8::Object> exports)
{
  exports->Set(context,
               Nan::New("decodeQRcode").ToLocalChecked(),
               Nan::New<v8::FunctionTemplate>(DecodeQRcode)
                   ->GetFunction(context)
                   .ToLocalChecked());
}
NODE_MODULE(addon, Init)
Nan::TypedArrayContents<uchar> contents(info[0]);
if (contents.length() < min_length) printf("not good\n");
uchar *data = *contents;

And of course you will need to protect it from the garbage collector if you are going to be using this data after you have returned to your JS caller.当然,如果您在返回给 JS 调用者后要使用这些数据,则需要保护它不受垃圾收集器的影响。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM