void FrontierDetector::processFrontiers(const cv::Mat& occupancyGrid){
        map = occupancyGrid.clone();
        if(map.rows>0 && map.cols>0) {
                imgProc();
                detectEdges();
                findFrontiers();
        }
}
ProcessResult PluginCameraCalibration::process(FrameData * data, RenderOptions * options) 
{
  video_width=data->video.getWidth();
  video_height=data->video.getHeight();
  (void)options;
  if(ccw)
  {
    if(ccw->getDetectEdges())
    {
      detectEdges(data);
      ccw->resetDetectEdges();
    }
    ccw->set_slider_from_vars();
  }
  return ProcessingOk;
}
bool ImageEdgeDetectionBase<T, U>::Execute() {

    if (!m_iDataObject) {
        LOG0("ImageEdgeDetectionBase: Error: no input");
        return false;
    }

    // also check base image types here

    // get first image
    PGCore::Image<T> *inImage = (static_cast<PGCore::Image < T > *>(m_iDataObject));
    if (!inImage) {
        LOG0("ImageEdgeDetectionBase: Error: failure to fetch input image");
        return false;
    }

    long iRows=0, iColumns=0;
    inImage->GetDimensions(iRows, iColumns);
    if (iRows*iColumns <=0) {
        LOG0("ImageEdgeDetectionBase: Error: invalid image size");
        return false;
    }

    const T* inBuf = inImage->GetBuffer();
    if (!inBuf)
    {
        LOG0("ImageEdgeDetectionBase: Error: invalid image");
        return false;
    }

    if (m_oImageObject == NULL)
        m_oImageObject = new PGCore::Image<U>(iRows, iColumns);
    U* outBuf = m_oImageObject->GetBuffer();
    if (!outBuf)
    {
        LOG0("ImageEdgeDetectionBase: Error: invalid out image");
        return false;
    }

    bool rv = detectEdges(m_sigma, m_loTh, m_hiTh, inImage, m_oImageObject);

    m_oDataObject = (static_cast<PGCore::BaseDataObject *>(m_oImageObject));

    return rv;
}
Exemple #4
0
  bool RegionMerger::listRegions(const PredefinedTypes::Box *b)
  {

    PredefinedTypes::Box bb;

    if(b)
      bb=*b;
    else{
      bb.ulx=bb.uly=0;
      bb.brx=img->getWidth()-1;
      bb.bry=img->getHeight()-1;
    }

    // enumerate dirs
    
    // 0 - E
    // 1 - SW
    // 2 - S
    // 3 - SE
    
    int incr[4];

    int w=bb.width(),h=bb.height();

    int l=w*h,i;
    unsigned char *isNeighbour= new unsigned char[l];
    
    incr[0]=1;
    incr[1]=w-1;
    incr[2]=w;
    incr[3]=w+1;
    
    const int xincr[]={1,-1,0,1};
    const int yincr[]={0,1,1,1};

    for(i=0;i<l;i++){
      isNeighbour[i]=15;
    }
    for(i=0;i<w;i++){
      isNeighbour[l-i-1] = 1; // lower neighbours away
    }
    
    for(i=0;i<l;i+=w){
      isNeighbour[i] &= 13; // SW neighbours away 
      isNeighbour[i+w-1] &= 6; // right neighbours away
    }
    
    int x,y,dir;

    int *lbl=img->GetSeparateLabelingInt(NULL,fourNeighbours,false,&bb);

    if(Verbose()>1)
    cout << "separate labeling formed" << endl;
    
    regionList.clear();
    orgRegions.clear();
    
    map<pair<int,int>,coordSet> borderPixels;

    for(i=0,x=bb.ulx,y=bb.uly;i<l;i++,x++){
      if(x>bb.brx){ x=bb.ulx;y++;}
      
      // cout<<"i= "<<i<<" (x,y)="<<x<<","<<y<<")"<<endl;

      //regionList[lbl[i]].joinedTo=lbl[i];
      orgRegions[lbl[i]].push_back(coord(x,y));
      //regionList[lbl[i]].l.push_back(coord(x,y));

      for(dir=0;dir<4;dir++){
	if((isNeighbour[i]&(1<<dir)) && ((fourNeighbours==false) || (dir&1)==0 ))
	  if(lbl[i]!=lbl[i+incr[dir]]){
	    
	    int r1=lbl[i], r2=lbl[i+incr[dir]];

	    regionList[r1].nList.insert(r2);
	    regionList[r2].nList.insert(r1);

	    if(edgeWeight != 0.0){
	      // this pixel pair is also inserted in the list of border pixels between the
	      borderPixels[pair<int,int>(r1,r2)].
		insert(coord(x+xincr[dir],y+yincr[dir]));
	      borderPixels[pair<int,int>(r2,r1)].
		insert(coord(x,y));
	    }
	  }
      }
	  
    }
    
    if(Verbose()>1)
      cout << "regionlist collected w/ " << regionList.size() << " regions" << endl;

    if(edgeWeight != 0){
      // calculate the edge magnitude image
      
      if(Verbose()>1) cout << "detecting edges"<< endl;
      detectEdges();
      if(Verbose()>1) cout << "edges detected" << endl;
    }

    map<pair<int,int>,coordSet>::iterator bit;
    for(bit=borderPixels.begin(); bit != borderPixels.end(); bit++){
      const int r1=bit->first.first, r2=bit->first.second;
      if(r1<r2){

	regionList[r1].bI[r2].strength= regionList[r2].bI[r1].strength
	  =borderStrength(bit->second,borderPixels[pair<int,int>(r2,r1)]);

	regionList[r1].bI[r2].count= regionList[r2].bI[r1].count=
	  bit->second.size()+borderPixels[pair<int,int>(r2,r1)].size();
      }
    }

    cout << "border strengths determined" << endl;
    
    map<int,Region>::iterator rit;

    for(rit=regionList.begin();rit!=regionList.end();rit++){
      //cout<<"region["<<rit->first<<"]: size="<<rit->second.l.size()<<endl;
      
      rit->second.rl.push_back(rit->first);
      rit->second.count=orgRegions[rit->first].size();

      if(outputTree)
	rit->second.currentLabel=
	  hierarchy.addStartingRegion(orgRegions[rit->first]);

    }


    if (Verbose()>1)
      cout << "Found " << regionList.size() << " separate regions." << endl;
    	    
    delete[] lbl;
    delete[] isNeighbour;

    // calculate feature vectors for all regions

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

    if (Verbose()>1) {
      cout << "Feature values calculated." << endl;
      
      int dim=regionList.begin()->second.fV.size();
      // dim should be got from feature spec.
      vector<float> sum(dim,0.0);
      vector<float> sqrsum(dim,0.0);

      for(rit=regionList.begin();rit!=regionList.end();rit++)
	for (int d=0; d<dim; d++){
	  sum[d]    += rit->second.fV[d];
	  sqrsum[d] += rit->second.fV[d]*rit->second.fV[d];
	}

      for(int d=0;d<dim;d++){
	sum[d] /= regionList.size();
	sqrsum[d] /= regionList.size();
	
	cout << "Feature component "<<d<<": mean="<<sum[d]<<" stddev="<<
	  sqrt(sqrsum[d]-sum[d]*sum[d]) << endl;	
      }

	
	
    }	

    return true;

  }