From 46a5aa51e6b903913a847594a1b57b0a62822b98 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期六, 19 十月 2019 14:30:14 +0800
Subject: [PATCH] class them

---
 csrc/buz/face/face.cpp |  203 ++++++++++++++++++++
 /dev/null              |   21 --
 csrc/buz/face/face.h   |   43 ++++
 csdk.h                 |    2 
 csdk.cpp               |   77 ++++---
 csrc/buz/yolo/yolo.cpp |  148 ++++++++++++++
 gosdk.go               |   35 ---
 csrc/buz/yolo/yolo.h   |   41 ++++
 csrc/all.hpp           |    8 
 9 files changed, 483 insertions(+), 95 deletions(-)

diff --git a/csdk.cpp b/csdk.cpp
index 1810569..e4ef67f 100644
--- a/csdk.cpp
+++ b/csdk.cpp
@@ -12,88 +12,103 @@
 
 using namespace csdk_wrap;
 
-static VecFunc dtors_;
+static sdkface *face = NULL;
+static sdkyolo *yolo = NULL;
 
 int c_api_face_detector_init(const int tm, const int gi, const int minFaces, const int rollAngle){
-    return init_face_detector(tm, gi, minFaces, rollAngle, dtors_);
+    if (!face) face = new sdkface();
+    return face->init_face_detector(tm, gi, minFaces, rollAngle);
 }
 
 int c_api_face_property_init(const int tm){
-    return init_face_property(tm, dtors_);
+    if (!face) face = new sdkface();
+    return face->init_face_property(tm);
 }
 
 int c_api_face_extractor_init(const int tm, const int gi){
-    return init_face_extractor(tm, gi, dtors_);
+    if (!face) face = new sdkface();
+    return face->init_face_extractor(tm, gi);
 }
 
 int c_api_face_tracker_init(const int tm, const int gi, const int wid, const int hei,
                               const int maxFaces, const int detinterval, const int sampleSize){
-
-   return init_face_tracker(tm, gi, wid, hei, maxFaces, detinterval, sampleSize, dtors_);
+    if (!face) face = new sdkface();
+    return face->init_face_tracker(tm, gi, wid, hei, maxFaces, detinterval, sampleSize);
 }
 
 YoloHandle c_api_yolo_init(
     const char *fcfg, const char *fweights, const char *fname,
     const int gpu_index){
-
-    return init_yolo_detector(fcfg, fweights, fname, gpu_index, dtors_);    
+    
+    if (!yolo) yolo = new sdkyolo;
+    return yolo->init_yolo(fcfg, fweights, fname, gpu_index);    
 }
 
 void c_api_release(){
-    for(auto &i : dtors_){
-        i();
-    }
-    dtors_.clear();
+    if (face) delete face;
+    if (yolo) delete yolo;
 }
 
 ////////////////////////////////////////////////
 
 cFacePos* c_api_face_detect(int *faceCount, uchar*data, const int w, const int h, const int channel){
+    if (!face) return NULL;
+    
     const cIMAGE img{data, w, h, 3};
-    return face_detect(faceCount, &img, channel);
+    cFacePos *fpos = NULL;
+
+    int ret = face->face_detect(&img, channel, (void**)&fpos, faceCount);
+
+    if (ret <= 0) return NULL;
+    return fpos;
 }
 
 cThftResult c_api_face_property(const cFacePos* pos, uchar*data, const int w, const int h, const int channel){
+    if (!face) return cThftResult{-1,-1,-1,-1,-1};
 
     const cIMAGE img{data, w, h, 3};
-    return face_property(*pos, &img, channel);
+    return face->face_property(*pos, &img, channel);
 }
 
 uchar* c_api_face_extract(int *featLen, const cFacePos* pos, uchar*data, const int w, const int h, const int channel){
+    if (!face) return NULL;
 
     const cIMAGE img{data, w, h, 3};
-    return face_extract_feature(featLen, *pos, &img, channel);
+    uchar *feat = NULL;
+    int ret = face->face_extract_feature(*pos, &img, channel, (void**)&feat, featLen);
+    if (ret <= 0) return NULL;
+    return feat;
 }
 
 float c_api_face_compare(uchar *feat1, uchar *feat2){
-    return face_compare(feat1, feat2);
-}
-
-cRECT* c_api_face_track_only(int *fCount, uchar *data, const int wid, const int hei, const int channel){
-    const cIMAGE img{data, wid, hei, 3};
-
-    return face_track_only(fCount, &img, channel);
-}
-
-cFaceInfo* c_api_face_track_detect(int *fCount, uchar *data, const int wid, const int hei, const int channel){
-    const cIMAGE img{data, wid, hei, 3};
-
-    return face_track_detect(fCount, &img, channel);
+    if (!face) return NULL;
+    return face->face_compare(feat1, feat2);
 }
 
 cFaceInfo* c_api_face_track(int *fCount, uchar *data, const int wid, const int hei, const int channel){
+    if (!face) return NULL;
     const cIMAGE img{data, wid, hei, 3};
-    return face_track(fCount, &img, channel);
+
+    cFaceInfo *info = NULL;
+    int ret = face->face_track(&img, channel, (void**)&info, fCount);
+    if (ret <= 0) return NULL;
+    return info;
 }
 
 
 /// yolo api
 cObjInfo* c_api_yolo_detect(YoloHandle handle, int *objCount, uchar*data, const int w, const int h, const float thrsh, const int use_means){
+    if (!yolo) return NULL;
 
     const cIMAGE img{data, w, h, 3};
-    return yolo_detect(handle, objCount, &img, thrsh, use_means);
+    cObjInfo *info = NULL;
+    int ret = yolo->yolo_detect(handle, &img, thrsh, use_means, (void**)&info, objCount);
+    if (ret <= 0) return NULL;
+    return info;
 }
 
 const char* c_api_yolo_obj_name(const int typ){
-    return yolo_obj_name_by_type(typ);
+    if (!yolo) return NULL;
+
+    return yolo->yolo_obj_name_by_type(typ);
 }
