void ASiftDetector::detectAndCompute(const Mat& img, std::vector< KeyPoint >& keypoints, Mat& descriptors) { keypoints.clear(); descriptors = Mat(0, 128, CV_32F); for(int tl = 1; tl < 6; tl++) { double t = pow(2, 0.5*tl); for(int phi = 0; phi < 180; phi += 72.0/t) { std::vector<KeyPoint> kps; Mat desc; Mat timg, mask, Ai; img.copyTo(timg); affineSkew(t, phi, timg, mask, Ai); #if 0 Mat img_disp; bitwise_and(mask, timg, img_disp); namedWindow( "Skew", WINDOW_AUTOSIZE );// Create a window for display. imshow( "Skew", img_disp ); waitKey(0); #endif SiftFeatureDetector detector; detector.detect(timg, kps, mask); SiftDescriptorExtractor extractor; extractor.compute(timg, kps, desc); for(unsigned int i = 0; i < kps.size(); i++) { Point3f kpt(kps[i].pt.x, kps[i].pt.y, 1); Mat kpt_t = Ai*Mat(kpt); kps[i].pt.x = kpt_t.at<float>(0,0); kps[i].pt.y = kpt_t.at<float>(1,0); } keypoints.insert(keypoints.end(), kps.begin(), kps.end()); descriptors.push_back(desc); } } }
/*! */ int HEG_system::read(vector <string> & words, unsigned int & pos) { const int ndim=3; int startpos=pos; vector <string> latvectxt; vector <string> spintxt; if(!readsection(words, pos, spintxt, "NSPIN")) { error("Need NSPIN in HEG system"); } nspin.Resize(2); nspin(0)=atoi(spintxt[0].c_str()); nspin(1)=atoi(spintxt[1].c_str()); totnelectrons=nspin(0)+nspin(1); vector <string> ktxt; if(readsection(words, pos=0, ktxt, "KPOINT")) { if(ktxt.size()!=3) error("KPOINT must be a section of size 3"); kpt.Resize(3); for(int i=0; i< 3; i++) kpt(i)=atof(ktxt[i].c_str()); } else { kpt.Resize(3); kpt=0; } pos=startpos; if(!readsection(words, pos, latvectxt, "BOXSIZE")) error("BOXSIZE is required in HEG"); if(latvectxt.size() != ndim) error("BOXSIZE must have exactly ",ndim, " values"); vector< vector<string> > perturb_sec; vector <string> dumstring; pos=startpos; while(readsection(words, pos,dumstring, "PERTURB")) perturb_sec.push_back(dumstring); nperturb=perturb_sec.size(); perturb_pos.Resize(nperturb, ndim); perturb_strength.Resize(nperturb); perturb_alpha.Resize(nperturb); perturb_spin.Resize(nperturb); for(int i=0; i< nperturb; i++) { if(!readsection(perturb_sec[i], pos=0,dumstring,"POS")) error("Need POS in PERTURB"); if(dumstring.size()!=ndim) error("wrong dimension in POS in PERTURB"); for(int d=0; d< ndim; d++) perturb_pos(i,d)=atof(dumstring[d].c_str()); if(!readvalue(perturb_sec[i], pos=0,perturb_strength(i),"STRENGTH")) error("Need STRENGTH in PERTURB"); if(!readvalue(perturb_sec[i], pos=0,perturb_alpha(i),"SCALE")) error("Need SCALE in PERTURB"); if(!readvalue(perturb_sec[i], pos=0,perturb_spin(i),"SPIN")) error("Need SPIN in PERTURB"); } latVec.Resize(ndim, ndim); latVec=0.0; for(int i=0; i< ndim; i++) latVec(i,i)=atof(latvectxt[i].c_str()); /* for(int i=0; i< ndim; i++) { for(int j=0; j< ndim; j++) { latVec(i,j)=atof(latvectxt[i*ndim+j].c_str()); } } */ origin.Resize(3); vector <string> origintxt; if(readsection(words, pos=0, origintxt, "ORIGIN")) { if(origintxt.size() < 3) error("ORIGIN section must have at least 3 elements."); for(int i=0; i< 3; i++) origin(i)=atof(origintxt[i].c_str()); } else { origin=0; //defaulting the origin to zero } vector <string> interactiontxt; // default is truncated Coulomb calcLocChoice=&HEG_system::calcLocTrunc; eeModel=2; same_spin_int=true; diff_spin_int=true; if(readsection(words, pos=0, interactiontxt, "INTERACTION")) { if( haskeyword(interactiontxt, pos=0, "EWALD") ) { calcLocChoice=&HEG_system::calcLocEwald; eeModel=1; } if( haskeyword(interactiontxt, pos=0, "TRUNCCOUL") ) { calcLocChoice=&HEG_system::calcLocTrunc; eeModel=2; } if( haskeyword(interactiontxt, pos=0, "GAUSS") ) { calcLocChoice=&HEG_system::calcLocGauss; eeModel=3; if(!readvalue(interactiontxt,pos=0,Gauss_a, "AMP")) error("Gauss interaction model requested, but no AMP given."); if(!readvalue(interactiontxt,pos=0,Gauss_s, "STDEV")) error("Gauss interaction model requested, but no STDEV given."); Gauss_s2=Gauss_s*Gauss_s; } if( haskeyword(interactiontxt, pos=0, "NO_SAME_SPIN") ) same_spin_int=false; if( haskeyword(interactiontxt, pos=0, "NO_DIFF_SPIN") ) diff_spin_int=false; } if ( eeModel==1 && ( !same_spin_int || !diff_spin_int ) ) error("Spin-dependent Ewald interaction not supported."); //-------------cross products //cross product: 0->1x2, 1->2x0, 2->0x1 Array2 <doublevar> crossProduct(ndim, ndim); crossProduct(0,0)=(latVec(1,1)*latVec(2,2)-latVec(1,2)*latVec(2,1)); crossProduct(0,1)=(latVec(1,2)*latVec(2,0)-latVec(1,0)*latVec(2,2)); crossProduct(0,2)=(latVec(1,0)*latVec(2,1)-latVec(1,1)*latVec(2,0)); crossProduct(1,0)=(latVec(2,1)*latVec(0,2)-latVec(2,2)*latVec(0,1)); crossProduct(1,1)=(latVec(2,2)*latVec(0,0)-latVec(2,0)*latVec(0,2)); crossProduct(1,2)=(latVec(2,0)*latVec(0,1)-latVec(2,1)*latVec(0,0)); crossProduct(2,0)=(latVec(0,1)*latVec(1,2)-latVec(0,2)*latVec(1,1)); crossProduct(2,1)=(latVec(0,2)*latVec(1,0)-latVec(0,0)*latVec(1,2)); crossProduct(2,2)=(latVec(0,0)*latVec(1,1)-latVec(0,1)*latVec(1,0)); //------------ reciprocal cell (used in setupEwald and showinfo) recipLatVec.Resize(ndim, ndim); doublevar det=Determinant(latVec, ndim); debug_write(cout, "cell volume ", det,"\n"); cellVolume=det; for(int i=0; i< ndim; i++) { for(int j=0; j< ndim; j++) { recipLatVec(i,j)=crossProduct(i,j)/det; } } //------------ normal vectors (needed in enforcePbc) normVec.Resize(ndim, ndim); for(int i=0; i< ndim; i++) { for(int j=0; j < ndim; j++) { normVec(i,j)=crossProduct(i,j); } //Check to make sure the direction is facing out doublevar dotprod=0; for(int j=0; j < ndim; j++) { dotprod+=normVec(i,j)*latVec(i,j); } if(dotprod < 0) { for(int j=0; j< ndim; j++) { normVec(i,j)= -normVec(i,j); } } } corners.Resize(ndim, ndim); for(int i=0; i< ndim; i++) { for(int j=0; j< ndim; j++) { corners(i,j)=origin(j)+latVec(i,j); } } //------------ setup for interaction calculators (reciprocal part of Ewald sum etc.) if ( eeModel == 1 ) setupEwald(crossProduct); if ( eeModel == 2 ) setupTruncCoulomb(); return 1; }