Пример #1
0
int main(int argc, char* argv[]) {
  if (argc != 2) {
    printf("usages: %s dir_name\n", argv[0]);
    return 0;
  }
  std::string dir_path(argv[1]);
  std::vector < std::string > file_path_array;

  FaceDetector* detector = new FaceDetector;
  detector->init("data/front_15_cascade.xml");

  CFaceFeature* descriptor = new CFaceFeature;
  descriptor->LoadFaceAsm("data/facelandmark");
  FaceClustering* facecluster = new FaceClustering;
  Load(dir_path, file_path_array);
  std::vector<float*> vec_feature_buffer;
  for (size_t i = 0; i < file_path_array.size(); i++) {
    Mat pImage = cv::imread(file_path_array[i].c_str(), 1);
    int imWeight = pImage.cols;
    int imHeight = pImage.rows;

    Mat dImage;
    cv::cvtColor(pImage, dImage, CV_BGR2GRAY);
    vector < FRECT > faceSet;
    bool b;
    {
      PTIME(pt1, "detect face", true, 5);

      b = detector->detectFace(dImage.data, imWeight, imHeight, faceSet);
    }
    if (b) {
      int n = faceSet.size();
      std::string s = n > 1 ? "faces" : "face";
      std::cout << file_path_array[i] << " detect " << n << " " << s << endl;
    } else {

      std::cout << file_path_array[i] << " did not detect face(s)" << endl;
      continue;
    }
    vector < rect > faceRegion;

    for (int i = 0; i < faceSet.size(); i++) {
      rect faceRect;
      faceRect.x0 = faceSet[i].x;
      faceRect.y0 = faceSet[i].y;
      faceRect.x1 = faceSet[i].x + faceSet[i].w - 1;
      faceRect.y1 = faceSet[i].y + faceSet[i].h - 1;
      faceRegion.push_back(faceRect);
      std::cout << faceRect.x0 << " " << faceRect.y0 << " " << faceRect.x1
          << " " << faceRect.y1 << "\n";
    }

    if (faceSet.size() > 0) {

      std::vector<float*> featureBuffer;
      {
        PTIME(pt1, "extractFeature", true, 5);

        descriptor->extractFeature(dImage.data, imWeight, imHeight, faceRegion,
                                   featureBuffer);
      }
      cout << endl;
      vec_feature_buffer.insert(
          vec_feature_buffer.begin() + vec_feature_buffer.size(),
          featureBuffer.begin(), featureBuffer.end());
    }
  }
  vector<int> clusterNum(vec_feature_buffer.size(), -1);
  cout << "total " << clusterNum.size() << " features to cluster\n";
  {
    PTIME(pt1, "cluster", true, 5);
    facecluster->cluster(vec_feature_buffer, clusterNum);
  }
  for (int i = 0; i < clusterNum.size(); i++) {
    cout << clusterNum[i] << ",";
  }
  cout << endl;
  return 0;
}