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; }