Reputation: 45
how to convert info[0] to uchar array??
js "uint8clampedarray"
->
info Nan::FunctionCallbackInfo<v8::Value>
info[0] class v8::Local<class v8::Value>
->
uchar data[]
->
cv::Mat or ZXing::ImageView
need use image uchar data[];
->
DecodeBarcodes(cv::Mat) or ZXing::ReadBarcodes(ZXing::ImageView, {})
get qrcode detect result
ZXing::Result Convert Json and return
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)
Upvotes: 0
Views: 183
Reputation: 3443
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.
Upvotes: 0