hzt_asc 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/ask.cc +87 -115
  2. package/ask.h +7 -4
  3. package/package.json +1 -1
  4. package/sample/demo.js +1386 -4
package/ask.cc CHANGED
@@ -92,7 +92,7 @@ ASK::ASK(const Napi::CallbackInfo& info) : Napi::ObjectWrap<ASK>(info) {
92
92
 
93
93
  ASK::~ASK()
94
94
  {
95
- delete []mFeatureInfoList;
95
+ // delete []mFeatureInfoList;
96
96
  ASFUninitEngine(this->handle);
97
97
  printf("ASK end\n");
98
98
  }
@@ -142,7 +142,6 @@ Napi::Value ASK::faceDetect(const Napi::CallbackInfo& info) {
142
142
  return obj;
143
143
  }
144
144
 
145
-
146
145
  Napi::Value ASK::faceDetectUrl(const Napi::CallbackInfo& info) {
147
146
  Napi::Env env = info.Env();
148
147
  int length = info.Length();
@@ -176,8 +175,6 @@ Napi::Value ASK::faceDetectUrl(const Napi::CallbackInfo& info) {
176
175
  return obj;
177
176
  }
178
177
 
179
-
180
-
181
178
  Napi::Value ASK::faceFeatureExtract(const Napi::CallbackInfo& info) {
182
179
  Napi::Env env = info.Env();
183
180
  int length = info.Length();
@@ -284,7 +281,6 @@ Napi::Value ASK::faceFeatureExtractUrl(const Napi::CallbackInfo& info) {
284
281
  return obj;
285
282
  }
286
283
 
287
-
288
284
  Napi::Value ASK::faceFeatureInfo(const Napi::CallbackInfo& info) {
289
285
  Napi::Env env = info.Env();
290
286
  int length = info.Length();
@@ -335,7 +331,6 @@ void strToFeatureInfo(string& feature, ASF_FaceFeature& featureInfo) {
335
331
  featureInfo.feature = reinterpret_cast<MByte*>(feature11);
336
332
  }
337
333
 
338
-
339
334
  Napi::Value ASK::faceFeatureCompare(const Napi::CallbackInfo& info) {
340
335
  Napi::Env env = info.Env();
341
336
  //printf("AcceptArrayBuffer from js %d \n", info.Length());
@@ -368,10 +363,10 @@ Napi::Value ASK::faceFeatureCompare(const Napi::CallbackInfo& info) {
368
363
 
369
364
  }
370
365
 
371
-
372
- bool compareScore(MFaceSore& a, MFaceSore& b){
373
- if (b.score > a.score) return false;
374
- return true;
366
+ bool compareScore(const MFaceSore& a, const MFaceSore& b){
367
+ // if (b.score > a.score) return false;
368
+ // return true;
369
+ return a.score > b.score;//
375
370
  }
376
371
 
377
372
  Napi::Value ASK::ImageFaceCompare(const Napi::CallbackInfo& info) {
@@ -422,7 +417,7 @@ Napi::Value ASK::ImageFaceCompare(const Napi::CallbackInfo& info) {
422
417
 
423
418
  ASF_FaceFeatureInfo* info = new ASF_FaceFeatureInfo();
424
419
  info->searchId = searchId;
425
- info->tag = (*tag).c_str();
420
+ info->tag = *tag; //(*tag).c_str();
426
421
  info->feature = featureInfo;
427
422
  featureInfoList[i] = *info;
428
423
  }
@@ -483,27 +478,80 @@ Napi::Value ASK::RegisterFaces(const Napi::CallbackInfo& info) {
483
478
  return errorData(env, "array expected");
484
479
  }
485
480
  Napi::Array arr = info[0].As<Napi::Array>();
481
+ m_vecFeatureInfoList.clear();
482
+
486
483
  MUInt32 len = arr.Length();
487
- ASF_FaceFeatureInfo* featureInfoList = new ASF_FaceFeatureInfo[len];
484
+ //ASF_FaceFeatureInfo* featureInfoList = new ASF_FaceFeatureInfo[len];
488
485
  for(int i = 0; i < len; ++i) {
489
486
  Napi::Object obj = static_cast<Napi::Value>(arr[i]).As<Napi::Object>().ToObject();
490
487
  MInt32 searchId = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"searchId"))).As<Napi::Number>().Uint32Value();
491
- std::string* tag = new std::string();
492
- *tag = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"tag"))).As<Napi::String>().ToString();
493
- //Napi::ArrayBuffer buf = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"feature"))).As<Napi::ArrayBuffer>();
488
+ // std::string* tag = new std::string();
489
+ // *tag = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"tag"))).As<Napi::String>().ToString();
490
+ // //Napi::ArrayBuffer buf = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"feature"))).As<Napi::ArrayBuffer>();
494
491
  ASF_FaceFeature* featureInfo = new ASF_FaceFeature();
495
- std::string* feature = new std::string();
496
- *feature = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"feature"))).As<Napi::String>().ToString();
497
- strToFeatureInfo(*feature, *featureInfo);
498
- featureInfoList[i].searchId = searchId;
499
- featureInfoList[i].tag = (*tag).c_str();
500
- featureInfoList[i].feature = featureInfo;
501
- }
502
- mFeatureInfoList = featureInfoList;
503
- mFeatureLen = len;
492
+ // std::string* feature = new std::string();
493
+ // *feature = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"feature"))).As<Napi::String>().ToString();
494
+ std::string strFeature = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"feature"))).As<Napi::String>().ToString();
495
+ strToFeatureInfo(strFeature, *featureInfo);
496
+ // featureInfoList[i].searchId = searchId;
497
+ // featureInfoList[i].tag = *tag; //(*tag).c_str();
498
+ // featureInfoList[i].feature = featureInfo;
499
+ ASF_FaceFeatureInfo fInfo = {0};
500
+ fInfo.searchId = searchId;
501
+ fInfo.tag = obj.Get(static_cast<napi_value>(Napi::String::New(env,"tag"))).As<Napi::String>().ToString();
502
+ fInfo.feature = featureInfo;
503
+ m_vecFeatureInfoList.push_back(fInfo);
504
+ }
505
+ // mFeatureInfoList = featureInfoList;
506
+ // mFeatureLen = len;
504
507
  return Napi::Number::New(env, 1);