\ No newline at end of file
diff --git a/csdk.h b/csdk.h
index 82bc8fa..fb9f25e 100644
--- a/csdk.h
+++ b/csdk.h
@@ -32,8 +32,6 @@
 
 uchar* c_api_face_extract(int *featLen, const cFacePos* pos, uchar*data, const int w, const int h, const int channel);
 float c_api_face_compare(uchar *feat1, uchar *feat2);
-cRECT* c_api_face_track_only(int *fCount, uchar *data, const int wid, const int hei, const int channel);
-cFaceInfo* c_api_face_track_detect(int *fCount, uchar *data, const int wid, const int hei, const int channel);
 cFaceInfo* c_api_face_track(int *fCount, uchar *data, const int wid, const int hei, const int channel);
 
 /// yolo api
diff --git a/csrc/all.hpp b/csrc/all.hpp
index 6c90c4b..58b32ca 100644
--- a/csrc/all.hpp
+++ b/csrc/all.hpp
@@ -1,11 +1,7 @@
 #ifndef _c_wrapper_face_detector_all_hpp_
 #define _c_wrapper_face_detector_all_hpp_
 
-#include "buz/face/detector.cpp"
-#include "buz/face/extractor.cpp"
-#include "buz/face/property.cpp"
-#include "buz/face/tracker.cpp"
-
-#include "buz/yolo/detector.cpp"
+#include "buz/face/face.cpp"
+#include "buz/yolo/yolo.cpp"
 
 #endif
