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; }
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; }
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; }
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()); }
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; }
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++; } }
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(); }