505
508
  }
506
509
 
510
+ Napi::Array ASK::faceReg(std::vector<ASF_FaceFeatureInfo>& vecFeatureInfoList, ASF_MultiFaceInfo& detectedFaces, Napi::Env& env, ASVLOFFSCREEN& offscreen) {
511
+ Napi::Array list = Napi::Array::New(env, detectedFaces.faceNum);
512
+ for(int i = 0; i < detectedFaces.faceNum; ++i) {
513
+ ASF_SingleFaceInfo sData;
514
+ getDetectFaceInfo(detectedFaces, sData, i);
515
+ ASF_FaceFeature feature = { 0 };
516
+ MRESULT res = ASFFaceFeatureExtractEx(handle, &offscreen, &sData, &feature);
517
+ vector<MFaceSore> vecfaceScores;
518
+ for(int j = 0; j < vecFeatureInfoList.size(); ++j) {
519
+ ASF_FaceFeatureInfo& fInfo = vecFeatureInfoList[j];
520
+ MFloat confidenceLevel;
521
+ MRESULT res1 = ASFFaceFeatureCompare(this->handle, &feature, fInfo.feature, &confidenceLevel);
522
+ //cout << " confidenceLevel: " << confidenceLevel;
523
+ MFaceSore sInfo;
524
+ sInfo.searchId = fInfo.searchId;
525
+ sInfo.score = confidenceLevel;
526
+ sInfo.name = fInfo.tag;
527
+ vecfaceScores.push_back(sInfo);
528
+ }
529
+ sort(vecfaceScores.begin(), vecfaceScores.end(), compareScore);
530
+ int ll = vecfaceScores.size() > 3? 3 : vecfaceScores.size();
531
+ Napi::Array mFaceScores = Napi::Array::New(env, ll);
532
+ //cout << " i=" << i << ", len=" << ll << ",mFeatureLen=" << vecFeatureInfoList.size() << endl;
533
+ for(int n = 0; n < ll; ++n) {
534
+ MFaceSore& sInfo = vecfaceScores[n];
535
+ Napi::Object faceScore = Napi::Object::New(env);
536
+ faceScore.Set(Napi::String::New(env, "searchId"), sInfo.searchId);
537
+ faceScore.Set(Napi::String::New(env, "score"), sInfo.score);
538
+ faceScore.Set(Napi::String::New(env, "name"), sInfo.name);
539
+ //cout << "name:" << sInfo.name << ",searchId:" << sInfo.searchId << ",score=" << sInfo.score << endl;
540
+ mFaceScores[n] = faceScore;
541
+ }
542
+ Napi::Object data = Napi::Object::New(env);
543
+ data.Set(Napi::String::New(env, "left"), sData.faceRect.left);
544
+ data.Set(Napi::String::New(env, "top"), sData.faceRect.top);
545
+ data.Set(Napi::String::New(env, "right"), sData.faceRect.right);
546
+ data.Set(Napi::String::New(env, "bottom"), sData.faceRect.bottom);
547
+ data.Set(Napi::String::New(env, "faceScores"), mFaceScores);
548
+ list[i] = data;
549
+ vecfaceScores.clear();
550
+ }
551
+ //obj.Set(Napi::String::New(env, "faceRects"), list);
552
+ return list;
553
+ }
554
+
507
555
  Napi::Value ASK::ImageFaceCompareUrl2(const Napi::CallbackInfo& info) {
508
556
  Napi::Env env = info.Env();
509
557
  int length = info.Length();
@@ -519,53 +567,20 @@ Napi::Value ASK::ImageFaceCompareUrl2(const Napi::CallbackInfo& info) {
519
567
 
520
568
  ASF_MultiFaceInfo detectedFaces = { 0 };
521
569
  MRESULT res = ASFDetectFacesEx(this->handle, &offscreen, &detectedFaces);
522
- //return Napi::Number::New(env, 1);
523
570
  Napi::Object obj = Napi::Object::New(env);
524
571
  obj.Set(Napi::String::New(env, "faceNum"), detectedFaces.faceNum);
525
572
  if (0 == detectedFaces.faceNum) {
526
573
  SafeFree(imageData);
527
574
  return obj;
528
575
  }
529
- //compare
530
- Napi::Array list = Napi::Array::New(env, detectedFaces.faceNum);
531
- for(int i = 0; i < detectedFaces.faceNum; ++i) {
532
- ASF_SingleFaceInfo sData;
533
- getDetectFaceInfo(detectedFaces, sData, i);
534
- ASF_FaceFeature feature = { 0 };
535
- res = ASFFaceFeatureExtractEx(handle, &offscreen, &sData, &feature);
536
- MFaceSore* faceScores = new MFaceSore[mFeatureLen];
537
- for(int j = 0; j < mFeatureLen; ++j) {
538
- MFloat confidenceLevel;
539
- MRESULT res1 = ASFFaceFeatureCompare(this->handle, &feature, mFeatureInfoList[j].feature, &confidenceLevel);
540
- faceScores[j].searchId = mFeatureInfoList[j].searchId;
541
- faceScores[j].score = confidenceLevel;
542
- faceScores[j].name = mFeatureInfoList[j].tag;
543
- }
544
- sort(faceScores, faceScores + mFeatureLen, compareScore);
545
- int ll = mFeatureLen > 5? 5 : mFeatureLen;
546
- Napi::Array mFaceScores = Napi::Array::New(env, ll);
547
- for(int n = 0; n < ll; ++n) {
548
- Napi::Object faceScore = Napi::Object::New(env);
549
- faceScore.Set(Napi::String::New(env, "searchId"), faceScores[n].searchId);
550
- faceScore.Set(Napi::String::New(env, "score"), faceScores[n].score);
551
- faceScore.Set(Napi::String::New(env, "name"), faceScores[n].name);
552
- mFaceScores[n] = faceScore;
553
- }
554
- Napi::Object data = Napi::Object::New(env);
555
- data.Set(Napi::String::New(env, "left"), sData.faceRect.left);
556
- data.Set(Napi::String::New(env, "top"), sData.faceRect.top);
557
- data.Set(Napi::String::New(env, "right"), sData.faceRect.right);
558
- data.Set(Napi::String::New(env, "bottom"), sData.faceRect.bottom);
559
- data.Set(Napi::String::New(env, "faceScores"), mFaceScores);
560
- list[i] = data;
561
- delete []faceScores;
562
- }
576
+ Napi::Array list = faceReg(this->m_vecFeatureInfoList, detectedFaces, env, offscreen);
563
577
  obj.Set(Napi::String::New(env, "faceRects"), list);
564
578
  SafeFree(imageData);
565
579
  return obj;
566
580
  }
567
581
 
568
582
 
583
+
569
584
  Napi::Value ASK::ImageFaceCompareUrl(const Napi::CallbackInfo& info) {
570
585
  Napi::Env env = info.Env();
571
586
  int length = info.Length();
@@ -584,7 +599,7 @@ Napi::Value ASK::ImageFaceCompareUrl(const Napi::CallbackInfo& info) {
584
599
  Napi::Object obj = Napi::Object::New(env);
585
600
  obj.Set(Napi::String::New(env, "faceNum"), detectedFaces.faceNum);
586
601
  if (0 == detectedFaces.faceNum) {
587
- SafeArrayDelete(imageData);
602
+ SafeFree(imageData);
588
603
  return obj;
589
604
  }
590
605
 
@@ -595,69 +610,26 @@ Napi::Value ASK::ImageFaceCompareUrl(const Napi::CallbackInfo& info) {
595
610
  }
596
611
  Napi::Array arr = info[1].As<Napi::Array>();
597
612
  MUInt32 len = arr.Length();
598
- ASF_FaceFeatureInfo* featureInfoList = new ASF_FaceFeatureInfo[len];
613
+
614
+ std::vector<ASF_FaceFeatureInfo> vecFeatureInfoList;
599
615
  for(int i = 0; i < len; ++i) {
600
616
  Napi::Object obj = static_cast<Napi::Value>(arr[i]).As<Napi::Object>().ToObject();
601
617
  MInt32 searchId = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"searchId"))).As<Napi::Number>().Uint32Value();
602
- std::string* tag = new std::string();
603
- *tag = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"tag"))).As<Napi::String>().ToString();
604
- //Napi::ArrayBuffer buf = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"feature"))).As<Napi::ArrayBuffer>();
618
+ std::string strFeature = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"feature"))).As<Napi::String>().ToString();
605
619
  ASF_FaceFeature* featureInfo = new ASF_FaceFeature();
