Ejemplo n.º 1
0
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;
}