int main(int argc, char** argv) { // check arguments if (argc != 3 && argc != 4) { printf("Usage: PartsBasedDetector model_file image_file [depth_file]\n"); exit(-1); } // determine the type of model to read boost::scoped_ptr<Model> model; string ext = boost::filesystem::path(argv[1]).extension().string(); if (ext.compare(".xml") == 0 || ext.compare(".yaml") == 0) { model.reset(new FileStorageModel); } else if (ext.compare(".mat") != 0) { model.reset(new MatlabIOModel); } else { printf("Unsupported model format: %s\n", ext.c_str()); exit(-2); } bool ok = model->deserialize(argv[1]); if (!ok) { printf("Error deserializing file\n"); exit(-3); } // create the PartsBasedDetector and distribute the model parameters PartsBasedDetector<float> pbd; pbd.distributeModel(*model); // load the image from file Mat_<float> depth; Mat im = imread(argv[2]); if (im.empty()) { printf("Image not found or invalid image format\n"); exit(-4); } // detect potential candidates in the image double t = (double)getTickCount(); vector<Candidate> candidates; pbd.detect(im, depth, candidates); printf("Detection time: %f\n", ((double)getTickCount() - t)/getTickFrequency()); printf("Number of candidates: %ld\n", candidates.size()); // display the best candidates Visualize visualize(model->name()); SearchSpacePruning<float> ssp; Mat canvas; if (candidates.size() > 0) { Candidate::sort(candidates); //Candidate::nonMaximaSuppression(im, candidates, 0.2); visualize.candidates(im, candidates, canvas, true); visualize.image(canvas); waitKey(); } return 0; }
int main(int argc, char** argv) { /*int padding = 12; int interval = 10; // check arguments if (argc != 3 && argc != 4) { printf("Usage: PartsBasedDetector model_file image_file [depth_file]\n"); exit(-1); } vector<FFLD::HOGPyramid::Matrix> scores; vector<FFLD::Mixture::Indices> argmaxes; vector<vector<vector<FFLD::Model::Positions> > > positions; const string file("../tmp.jpg"); cout << file << endl; FFLD::JPEGImage image(file); FFLD::HOGPyramid pyramidFFLD(image, padding, padding, interval); if (!FFLD::Patchwork::Init((pyramidFFLD.levels()[0].rows() - padding + 15) & ~15, (pyramidFFLD.levels()[0].cols() - padding + 15) & ~15)) { cerr << "\nCould not initialize the Patchwork class" << endl; return -1; } cout << "Initialized FFTW in " << stop() << " ms" << endl; FFLD::Mixture mixture; string modelffld("../model_car_final-1.2.4.txt"); cout << modelffld << endl; ifstream in(modelffld.c_str(), ios::binary); if (!in.is_open()) { //showUsage(); cerr << "\nInvalid model file " << modelffld << endl; return -1; } in >> mixture; //mixture.convolve(pyramidFFLD, scores, argmaxes, &positions);//full ffld run cout << "Convolution :p " << endl; const int nbModels = mixture.models().size(); const int nbLevels = pyramidFFLD.levels().size(); // Convolve with all the models vector<vector<FFLD::HOGPyramid::Matrix> > tmp(nbModels); //convolve(pyramid, tmp, positions);//going inside // Transform the filters if needed #pragma omp critical //if (mixture.filterCache_.empty()) mixture.cacheFilters(); // Create a patchwork const FFLD::Patchwork patchwork(pyramidFFLD); // Convolve the patchwork with the filters std::vector<FFLD::Patchwork::Filter> filterCache_; filterCache_ = mixture.filterCacheObj(); vector<vector<FFLD::HOGPyramid::Matrix> > convolutions(filterCache_.size()); patchwork.convolve(filterCache_, convolutions);///convolve patch with filters, const int tmpnbFilters = 54, tmpnbPlanes = 12, tmpnbLevels = 41; //nb filters is number of filters (Read from model.txt) // nblevels is number of HOGPyramid levels // nbplanes comes from converting pyramid to patchwork, rectangle logic ? /* Mat C; for (int i = 0; i < tmpnbFilters * tmpnbPlanes; ++i) { const int k = i / tmpnbPlanes; // Filter index const int l = i % tmpnbPlanes; // Plane index for (int j = 0; j < tmpnbLevels; ++j) { FFLD::HOGPyramid::Matrix ffldResponse = convolutions[k][j]; FFLD::HOGPyramid::Matrix tempffldResponse; eigen2cv(ffldResponse,C); cv2eigen(C,tempffldResponse); cout << "ffldResponse dim " << ffldResponse.rows() << " " << ffldResponse.cols() << " C dim " << C.rows << " " << C.cols << " ffld::Eigen dim " << tempffldResponse.rows() << " " << tempffldResponse.cols() <<endl; } }*/ //cout << " convolution size " << convolutions.size() << "rows " << convolutions[1].rows() << endl; // convert the convolusions Eigen matrix to cvMat obj //cout << " Mixture model size " << nbModels << endl; // determine the type of model to read cout << " Now starting Bristow " << endl; boost::scoped_ptr<Model> model; string ext = boost::filesystem::path(argv[1]).extension().string(); if (ext.compare(".xml") == 0 || ext.compare(".yaml") == 0) { model.reset(new FileStorageModel); } #ifdef WITH_MATLABIO else if (ext.compare(".mat") == 0) { model.reset(new MatlabIOModel); } #endif else { printf("Unsupported model format: %s\n", ext.c_str()); exit(-2); } bool ok = model->deserialize(argv[1]); if (!ok) { printf("Error deserializing file\n"); exit(-3); } cout << " Calling Distribute Model " << endl; // create the PartsBasedDetector and distribute the model parameters PartsBasedDetector<float> pbd; pbd.distributeModel(*model); cout << " After Distribute Model " << endl; // load the image from file Mat_<float> depth; Mat im = imread(argv[2]); if (im.empty()) { printf("Image not found or invalid image format\n"); exit(-4); } if (argc == 4) { depth = imread(argv[3], CV_LOAD_IMAGE_ANYDEPTH); // convert the depth image from mm to m depth = depth / 1000.0f; } // detect potential candidates in the image double t = (double)getTickCount(); vector<Candidate> candidates; pbd.detect(im, depth, candidates); cout << " image dim " << im.rows << " " << im.cols << endl; printf("Detection time: %f\n", ((double)getTickCount() - t)/getTickFrequency()); printf("Number of candidates: %ld\n", candidates.size()); // display the best candidates Visualize visualize(model->name()); SearchSpacePruning<float> ssp; Mat canvas; if (candidates.size() > 0) { Candidate::sort(candidates); Candidate::nonMaximaSuppression(im, candidates, 0.2); visualize.candidates(im, candidates, canvas, true); visualize.image(canvas); waitKey(); } return 0; }