houxiao
2017-06-29 9ee90782bf14b91442cd524bc033bbf6d1778bb2
FaceServer/STFaceCache.cpp
@@ -23,6 +23,16 @@
   STFaceCacheContext() : handle_verify(nullptr), handle_detect(nullptr)
   {
   }
   stface_handles getStFaceHandles()
   {
      //return (stface_handles*)this;
      stface_handles handles;
      handles.handle_verify = handle_verify;
      handles.handle_detect = handle_detect;
      return handles;
   }
};
struct STFaceDBContext
@@ -254,7 +264,7 @@
         return detect_neg(img);
      }
      
      return FDP_FaceDetectResult(img.db_id, result[0].idx, result[0].score);
      return FDP_FaceDetectResult(img.db_id, result[0].idx, result[0].score * 1000);
   }
   return FDP_FDR_INVALID;
@@ -320,3 +330,70 @@
   else
      return FDP_FaceDetectResult(img.db_id, idx, 0);
}
FDP_FaceDetectResult STFaceCache::compare(const STFaceImage& img1, const STFaceImage& img2)
{
   stface_ctx_map_t& dbContext(*(stface_ctx_map_t*)_dbContext);
   STFaceCacheContext& cacheContext(*(STFaceCacheContext*)_cacheContext);
   stface_handles handles(cacheContext.getStFaceHandles());
   float c = stface_compare(handles, img1, img2);
   FDP_FaceDetectResult result(0, 0, int(c * 1000));
   return result;
}
void STFaceCache::search(const STFaceImage& img, fdr_vec_t& topResult)
{
   stface_ctx_map_t& dbContext(*(stface_ctx_map_t*)_dbContext);
   STFaceCacheContext& cacheContext(*(STFaceCacheContext*)_cacheContext);
   /*
   for(stface_ctx_map_t::iterator iterCtx = dbContext.begin(); iterCtx != dbContext.end(); ++iterCtx)
   {
      STFaceDBContext& ctx(iterCtx->second);
      if (!ctx.dbLoadOK)
      {
         LOG_WARN << "dbLoadOK return false" << LOG_ENDL;
         continue;
      }
      top_idx_score_vect_t result;
      if (!stface_search_db(ctx.handles, img, result))
      {
         LOG_WARN << "stface_search_db return false" << LOG_ENDL;
         continue;
      }
      if (result.empty())
      {
         LOG_INFO << "stface_search_db return empty" << LOG_ENDL;
         continue;
      }
      for(top_idx_score_vect_t::iterator it = result.begin(); it != result.end(); ++it)
      {
         if(topResult.empty())
            topResult.push_back(FDP_FaceDetectResult(ctx.dbid, it->idx, it->score * 1000));
         int16_t new_confidence = it->score * 1000;
         else if(new_confidence > topResult.rbegin()->confidence)
         {
            while(topResult.size() > 4)
               topResult.pop_back();
            for(fdr_vec_t::reverse_iterator rtTR = topResult.rbegin() + 1; rtTR != topResult.rend(); ++rtTR)
            {
               if(new_confidence < rtTR->confidence)
                  topResult.insert(rtTR, FDP_FaceDetectResult(ctx.dbid, it->idx, new_confidence));
            }
         }
      }
      //LOGP(INFO, "stface_search_db return dbid=%d, idx=%d, score=%f", img.db_id, result[0].idx, result[0].score);
   }
   */
   topResult.push_back(FDP_FaceDetectResult(1, 2, 3));
   topResult.push_back(FDP_FaceDetectResult(-1, 2, 4));
   topResult.push_back(FDP_FaceDetectResult(1, 6, 5));
   return FDP_FaceDetectResult(img.db_id, result[0].idx, result[0].score * 1000);
}