606
- std::string* feature = new std::string();
607
- *feature = obj.Get(static_cast<napi_value>(Napi::String::New(info.Env(),"feature"))).As<Napi::String>().ToString();
608
- strToFeatureInfo(*feature, *featureInfo);
609
- // featureInfo->featureSize = buf.ByteLength();
610
- // featureInfo->feature = reinterpret_cast<MByte*>(buf.Data());;
611
- //ASF_FaceFeatureInfo* info = new ASF_FaceFeatureInfo();
612
- featureInfoList[i].searchId = searchId;
613
- featureInfoList[i].tag = (*tag).c_str();
614
- featureInfoList[i].feature = featureInfo;
615
- //featureInfoList[i] = *info;
616
- }
617
-
618
- //compare
619
- Napi::Array list = Napi::Array::New(env, detectedFaces.faceNum);
620
- for(int i = 0; i < detectedFaces.faceNum; ++i) {
621
- ASF_SingleFaceInfo sData;
622
- getDetectFaceInfo(detectedFaces, sData, i);
623
- ASF_FaceFeature feature = { 0 };
624
- res = ASFFaceFeatureExtractEx(handle, &offscreen, &sData, &feature);
625
- MFaceSore* faceScores = new MFaceSore[len];
626
- for(int j = 0; j < len; ++j) {
627
- MFloat confidenceLevel;
628
- MRESULT res1 = ASFFaceFeatureCompare(this->handle, &feature, featureInfoList[j].feature, &confidenceLevel);
629
- //cout << confidenceLevel <<endl;
630
- //MFaceSore* pFace = new MFaceSore();
631
- faceScores[j].searchId = featureInfoList[j].searchId;
632
- faceScores[j].score = confidenceLevel;
633
- faceScores[j].name = featureInfoList[j].tag;
634
- // faceScores[j] = *pFace;
635
- }
636
- sort(faceScores, faceScores + len, compareScore);
637
- int ll = len > 5? 5 : len;
638
- Napi::Array mFaceScores = Napi::Array::New(env, ll);
639
- for(int n = 0; n < ll; ++n) {
640
- Napi::Object faceScore = Napi::Object::New(env);
641
- faceScore.Set(Napi::String::New(env, "searchId"), faceScores[n].searchId);
642
- faceScore.Set(Napi::String::New(env, "score"), faceScores[n].score);
643
- faceScore.Set(Napi::String::New(env, "name"), faceScores[n].name);
644
- mFaceScores[n] = faceScore;
645
- }
646
- Napi::Object data = Napi::Object::New(env);
647
- data.Set(Napi::String::New(env, "left"), sData.faceRect.left);
648
- data.Set(Napi::String::New(env, "top"), sData.faceRect.top);
649
- data.Set(Napi::String::New(env, "right"), sData.faceRect.right);
650
- data.Set(Napi::String::New(env, "bottom"), sData.faceRect.bottom);
651
- data.Set(Napi::String::New(env, "faceScores"), mFaceScores);
652
- list[i] = data;
653
- delete []faceScores;
654
- }
620
+ strToFeatureInfo(strFeature, *featureInfo);
621
+ ASF_FaceFeatureInfo fInfo = {0};
622
+ fInfo.searchId = searchId;
623
+ fInfo.tag = obj.Get(static_cast<napi_value>(Napi::String::New(env,"tag"))).As<Napi::String>().ToString();
624
+ fInfo.feature = featureInfo;
625
+ vecFeatureInfoList.push_back(fInfo);
626
+ }
627
+ Napi::Array list = faceReg(vecFeatureInfoList, detectedFaces, env, offscreen);
655
628
  obj.Set(Napi::String::New(env, "faceRects"), list);
