예제 #1
0
  int RegionMerger::findClosest(int i){

    if(regionList.count(i)==0) 
      throw string("RegionMerger::findClosests(): index not in regionlist.");

    Region *r1=&(regionList[i]);

    //cout << "findClosest: region " <<i<<" has "<<r1->nList.size()
    //	 <<" neighbours." << endl; 

    int minind=-1;
    float mindist=9999999999999999.0;
    
    set<int>::iterator it;
    for(it=r1->nList.begin(); it != r1->nList.end(); it++){
      //Region *r = &(regionList[*it]);
      float dist=regionDist(i,*it);
	//Feature::VectorSqrDistance(r->fV,r1->fV);
      if(dist < mindist){
	mindist=dist;
	minind=*it;
      }
    }
    
    return minind;

  }
예제 #2
0
double CovariancePatchModelv2::updateModelDistance(int indx, Mat& covMat) {

    double dist = 0;//, minDist = 100000;

    for (int numSample=0; numSample<m_onlineModel[indx].size(); numSample++) {
        dist += regionDist(m_onlineModel[indx][numSample].m_covMatrix,covMat, tracker_param,MAT_MAP_LOG);
        //if (dist<minDist) minDist = dist;
    }

    return dist/m_onlineModel[indx].size();
    //return minDist;
}
예제 #3
0
double CovariancePatchModel::modelDistance(CovariancePatchDescriptor *f1) {

    double dist = 0,totalDist = 0, minDist = 100000;

    for (int nfeatures = 0; nfeatures<f1->m_descp.size(); nfeatures++) {
        dist = 0;
        minDist = 100000;
        for (int nModel = 0; nModel<m_onlineModel.size(); nModel++) {
            dist = regionDist(m_onlineModel[nModel].m_descp[nfeatures],f1->m_descp[nfeatures],tracker_param);
            if (dist<minDist) minDist = dist;
        }
        totalDist += minDist;
    }
    return totalDist;
}
예제 #4
0
  void RegionMerger::fillPriorityQueue(){
    currentTime=0;

    queue_vector.clear();

    Region *r;

    map<int,Region>::iterator rit;
    for(rit=regionList.begin();rit!=regionList.end();rit++){

      r=&(rit->second);
	r->timestamp=0;
	// updateFeatureValues(i);

// 	set<int>::iterator it;
// 	for(it=r->nList.begin(); it != r->nList.end(); it++)
// 	  if(*it > i){
// 	    regionDiff d;
// 	    d.timestamp=0;
// 	    d.r1=i;
// 	    d.r2=*it;
// 	    d.dist=-regionDist(i,*it);
// 	    queue.push(d);
// 	  }

	r->closestNeighbour=findClosest(rit->first);

	regionDiff d;
	d.timestamp=0;
	d.r1=rit->first;
	d.r2=r->closestNeighbour;
	d.dist=-regionDist(rit->first,r->closestNeighbour);
	//queue.push(d);

	//	cout << "Initial merge: " << d.print() << endl;

	queue_vector.push_back(d);

    }
    make_heap(queue_vector.begin(),queue_vector.end());
  }
예제 #5
0
double CovariancePatchModelv2::modelDistance(CovariancePatchDescriptor *f1) {

    double dist = 0,totalDist = 0, minDist = 100000;// alpha = 0.05;//0.05
    Point2f aux(0,0);
    for (int nfeatures = 1; nfeatures<f1->m_descp.size(); nfeatures++) {
        dist = 0;
        minDist = 100000;
        for (int nModel = 0; nModel<m_onlineModel[nfeatures].size(); nModel++) {
            dist = regionDist(m_onlineModel[nfeatures][nModel].m_covMatrix,f1->m_descp[nfeatures],tracker_param);
            aux = getAreaCenter(f1->m_rect, nfeatures);

            dist += tracker_param->alpha*sqrt(pow((double)(m_onlineModel[nfeatures][nModel].m_pos.x-aux.x),2)+
                                              pow((double)(m_onlineModel[nfeatures][nModel].m_pos.y-aux.y),2));


            if (dist<minDist) minDist = dist;
        }
        totalDist += minDist;
    }
    return totalDist;
}
예제 #6
0
  void RegionMerger::initialApproximateMerge(){

    // const int batchSize=40;
    const int initialStop=400;


    int batchnr=0;

    while((int)regionList.size() > initialStop){

//         cout << "beginning batch of initialApproximateMerge" << endl;
//         cout <<"regionCount="<<regionList.size() << endl;
      
      set<int> region;
      set<int> neighbours;
      set<regionDiff> joins;
      
      int batchSize=(regionList.size()-numberOfRegions)/2;
      //int batchSize=500;

      const int l=regionList.size();
	vector<int> labelsInRL;
	map<int,Region>::iterator rit;

	for(rit=regionList.begin();rit!=regionList.end();rit++)
	  labelsInRL.push_back(rit->first);

 // 	cout << labelsInRL.size() << " labels collected:( l=" << l<<")"<<endl;

//  	for(size_t i=0;i<labelsInRL.size();i++)
//  	  cout<<labelsInRL[i]<<endl;
	  

	
      for(int i=0;i<batchSize;i++){
	int j;

	int r=random(l-1);

	//cout << "r="<<r<<endl;

	j=labelsInRL[r];
	if(region.count(j)||neighbours.count(j)) continue;

	//cout << "region set: "<<formVirtualSegmentLabel(region)<<endl;
	//cout << "neighbours: "<<formVirtualSegmentLabel(neighbours)<<endl;

	region.insert(j);

	//char jstr[80];
	//sprintf(jstr,"%d",j);

	//if(regionList.count(j)==0) 
	//  throw string("accepted region ")+jstr+ " not in regionlist";

	const set<int> &nbr=regionList[j].nList;

	//cout << "accepted region "<<j<<" w/ neighbours " << endl
	//     <<"  "<< formVirtualSegmentLabel(nbr)<<endl;

	neighbours.insert(nbr.begin(),nbr.end());
	regionDiff tmp;
	tmp.r1=j;
	tmp.r2=findClosest(j);

	//cout << "closest region: "<<tmp.r2<<endl;
	tmp.dist=regionList[j].count*regionDist(tmp.r1,tmp.r2);
	tmp.dist=regionDist(tmp.r1,tmp.r2);
	joins.insert(tmp);
      }
      
      // cout <<"joins.size()="<<joins.size()<<endl;

      // sort(joins.begin(),joins.end());
      int i=0;
      map<int,int> joinedTo;
      int njoins=joins.size()/2; // arbitrary choice, quite aggressive
      if(njoins<1) njoins=1;

      for(set<regionDiff>::iterator it=joins.begin();i<njoins;
	  i++,it++){
	regionDiff d=*it;
	//cout << "i= "<<i<<" dist="<<it->dist<<endl;
	while(joinedTo.count(d.r1)) d.r1=joinedTo[d.r1];
	while(joinedTo.count(d.r2)) d.r2=joinedTo[d.r2];

	if(d.r1==d.r2) continue;

	mergeRegions(d.r1,d.r2,full_update);
	//	if(regionList.size() != countRegions()){
	//  cout << "batch nr " << batchnr << endl;
	//  cout << "joined regions "<<d.r1<<" and "<<d.r2<<endl;
	//  cout << "regionList.size()="<<regionList.size()<<" (real="<<countRegions()
	//     << ") -> batchSize="<<batchSize<<endl;
	//}

	if(d.r1<d.r2) joinedTo[d.r2]=d.r1;
	else joinedTo[d.r1]=d.r2;
      }  
      batchnr++;
    }

  }