\ No newline at end of file
diff --git a/csrc/buz/face/detector.cpp b/csrc/buz/face/detector.cpp
deleted file mode 100644
index e191ea8..0000000
--- a/csrc/buz/face/detector.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#include "detector.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "THFaceImage_i.h"
-
-#include "csdk_struct.h"
-
-namespace csdk_wrap
-{
-    int init_face_detector(const int tm, const int gi, const int minFaces, const int rollAngle,
-                            VecFunc &vec){
-        int ret = 0;
-          if (gi < 0) {
-              THFI_Param *param = new THFI_Param[tm];
-              ret = THFI_Create(tm, param);
-              delete[] param;
-          } else {
-              THFI_Param_Ex *param = new THFI_Param_Ex[tm];
-              THFI_Param detParam;
-              detParam.nMinFaceSize = minFaces;
-              detParam.nRollAngle = rollAngle;
-              for (int i = 0; i < tm; i++) {
-                  param[i].tp = detParam;
-                  param[i].nDeviceID = gi;
-              }
-              ret = THFI_Create_Ex(tm, param);
-              delete[] param;
-          }
-          if(ret != tm){
-              printf("create face detector failed!\n");
-          }else{
-              vec.emplace_back([]{THFI_Release();});
-          }
-          
-          return ret;
-    }
-
-    cFacePos* face_detect(int *faceCount, const cIMAGE *img, const int channel){
-        if(channel < 0 || !img){
-            return NULL;
-        }
-        cFacePos *fpos = NULL;
-        ::THFI_FacePos facesPos[30];
-        int faceNum = THFI_DetectFace(channel, (BYTE*)(img->data), 24, img->width, img->height, facesPos, 30);
-
-        if (faceNum > 0) {
-            fpos =  (cFacePos*)malloc(faceNum * sizeof(cFacePos));
-            *faceCount = faceNum;
-            memcpy(fpos, facesPos, sizeof(THFI_FacePos) * faceNum);
-            
-        }else{
-            // printf ("no face detected\n");
-        }
-        return fpos;
-    }
-    
-} // csdk_wrap
diff --git a/csrc/buz/face/detector.h b/csrc/buz/face/detector.h
deleted file mode 100644
index 8a4497d..0000000
--- a/csrc/buz/face/detector.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef _c_wrapper_face_detector_hpp_
-#define _c_wrapper_face_detector_hpp_
-
-#include "../base.hpp"
-
-
-struct _cFacePos;
-struct _cIMAGE;
-
-namespace csdk_wrap{
-
-    int init_face_detector(const int tm, const int gi, const int minFaces, const int rollAngle,
-                            VecFunc &vec);
-    cFacePos* face_detect(int *faceCount, const cIMAGE *img, const int channel);
-
-}
-
-#endif
\ No newline at end of file
diff --git a/csrc/buz/face/extractor.cpp b/csrc/buz/face/extractor.cpp
deleted file mode 100644
index 594eb1f..0000000
--- a/csrc/buz/face/extractor.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#include "extractor.h"
-
-#include "THFeature_i.h"
-#include "csdk_struct.h"
-
-namespace csdk_wrap{
-
-    int init_face_extractor(const int tm, const int gi, VecFunc &vec){
-        int ret = 0;
-        if (gi < 0) {
-            ret = EF_Init(tm);
-        } else {
-            EF_Param *param = new EF_Param[tm];
-            for (int i = 0; i < tm; i++) {
-                param[i].nDeviceID = gi;
-            }
-            ret = EF_Init_Ex(tm, param);
-            delete[] param;
-        }
-        if(ret != tm){
-            printf("create face extractor failed!\n");;
-        }else{
-            vec.emplace_back([]{EF_Release();});
-        }
-        return ret;
-    }
-
-    unsigned char* face_extract_feature(int *featLen, const cFacePos &pos, const cIMAGE *img, const int chan){
-        if(!img){
-            printf("face extract error, image or pos null\n");
-            return NULL;
-        }
-        *featLen = EF_Size();
-        unsigned char *feat = (unsigned char*)malloc(*featLen);
-        auto ret = EF_Extract(chan, (BYTE*)(img->data), img->width, img->height, 3, (THFI_FacePos*)(&pos), feat);
-        
-        if(ret != 1){
-            printf("face extract error %d\n", ret);
-            free(feat);
-            *featLen = 0;
-            return NULL;
-        }
-        return feat;
-    }
-
-    float face_compare(unsigned char *feat1, unsigned char *feat2){
-        if (!feat1 || !feat2){
-            return 0.0f;
-        }
-
-        return EF_Compare(feat1, feat2);
-    }
-
-}
\ No newline at end of file
diff --git a/csrc/buz/face/extractor.h b/csrc/buz/face/extractor.h
deleted file mode 100644
index 31bb712..0000000
--- a/csrc/buz/face/extractor.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef _c_wrapper_face_extractor_h_
-#define _c_wrapper_face_extractor_h_
-
-#include "../base.hpp"
-
-struct _cFacePos;
-struct _cIMAGE;
-
-namespace csdk_wrap{
-    int init_face_extractor(const int tm, const int gi, VecFunc &vec);
-    unsigned char* face_extract_feature(int *featLen, const cFacePos &pos, const cIMAGE *img, const int chan);
-    float face_compare(unsigned char *feat1, unsigned char *feat2);
-}
-#endif
\ No newline at end of file
diff --git a/csrc/buz/face/face.cpp b/csrc/buz/face/face.cpp
new file mode 100644
index 0000000..cfa7735
--- /dev/null
+++ b/csrc/buz/face/face.cpp
@@ -0,0 +1,203 @@
+#include "face.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "THFaceImage_i.h"
+#include "THFeature_i.h"
+#include "THFaceProperty_i.h"
+#include "THFaceTracking_i.h"
+
+#include "csdk_struct.h"
+
+namespace csdk_wrap{
+    sdkface::sdkface()
+    :fpos_(NULL)
+    ,featLen_(0)
+    ,feat_(NULL)
+    ,param_track_(NULL)
+    ,finfo_(NULL)
+    {}
+
+    sdkface::~sdkface(){
+        for(auto &i : dtors_){
+            i();
+        }
+
+        if (fpos_) free(fpos_);
+        if (feat_) free(feat_);
+        if (param_track_) free(param_track_);
+        if (finfo_) free(finfo_);
+    }
+
+    int sdkface::init_face_detector(const int tm, const int gi, const int minFaces, const int rollAngle){
+        int ret = 0;
+          if (gi < 0) {
+              THFI_Param *param = new THFI_Param[tm];
+              ret = THFI_Create(tm, param);
+              delete[] param;
+          } else {
+              THFI_Param_Ex *param = new THFI_Param_Ex[tm];
+              THFI_Param detParam;
+              detParam.nMinFaceSize = minFaces;
+              detParam.nRollAngle = rollAngle;
+              for (int i = 0; i < tm; i++) {
+                  param[i].tp = detParam;
+                  param[i].nDeviceID = gi;
+              }
+              ret = THFI_Create_Ex(tm, param);
+              delete[] param;
+          }
+          if(ret != tm){
+              printf("create face detector failed!\n");
+          }else{
+              dtors_.emplace_back([]{THFI_Release();});
+          }
+          
+          return ret;
+    }
+
+static const int maxFacePos = 30;
+
+    int sdkface::face_detect(const cIMAGE *img, const int chan, void **fpos, int *fcnt){
+        if(chan < 0 || !img || !img->data || img->width <= 0 || img->height <= 0){
+            return -1;
+        }
+
+        ::THFI_FacePos facesPos[maxFacePos];
+        int faceNum = THFI_DetectFace(chan, (BYTE*)(img->data), 24, img->width, img->height, facesPos, 30);
+
+        if (faceNum > 0) {
+            if (fpos_ == NULL){
+                fpos_ =  (cFacePos*)malloc(maxFacePos * sizeof(cFacePos));
+            }
+            memcpy(fpos_, facesPos, sizeof(THFI_FacePos) * faceNum);
+            *fcnt = faceNum;
+            *fpos = fpos_;
+        }
+        return faceNum;
+    }
+///////////////////////////////////////////////////
+    int sdkface::init_face_extractor(const int tm, const int gi){
+        int ret = 0;
+        if (gi < 0) {
+            ret = EF_Init(tm);
+        } else {
+            EF_Param *param = new EF_Param[tm];
+            for (int i = 0; i < tm; i++) {
+                param[i].nDeviceID = gi;
+            }
+            ret = EF_Init_Ex(tm, param);
+            delete[] param;
+        }
+        if(ret != tm){
+            printf("create face extractor failed!\n");;
+        }else{
+            dtors_.emplace_back([]{EF_Release();});
+        }
+        return ret;
+    }
+
+    int sdkface::face_extract_feature(const cFacePos &pos, const cIMAGE *img, const int chan, 
+                                        void **feat, int *featLen){
+        if(chan < 0 || !img || !img->data || img->width <= 0 || img->height <= 0){
+            printf("face extract error, image or pos null\n");
+            return -1;
+        }
+        *featLen = EF_Size();
+        if (featLen_ < *featLen){
+            free(feat_);
+            feat_ = (unsigned char*)malloc(*featLen);
+            featLen_ = *featLen;
+        }
+
+        auto ret = EF_Extract(chan, (BYTE*)(img->data), img->width, img->height, 3, 
+                                (THFI_FacePos*)(&pos), feat_);
+        
+        if(ret != 1){
+            printf("face extract error %d\n", ret);
+            return ret;
+        }
+        
+        *feat = feat_;
+
+        return *featLen;
+    }
+
+    float sdkface::face_compare(unsigned char *feat1, unsigned char *feat2){
+        if (!feat1 || !feat2){
+            return 0.0f;
+        }
+
+        return EF_Compare(feat1, feat2);
+    }
+
+////////////////////////////////////////////
+    int sdkface::init_face_property(const int tm){
+        auto ret = THFP_Create(tm);
+        if(ret != tm){
+            printf("create face property error\n");
+        }else{
+            dtors_.emplace_back([]{THFP_Release();});
+        }
+        return ret;
+    }
+
+    cThftResult sdkface::face_property(const cFacePos &pos, const cIMAGE *img, const int chan){
+        cThftResult result;
+        result.gender = result.age = result.race = -1;
+
+        auto ret = THFP_Execute_V2(chan, (BYTE*)(img->data), img->width, img->height,
+            (THFI_FacePos*)(&pos), (THFP_Result_V2*)(&result));
+        if(ret == 0){
+            // printf("property face gender %s, age %d, race %s, beauty level %d, smile_level %d\n", 
+            // result.gender ?"male":"female",
+            // result.age,
+            // result.race==2?"yello":"other",
+            // result.beauty_level, result.smile_level);
+        }
+        return result;
+    }
+/////////////////////////////////////////////////////
+    int sdkface::init_face_tracker(const int tm, const int gi,const int w, const int h,
+                              const int maxFaces, const int detinterval, const int sampleSize){
+        if (param_track_) return -1;
+        param_track_ = (THFT_Param*)malloc(sizeof(THFT_Param));
+
+        param_track_->nDeviceID = gi;
+        param_track_->nImageWidth = w;
+        param_track_->nImageHeight = h;
+        param_track_->nMaxFaceNum = maxFaces;
+        param_track_->nSampleSize = sampleSize > 0 ? sampleSize : w/2;
+        param_track_->nDetectionIntervalFrame = detinterval;
+
+        auto nNum = THFT_Create(tm, param_track_);
+        if(nNum != tm){
+            printf("create face detector failed!\n");
+        }else{
+            dtors_.emplace_back([]{THFT_Release();});
+        }
+        return nNum;
+
+    }
+
+    int sdkface::face_track(const cIMAGE *img, const int chan, void **fInfo, int *fcnt){
+        if (!param_track_) return -1;
+
+        if (!finfo_){
+            finfo_ = (cFaceInfo*)malloc(param_track_->nMaxFaceNum * sizeof(cFaceInfo));
+        }
+
+        *fcnt = 0;
+
+        auto nNum = THFT_FaceTracking(chan, img->data, (THFT_FaceInfo*)finfo_);
+        if (nNum > 0){
+            *fcnt = nNum;
+            *fInfo = finfo_;
+        }else{
+            *fInfo = NULL;
+        }
+        return nNum;
+    }
+}
\ No newline at end of file
diff --git a/csrc/buz/face/face.h b/csrc/buz/face/face.h
new file mode 100644
index 0000000..ef28b28
--- /dev/null
+++ b/csrc/buz/face/face.h
@@ -0,0 +1,43 @@
+#ifndef _sdk_face_h_
+#define _sdk_face_h_
+
+#include "../base.hpp"
+
+struct _cFacePos;
+struct _cIMAGE;
+struct THFT_Param;
+struct _cFaceInfo;
+
+namespace csdk_wrap{
+    class sdkface{
+    public: 
+        sdkface();
+        ~sdkface();
+    public: 
+        int init_face_detector(const int tm, const int gi, const int minFaces, const int rollAngle);
+        int face_detect(const cIMAGE *img, const int chan, void **fpos, int *fcnt);
+
+        int init_face_extractor(const int tm, const int gi);
+        int face_extract_feature(const cFacePos &pos, const cIMAGE *img, const int chan, void **feat, int *featLen);
+        float face_compare(unsigned char *feat1, unsigned char *feat2);
+
+        int init_face_property(const int tm);
+        cThftResult face_property(const cFacePos &pos, const cIMAGE *img, const int chan);
+
+        int init_face_tracker(const int tm, const int gi,const int w, const int h,
+                              const int maxFaces, const int detinterval, const int sampleSize);
+        int face_track(const cIMAGE *img, const int chan, void **fInfo, int *fcnt);
+    private: 
+        VecFunc dtors_;
+        // face detect
+        cFacePos *fpos_;
+        // face extract
+        int featLen_;
+        unsigned char *feat_;
+        // face track
+        THFT_Param *param_track_;
+        cFaceInfo *finfo_;
+    };
+}
+
+#endif
\ No newline at end of file
diff --git a/csrc/buz/face/property.cpp b/csrc/buz/face/property.cpp
deleted file mode 100644
index 74d4774..0000000
--- a/csrc/buz/face/property.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-#include "property.h"
-
-#include "THFaceProperty_i.h"
-#include "csdk_struct.h"
-
-namespace csdk_wrap{
-
-    int init_face_property(const int tm, VecFunc &vec){
-        auto ret = THFP_Create(tm);
-        if(ret != tm){
-            printf("create face property error\n");
-        }else{
-            vec.emplace_back([]{THFP_Release();});
-        }
-        return ret;
-    }
-
-    cThftResult face_property(const cFacePos &pos, const cIMAGE *img, const int chan){
-        cThftResult result;
-        result.gender = result.age = result.race = -1;
-
-        auto ret = THFP_Execute_V2(chan, (BYTE*)(img->data), img->width, img->height,
-            (THFI_FacePos*)(&pos), (THFP_Result_V2*)(&result));
-        if(ret == 0){
-            // printf("property face gender %s, age %d, race %s, beauty level %d, smile_level %d\n", 
-            // result.gender ?"male":"female",
-            // result.age,
-            // result.race==2?"yello":"other",
-            // result.beauty_level, result.smile_level);
-        }
-        return result;
-    }
-
-}
\ No newline at end of file
diff --git a/csrc/buz/face/property.h b/csrc/buz/face/property.h
deleted file mode 100644
index 39d3976..0000000
--- a/csrc/buz/face/property.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef _c_wrapper_face_property_h_
-#define _c_wrapper_face_property_h_
-
-#include "../base.hpp"
-
-struct _cThftResult;
-struct _cFacePos;
-struct _cIMAGE;
-
-namespace csdk_wrap{
-    int init_face_property(const int tm, VecFunc &vec);
-    cThftResult face_property(const cFacePos &pos, const cIMAGE *img, const int chan);
-}
-#endif
\ No newline at end of file
diff --git a/csrc/buz/face/tracker.cpp b/csrc/buz/face/tracker.cpp
deleted file mode 100644
index 85f4380..0000000
--- a/csrc/buz/face/tracker.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-#include "tracker.h"
-
-#include <stdio.h>
-#include "THFaceTracking_i.h"
-
-namespace csdk_wrap{
-    static THFT_Param param;
-    int init_face_tracker(const int tm, const int gi,const int w, const int h,
-                    const int maxFaces, const int detinterval,  const int sampleSize,
-                              VecFunc &vec){
-        param.nDeviceID = gi;
-        param.nImageWidth = w;
-        param.nImageHeight = h;
-        param.nMaxFaceNum = maxFaces;
-        param.nSampleSize = sampleSize > 0 ? sampleSize : w/2;
-        param.nDetectionIntervalFrame = detinterval;
-
-        auto nNum = THFT_Create(tm, &param);
-        if(nNum != tm){
-            printf("create face detector failed!\n");
-        }else{
-            vec.emplace_back([]{THFT_Release();});
-        }
-        return nNum;
-    }
-
-    cRECT* face_track_only(int *faceCount, const cIMAGE *img, const int chan){
-
-        *faceCount = 0;
-
-        cRECT *pFaces = (cRECT*)malloc(param.nMaxFaceNum * sizeof(cRECT));
-        auto nNum = THFT_FaceOnly(chan, img->data, img->width, img->height, (tagRECT*)pFaces, param.nMaxFaceNum, param.nSampleSize);
-        if (nNum > 0)
-        {
-            *faceCount = nNum;
-        }else{
-            free(pFaces);
-            pFaces = NULL;
-        }
-        return pFaces;
-    }
-
-    cFaceInfo* face_track_detect(int *faceCount, const cIMAGE *img, const int chan){
-        *faceCount = 0;
-
-        cFaceInfo* pFaceInfos = (cFaceInfo*)malloc(param.nMaxFaceNum * sizeof(cFaceInfo));
-        auto nNum = THFT_FaceDetect(chan, img->data, img->width, img->height, (THFT_FaceInfo*)pFaceInfos, param.nMaxFaceNum, param.nSampleSize);
-        if (nNum > 0){
-            *faceCount = nNum;
-        }else{
-            free(pFaceInfos);
-            pFaceInfos = NULL;
-        }
-        return pFaceInfos;
-    }
-
-    cFaceInfo* face_track(int *faceCount, const cIMAGE *img, const int chan){
-        *faceCount = 0;
-
-        cFaceInfo* pFaceInfos = (cFaceInfo*)malloc(param.nMaxFaceNum * sizeof(cFaceInfo));
-        auto nNum = THFT_FaceTracking(chan, img->data, (THFT_FaceInfo*)pFaceInfos);
-        if (nNum > 0){
-            *faceCount = nNum;
-        }else{
-            free(pFaceInfos);
-            pFaceInfos = NULL;
-        }
-        return pFaceInfos;
-    }
-
-}
\ No newline at end of file
diff --git a/csrc/buz/face/tracker.h b/csrc/buz/face/tracker.h
deleted file mode 100644
index 1d71ba1..0000000
--- a/csrc/buz/face/tracker.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef _c_wrapper_face_tracker_h_
-#define _c_wrapper_face_tracker_h_
-
-#include "../base.hpp"
-
-struct _cRECT;
-struct _cFaceInfo;
-struct _cIMAGE;
-
-namespace csdk_wrap{
-    int init_face_tracker(const int tm, const int gi,const int w, const int h,
-                              const int maxFaces, const int detinterval, const int sampleSize,
-                              VecFunc &vec);
-    cRECT* face_track_only(int *faceCount, const cIMAGE *img, const int chan);
-    cFaceInfo* face_track_detect(int *faceCount, const cIMAGE *img, const int chan);
-
-    cFaceInfo* face_track(int *faceCount, const cIMAGE *img, const int chan);
-}
-#endif
\ No newline at end of file
diff --git a/csrc/buz/yolo/detector.cpp b/csrc/buz/yolo/detector.cpp
deleted file mode 100644
index 1ca2bfe..0000000
--- a/csrc/buz/yolo/detector.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-#include "detector.h"
-
-#include <stdlib.h>
-#include <fstream>
-
-#include <sys/time.h>
-
-#include "csdk_struct.h"
-
-#include "yolo.hpp"
-
-namespace csdk_wrap{
-
-    static std::vector<std::string> names;
-
-    static void objects_names_from_file(std::string filename) {
-        std::ifstream file(filename);
-
-        if (!file.is_open()){
-            printf("open %s file error\n", filename.c_str());
-            return;
-        }
-        for(std::string line; getline(file, line);) names.push_back(line);
-
-        printf("names count %d\n", names.size());
-    }
-
-    void* init_yolo_detector(const char *cfg, const char *weights, const char *name,
-                    const int gpu_index, VecFunc &vec){
-
-        if(!cfg || !weights || !name){
-            printf("init Detector error\n");
-            return NULL;
-        }
-    
-        if(names.empty())
-            objects_names_from_file(name);
-
-        auto det = new Detector(cfg, weights, gpu_index);
-        vec.emplace_back([det]{delete det;});
-
-        return det;
-    }
-
-    image_t* buffer_to_image(const unsigned char *data, const int w, const int h, const int color_channel){
-        int size = w*h;
-        int size2 = size*2;
-    
-        int c = color_channel;
-        image_t *img = new image_t;
-        img->h = h;
-        img->w = w;
-        img->c = color_channel;
-        img->data = (float*)calloc(h*w*c, sizeof(float));
-        // image im = make_image(w, h, c);
-        const unsigned char *srcData = data;
-    
-        int count = 0;
-        switch(c){
-            case 1:{
-                for (; count < size; ){
-                    img->data[count] = 
-                    img->data[w*h + count] = 
-                    img->data[w*h*2 + count] = 
-                    (float)(srcData[count])/255.0;
-    
-                    ++count;
-                }
-                break;
-            }
-            case 3:{
-                float* desData = img->data;
-    
-                for(int i = 0;i<size;i++){
-                    *(desData) = *(srcData + 2) /255.0f;
-                    *(desData+size) = *(srcData + 1) /255.0f;
-                    *(desData+size2) = *(srcData) /255.0f;
-    
-                    desData++;
-                    srcData+=3;
-                }
-                break;
-            }
-    
-            default:
-                printf("Channel number not supported.\n");
-                break;
-        }
-
-	    return img;
-    }
-
-    cObjInfo* yolo_detect(void *handle,int *objCount, const cIMAGE *img,  const float thrsh, const bool use_mean){
-        Detector *det = (Detector*)handle;
-
-        const int color_channel = img->channel;
-        image_t* im = buffer_to_image(img->data, img->width, img->height, color_channel);
-
-        // struct timeval b,e;
-        // gettimeofday(&b, NULL);
-        
-        std::vector<bbox_t> result_vec = det->detect(*im, thrsh, use_mean);
-		det->free_image(*im);
-        delete im;
-
-        // gettimeofday(&e,NULL);
-        // double t = e.tv_sec*1000.0 + e.tv_usec/1000.0 - b.tv_sec*1000.0-b.tv_usec/1000.0;
-        // printf("lib yolo detect use time %f ms\n", t);
-
-        cObjInfo *infos = NULL;
-        if(!result_vec.empty()){
-            infos = (cObjInfo*)malloc(result_vec.size() * sizeof(cObjInfo));
-        }
-
-        int count = 0;
-        for(auto &i : result_vec){
-            
-            cObjInfo info;
-            info.typ = i.obj_id;
-            info.prob = i.prob;
-            info.rcObj.left = i.x;
-			info.rcObj.top = i.y;
-			info.rcObj.right = i.x+i.w;
-            info.rcObj.bottom = i.y+i.h;
-            
-            infos[count++] = info;
-        }
-        
-        *objCount = count;
-
-        return infos;
-    }
-
-    const char* yolo_obj_name_by_type(const int typ){
-        if(names.empty() || typ < 0 || typ >= names.size()) return NULL;
-        return names.at(typ).c_str();
-    }
-}
-
diff --git a/csrc/buz/yolo/detector.h b/csrc/buz/yolo/detector.h
deleted file mode 100644
index 1f263b8..0000000
--- a/csrc/buz/yolo/detector.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef _c_wrapper_yolo_detector_h_
-#define _c_wrapper_yolo_detector_h_
-
-#include "../base.hpp"
-
-struct _cObjInfo;
-struct _cIMAGE;
-
-struct image_t;
-
-
-namespace csdk_wrap{
-    void* init_yolo_detector(const char *cfg, const char *weights, const char *name,
-                    const int gpu_index, VecFunc &vec);
-    image_t* buffer_to_image(const unsigned char *data, const int w, const int h, const int color_channel);
-    cObjInfo* yolo_detect(void *handle,int *objCount, const cIMAGE *img, const float thrsh, const bool use_mean);
-
-    const char* yolo_obj_name_by_type(const int typ);
-}
-
-#endif
\ No newline at end of file
diff --git a/csrc/buz/yolo/yolo.cpp b/csrc/buz/yolo/yolo.cpp
new file mode 100644
index 0000000..362a763
--- /dev/null
+++ b/csrc/buz/yolo/yolo.cpp
@@ -0,0 +1,148 @@
+#include "yolo.h"
+
+#include <fstream>
+
+#include "yolo.hpp"
+
+namespace csdk_wrap{
+    sdkyolo::sdkyolo()
+    :objInfo_(NULL)
+    ,objCount_(0)
+    ,image_(NULL)
+    ,width_(0)
+    ,height_(0)
+    ,channel_(3)
+    {}
+
+    sdkyolo::~sdkyolo(){
+        for(auto i : detors_){
+            delete i;
+        }
+        if (objInfo_) free(objInfo_);
+    }
+
+    int sdkyolo::buffer_to_image(const unsigned char *data, const int w, const int h, const int color_channel){
+        int size = w*h;
+        int size2 = size*2;
+    
+        int c = color_channel;
+        if (w != width_ || h != height_ || color_channel != channel_){
+            if (image_){
+                free(image_->data);
+                delete image_;
+            }
+            image_ = new image_t;
+            image_->h = h;
+            image_->w = w;
+            image_->c = c;
+            image_->data = (float*)calloc(h*w*c, sizeof(float));
+        }
+
+        // image im = make_image(w, h, c);
+        const unsigned char *srcData = data;
+    
+        int count = 0;
+        switch(c){
+            case 1:{
+                for (; count < size; ){
+                    image_->data[count] = 
+                    image_->data[w*h + count] = 
+                    image_->data[w*h*2 + count] = 
+                    (float)(srcData[count])/255.0;
+    
+                    ++count;
+                }
+                break;
+            }
+            case 3:{
+                float* desData = image_->data;
+    
+                for(int i = 0;i<size;i++){
+                    *(desData) = *(srcData + 2) /255.0f;
+                    *(desData+size) = *(srcData + 1) /255.0f;
+                    *(desData+size2) = *(srcData) /255.0f;
+    
+                    desData++;
+                    srcData+=3;
+                }
+                break;
+            }
+    
+            default:
+                printf("Channel number not supported.\n");
+                break;
+        }
+
+	    return 0;
+    }
+
+    void sdkyolo::objects_names_from_file(std::string filename){
+        std::ifstream file(filename);
+
+        if (!file.is_open()){
+            printf("open %s file error\n", filename.c_str());
+            return;
+        }
+        for(std::string line; getline(file, line);) names_.push_back(line);
+
+        printf("names count %d\n", names_.size());
+    }
+
+    const char* sdkyolo::yolo_obj_name_by_type(const int typ){
+        if(names_.empty() || typ < 0 || typ >= names_.size()) return NULL;
+        return names_.at(typ).c_str();
+    }
+
+    void* sdkyolo::init_yolo(const char *cfg, const char *weights, const char *name, const int gi){
+        if(!cfg || !weights || !name){
+            printf("init Detector error\n");
+            return NULL;
+        }
+    
+        if(names_.empty())
+            objects_names_from_file(name);
+
+        auto det = new Detector(cfg, weights, gi);
+        detors_.push_back(det);
+
+        return det;
+    }
+
+    int sdkyolo::yolo_detect(void *handle, const cIMAGE *img, const float thrsh, const bool use_mean, void **objs, int *objCount){
+        Detector *det = (Detector*)handle;
+
+        const int color_channel = img->channel;
+        buffer_to_image(img->data, img->width, img->height, color_channel);
+
+        
+        std::vector<bbox_t> result_vec = det->detect(*image_, thrsh, use_mean);
+		// det->free_image(*im);
+        // delete im;
+
+        if (objCount_ < result_vec.size()){
+            free(objInfo_);
+
+            objCount_ = result_vec.size();
+            objInfo_ = (cObjInfo*)malloc(objCount_ * sizeof(cObjInfo));
+        }
+
+        int count = 0;
+        for(auto &i : result_vec){
+            
+            cObjInfo info;
+            info.typ = i.obj_id;
+            info.prob = i.prob;
+            info.rcObj.left = i.x;
+			info.rcObj.top = i.y;
+			info.rcObj.right = i.x+i.w;
+            info.rcObj.bottom = i.y+i.h;
+            
+            objInfo_[count++] = info;
+        }
+        
+        *objCount = objCount_;
+        *objs = objInfo_;
+
+        return objCount_;
+    }
+}
\ No newline at end of file
diff --git a/csrc/buz/yolo/yolo.h b/csrc/buz/yolo/yolo.h
new file mode 100644
index 0000000..1a86e48
--- /dev/null
+++ b/csrc/buz/yolo/yolo.h
@@ -0,0 +1,41 @@
+#ifndef _sdk_yolo_h_
+#define _sdk_yolo_h_
+
+#include <vector>
+#include <string>
+
+struct _cObjInfo;
+struct _cIMAGE;
+
+struct image_t;
+
+class Detector;
+
+namespace csdk_wrap{
+    class sdkyolo{
+    public: 
+        sdkyolo();
+        ~sdkyolo();
+    public: 
+        void* init_yolo(const char *cfg, const char *weights, const char *name, const int gi);
+        int yolo_detect(void *handle, const cIMAGE *img, const float thrsh, const bool use_mean, void **objs, int *objCount);
+        const char* yolo_obj_name_by_type(const int typ);
+
+    private: 
+        int buffer_to_image(const unsigned char *data, const int w, const int h, const int color_channel);
+        void objects_names_from_file(std::string filename);
+    private: 
+        std::vector<std::string> names_;
+        std::vector<Detector*> detors_;
+
+        cObjInfo *objInfo_;
+        int objCount_;
+        // image_t
+        image_t *image_;
+        int width_;
+        int height_;
+        int channel_;
+    };
+}
+
+#endif
\ No newline at end of file
diff --git a/gosdk.go b/gosdk.go
index 4f9eb45..f8c5861 100644
--- a/gosdk.go
+++ b/gosdk.go
@@ -84,7 +84,6 @@
 	var count C.int
 	cfpos := C.c_api_face_detect(&count, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch))
 	if cfpos != nil {
-		defer C.free(unsafe.Pointer(cfpos))
 		return CFacePosArrayToGoArray(unsafe.Pointer(cfpos), int(count))
 	}
 	return nil
