From b63c8219736016e3b3952465f41abede37a38fbd Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期三, 11 十二月 2019 11:44:06 +0800
Subject: [PATCH] update

---
 csrc/yolo.cpp |  103 ++++++++++++++++++++-------------------------------
 1 files changed, 41 insertions(+), 62 deletions(-)

diff --git a/csrc/yolo.cpp b/csrc/yolo.cpp
index b217ff5..59810d3 100644
--- a/csrc/yolo.cpp
+++ b/csrc/yolo.cpp
@@ -4,33 +4,16 @@
 
 #include <fstream>
 #include <vector>
+#include <string>
 #include <stdexcept>
 
 #include "struct.h"
 
 namespace cppyolo
 {
-    sdkyolo::sdkyolo(const char *cfg, const char *weights, const char *name, const int gpu)
-    :det_(NULL)
-    ,infos_(NULL)
-    ,obj_cnt_(0)
-    ,image_(NULL)
-    ,width_(0)
-    ,height_(0)
-    ,channel_(0)
-    {
-        names_.clear();
-        if (!init(cfg, weights, name, gpu)){
-			throw std::runtime_error("init yolo error");
-        }
-    }
+    static std::vector<std::string> names;
 
-    sdkyolo::~sdkyolo()
-    {
-        if (det_) delete det_;
-    }
-
-    static void objects_names_from_file(std::string filename, std::vector<std::string> &names){
+    static void objects_names_from_file(std::string filename){
         std::ifstream file(filename);
 
         if (!file.is_open()){
@@ -42,44 +25,41 @@
         printf("names count %d\n", names.size());
     }
 
-    const char* sdkyolo::obj_name_by_type(const int typ)const{
-        if(names_.empty() || typ < 0 || typ >= names_.size()) return NULL;
-        return names_.at(typ).c_str();
+    const char* obj_name_by_type(const int typ){
+        if(names.empty() || typ < 0 || typ >= names.size()) return NULL;
+        return names.at(typ).c_str();
     }
 
-    bool sdkyolo::init(const char *cfg, const char *weights, const char *name, const int gpu){
-        if (det_) return true;
-
+    void *init(const char *cfg, const char *weights, const char *name, const int gpu){
         if(!cfg || !weights || !name){
             printf("init Detector error\n");
             return false;
         }
     
-        if(names_.empty())
-            objects_names_from_file(name, names_);
+        if(names.empty())
+            objects_names_from_file(name);
 
-        det_ = new Detector(cfg, weights, gpu);
-        return true;
+        return new Detector(cfg, weights, gpu);
     }
 
-    int sdkyolo::buffer_to_image(const unsigned char *data, const int w, const int h, const int color_channel){
+    void release(void *handle){
+        if (handle){
+            Detector *d = (Detector*)handle;
+            delete d;
+        }
+    }
+
+    static 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;
-        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_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;
     
@@ -87,9 +67,9 @@
         switch(c){
             case 1:{
                 for (; count < size; ){
-                    image_->data[count] = 
-                    image_->data[w*h + count] = 
-                    image_->data[w*h*2 + count] = 
+                    img->data[count] = 
+                    img->data[w*h + count] = 
+                    img->data[w*h*2 + count] = 
                     (float)(srcData[count])/255.0;
     
                     ++count;
@@ -97,7 +77,7 @@
                 break;
             }
             case 3:{
-                float* desData = image_->data;
+                float* desData = img->data;
     
                 for(int i = 0;i<size;i++){
                     *(desData) = *(srcData + 2) /255.0f;
@@ -115,25 +95,24 @@
                 break;
         }
 
-	    return 0;
+	    return img;
     }
 
-    int sdkyolo::detect(const cIMAGE *img, const float thrsh, const bool use_mean, void **objs, int *objCount){
-        if (!det_) return -1;
+    int detect(void *handle, const cIMAGE *img, const float thrsh, const bool use_mean, void **objs, int *objCount){
+        if (!handle || !img || img->width <= 0 || img->height <= 0 || !img->data) return -1;
+
+        Detector *d = (Detector*)handle;
 
         const int color_channel = img->channel;
-        buffer_to_image(img->data, img->width, img->height, color_channel);
-
+        image_t *image = 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;
+        std::vector<bbox_t> result_vec = d->detect(*image, thrsh, use_mean);
+		d->free_image(*image);
+        delete image;
 
-        if (obj_cnt_ < result_vec.size()){
-            free(infos_);
-
-            obj_cnt_ = result_vec.size();
-            infos_ = (cObjInfo*)malloc(obj_cnt_ * sizeof(cObjInfo));
+        cObjInfo *infos = NULL;
+        if(!result_vec.empty()){
+            infos = (cObjInfo*)malloc(result_vec.size() * sizeof(cObjInfo));
         }
 
         int count = 0;
@@ -147,11 +126,11 @@
 			info.rcObj.right = i.x+i.w;
             info.rcObj.bottom = i.y+i.h;
             
-            infos_[count++] = info;
+            infos[count++] = info;
         }
         
         *objCount = count;
-        *objs = infos_;
+        *objs = infos;
 
         return count;
     }

--
Gitblit v1.8.0