예제 #7
0
  void RegionMerger::mergeTopRegions(){
    
    //regionDiff d=queue.top();
    //queue.pop();

    pop_heap(queue_vector.begin(),queue_vector.end());
    regionDiff d=queue_vector.back();
    queue_vector.pop_back();

    if(regionList.count(d.r1)==0 ||regionList.count(d.r2)==0){
      // cout << "popped inexistent merge" << endl;
      return;
    }

    if(d.r1>d.r2){
      int tmp=d.r1;
      d.r1=d.r2;
      d.r2=tmp;
    }
    
    Region *r1=&(regionList[d.r1]);
    Region *r2=&(regionList[d.r2]);

    if(d.timestamp < r1->timestamp || d.timestamp < r2->timestamp) return;

    currentTime++;

    int i=d.r1,i2=d.r2;

    //     cout << "Merging regions " << d.r1 <<" and " << d.r2 
    //       << " w\\ d=" << d.dist << endl;

//     cout << "Feature vectors:" << endl << " r1: ";
//     Feature::printFeatureVector(cout,r1->fV);
//     cout << endl << " r2: ";
//     Feature::printFeatureVector(cout,r2->fV);


//     cout << "Neighbours of r1: " << endl;
    set<int>::iterator it;

  //   for(it=r1->nList.begin(); it != r1->nList.end(); it++){
//       if(regionList[*it].count){
// 	cout << "     #"<<*it<<" (size "<<regionList[*it].count<<"):";
//       Feature::printFeatureVector(cout,regionList[*it].fV);
//       cout << endl;
//       }
//     }

//     cout << "Neighbours of r2: " << endl;
//     for(it=r2->nList.begin(); it != r2->nList.end(); it++){
//       if(regionList[*it].count){
// 	cout << "     #"<<*it<<" (size "<<regionList[*it].count<<"):";
// 	Feature::printFeatureVector(cout,regionList[*it].fV);
// 	cout << endl;
//       }
//     }

    mergeRegions(d.r1,d.r2,full_update);

    // now pointer r2 becomes invalid

    for(it=r1->nList.begin(); it != r1->nList.end(); it++){
      Region *r=&(regionList[*it]);
      bool otherBefore = (r->closestNeighbour != i && r->closestNeighbour != i2); 
      r->closestNeighbour=findClosest(*it);
      if(r->closestNeighbour != i && otherBefore) continue; 
      // other relevant merges remain in the queue

      regionDiff d;
      d.timestamp=currentTime;
      d.r1=*it;
      d.r2=r->closestNeighbour;
      d.dist = -regionDist(d.r1,d.r2);
      //queue.push(d);
      //    cout << "pushed merge: " << d.print() << endl;
      queue_vector.push_back(d);
      push_heap(queue_vector.begin(),queue_vector.end());

    }
    if(r1->nList.size()){

      r1->closestNeighbour=findClosest(i);
    
      regionDiff dn;
      dn.timestamp=currentTime;
      dn.r1=i;
      dn.r2=r1->closestNeighbour;
      dn.dist = -regionDist(dn.r1,dn.r2);
      //queue.push(d);
      queue_vector.push_back(dn);
      //cout << "pushed merge: " << dn.print() << endl;
      push_heap(queue_vector.begin(),queue_vector.end());
      
      r1->timestamp=currentTime;
      //r2->timestamp=currentTime;
    }
    // dumpRegionList();
    
    
  }