#include "detector.h" #include #include #include #include "csdk_struct.h" #include "yolo.hpp" namespace csdk_wrap{ static std::vector 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;ichannel; image_t* im = buffer_to_image(img->data, img->width, img->height, color_channel); // struct timeval b,e; // gettimeofday(&b, NULL); std::vector 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(); } }