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; }
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; }