656
629
  SafeFree(imageData);
657
630
  for(int i = 0; i < len; ++i) {
658
- delete featureInfoList[i].feature;
631
+ delete vecFeatureInfoList[i].feature;
659
632
  }
660
- delete []featureInfoList;
661
633
  return obj;
662
634
  }
663
635
 
package/ask.h CHANGED
@@ -7,6 +7,7 @@
7
7
  #include "asvloffscreen.h"
8
8
  #include "merror.h"
9
9
  #include <string>
10
+ #include <vector>
10
11
  typedef struct __face_score
11
12
  {
12
13
  MInt32 searchId;
@@ -17,7 +18,8 @@ typedef struct __face_score
17
18
  typedef struct{
18
19
  MInt32 searchId; // 唯一标识符
19
20
  LPASF_FaceFeature feature; // 人脸特征值
20
- MPCChar tag; // 备注
21
+ std::string tag;
22
+ //MPCChar tag; // 备注
21
23
  }ASF_FaceFeatureInfo, *LPASF_FaceFeatureInfo;
22
24
 
23
25
  class ASK : public Napi::ObjectWrap<ASK> {
@@ -35,7 +37,6 @@ class ASK : public Napi::ObjectWrap<ASK> {
35
37
  // Napi::Value RegisterFaceFeature(const Napi::CallbackInfo& info);
36
38
  // Napi::Value SearchFaceFeature(const Napi::CallbackInfo& info);
37
39
 
38
-
39
40
  Napi::Value ImageFaceCompare(const Napi::CallbackInfo& info);
40
41
 
41
42
  Napi::Value faceDetectUrl(const Napi::CallbackInfo& info);
@@ -52,13 +53,15 @@ class ASK : public Napi::ObjectWrap<ASK> {
52
53
  MUInt8* processFile(const char* filePath, int& picWidth, int& picHeight);
53
54
  //void processFileUrl(const char* filePath, MUInt8* imageData, ASVLOFFSCREEN& offscreen);
54
55
  MUInt8* processFileUrl(const char* url, int& picWidth, int& picHeight);
56
+ Napi::Array faceReg(std::vector<ASF_FaceFeatureInfo>& vecFeatureInfoList, ASF_MultiFaceInfo& detectedFaces, Napi::Env& env, ASVLOFFSCREEN& offscreen);
55
57
 
56
58
  // void mFaceDetect(ASVLOFFSCREEN& offscree, ASF_MultiFaceInfo* detectedFaces);
57
59
  // void mFaceFeatureExtract(ASVLOFFSCREEN& offscree, ASF_MultiFaceInfo* detectedFaces);
58
60
 
59
61
  MHandle handle;
60
- ASF_FaceFeatureInfo* mFeatureInfoList;
61
- MUInt32 mFeatureLen;
62
+ // ASF_FaceFeatureInfo* mFeatureInfoList;
63
+ // MUInt32 mFeatureLen;
64
+ std::vector<ASF_FaceFeatureInfo> m_vecFeatureInfoList;
62
65
  };
63
66
 
64
67
  #endif
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hzt_asc",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "main": "index.js",
5
5
  "description": "hzt_asc_v3.",
6
6
  "author": {