@@ -113,7 +112,6 @@
 	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
 
 	p := C.c_api_face_extract(&featLen, pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch))
-	defer C.free(unsafe.Pointer(p))
 	b := C.GoBytes(unsafe.Pointer(p), featLen)
 	return b
 }
@@ -122,36 +120,6 @@
 func FaceCompare(feat1 []byte, feat2 []byte) float32 {
 	res := C.c_api_face_compare((*C.uchar)(unsafe.Pointer(&feat1[0])), (*C.uchar)(unsafe.Pointer(&feat2[0])))
 	return float32(res)
-}
-
-// FaceTrackOnly face tracker face only
-func FaceTrackOnly(img SDKImage, ch int) []CRECT {
-	data := img.Data
-	w := img.Width
-	h := img.Height
-
-	var fCount C.int
-	rect := C.c_api_face_track_only(&fCount, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch))
-	if rect != nil {
-		defer C.free(unsafe.Pointer(rect))
-		return CRECTArrayToGoArray(unsafe.Pointer(rect), int(fCount))
-	}
-	return nil
-}
-
-// FaceTrackDetect face tracker face detect
-func FaceTrackDetect(img SDKImage, ch int) []CFaceInfo {
-	data := img.Data
-	w := img.Width
-	h := img.Height
-
-	var fCount C.int
-	finfo := C.c_api_face_track_only(&fCount, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch))
-	if finfo != nil {
-		defer C.free(unsafe.Pointer(finfo))
-		return CFaceInfoArrayToGoArray(unsafe.Pointer(finfo), int(fCount))
-	}
-	return nil
 }
 
 // FaceTrackingInfo face track info
@@ -171,7 +139,6 @@
 	if cFinfo == nil {
 		return
 	}
-	defer C.free(unsafe.Pointer(cFinfo))
 	goFinfo := CFaceInfoArrayToGoArray(unsafe.Pointer(cFinfo), int(fCount))
 
 	// 绌猴紝娣诲姞
@@ -244,7 +211,6 @@
 	if cFinfo == nil {
 		return faces
 	}
-	defer C.free(unsafe.Pointer(cFinfo))
 	faces = CFaceInfoArrayToGoArray(unsafe.Pointer(cFinfo), int(fCount))
 	//if len(faces) > 0{
 	// fmt.Println("faces detected:", len(faces))
@@ -265,7 +231,6 @@
 	cobjinfo := C.c_api_yolo_detect(handle.handle, &count, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.float(thrsh), C.int(umns))
 
 	if cobjinfo != nil {
-		defer C.free(unsafe.Pointer(cobjinfo))
 		return CYoloObjInfoArrayToGoArray(unsafe.Pointer(cobjinfo), int(count))
 	}
 	return nil

--
Gitblit v1.8.0