void KSegmentor3D::Update2D() { this->integrateUserInput(); this->CreateLLs(LL2D); ptrCurrImage = static_cast<unsigned short*>(imageVol->GetScalarPointer()); ptrCurrLabel = static_cast<unsigned short*>(labelVol->GetScalarPointer()); ptrIntegral_Image = static_cast<double*>(this->U_Integral_image->GetScalarPointer()); size_t sz = mdims[0]*mdims[1]; if( cache_phi.size() != (size_t)sz ) cache_phi.resize(sz); if( save_count_per_slice.size() != mdims[2] ) { save_count_per_slice=std::vector<int>(mdims[2],0); } double* phiSlice = new double[ mdims[0]*mdims[1] ]; double* imgSlice = new double[ mdims[0]*mdims[1] ]; double* maskSlice = new double[ mdims[0]*mdims[1] ]; double* U_I_slice = new double[ mdims[0]*mdims[1] ]; double* labelSlice = new double[ mdims[0]*mdims[1] ]; unsigned int element3D; long elemNum=0; long maskThresh=0.5*labelRange[1]; double maxU = -1e99; double minU = 1e99; for (int j=0; j<=mdims[1]-1; j++) { for (int i=0; i<=mdims[0]-1; i++) { // indexing definition: ptr[k*mdims[1]*mdims[0] +j*mdims[0]+i]; element3D=this->currSlice*mdims[1]*mdims[0] +j*mdims[0]+i; imgSlice[elemNum] = (double) ptrCurrImage[element3D]; maskSlice[elemNum] = (double) ( maskThresh < ptrCurrLabel[element3D] ); U_I_slice[elemNum] = (double) ptrIntegral_Image[element3D]; if ( maxU < U_I_slice[elemNum] ) { //PKDebug maxU = U_I_slice[elemNum]; //cout << "maxU = " << maxU << endl; } else if ( minU > U_I_slice[elemNum] ) { //PKDebug minU = U_I_slice[elemNum]; //cout << "minU = " << minU << endl; } elemNum++; } } cout << "minU = " << maxU << ", " << "maxU = " << maxU << endl; std::vector<long> dimsSlice(5); dimsSlice[0] = mdims[0]; dimsSlice[1] = mdims[1]; dimsSlice[2] = 1; dimsSlice[3] = dimsSlice[0]*dimsSlice[1]; dimsSlice[4] = dimsSlice[0]*dimsSlice[1]*dimsSlice[2]; ls_mask2phi3c(maskSlice,phiSlice,labelSlice,&(dimsSlice[0]), LL2D.Lz,LL2D.Ln1,LL2D.Ln2,LL2D.Lp1,LL2D.Lp2); cout << "prevslice=" << prevSlice << ", " << "currslice= " << currSlice << endl; if( (prevSlice == this->currSlice) ) { cout << "\033[01;32m\033]" << "using cached phi " << "\033[00m\033]" << endl; std::memcpy( &(phiSlice[0]),&(cache_phi[0]),sizeof(double)*mdims[0]*mdims[1] ); } else { cout << "\033[01;42m\033]" << "first time on slice! " << "\033[00m\033]" << endl; } prevSlice=currSlice; interactive_rbchanvese(imgSlice,phiSlice,U_I_slice,labelSlice,&(dimsSlice[0]), LL2D.Lz,LL2D.Ln1,LL2D.Lp1,LL2D.Ln2,LL2D.Lp2,LL2D.Lin2out,LL2D.Lout2in, iter,rad,lambda*0.5,display); //threshold phi to find segmentation label, assign it to appropriate range of label! elemNum=0; cv::Mat tmp(mdims[1],mdims[0],CV_64FC1); cv::Mat tmpI(mdims[1],mdims[0],CV_64FC1); for (int j=0; j<=mdims[1]-1; j++) { for (int i=0; i<=mdims[0]-1; i++) { double phi_val = phiSlice[elemNum]; double phi_out = (-phi_val + 3.0) / 6.0 ;/*6*/; // shift and scale from [-3,3] to [0,1] element3D=this->currSlice*mdims[1]*mdims[0] +j*mdims[0]+i; unsigned short value_IK= ( (unsigned short) 0 >= phi_val )*labelRange[1]; // IK: if phi=0, make label 0, else it's 1 unsigned short value_PK= ( (unsigned short) ( ( (phi_out > 0.95) + (phi_out > 0.8) + (phi_out > 0.65) + (phi_out > 0.5) ) * labelRange[1] / 4.0 ) ); ptrCurrLabel[element3D] = value_IK; tmp.at<double>(j,i) = (phi_val<=0.0)*255.0f; tmpI.at<double>(j,i) = (imgSlice[elemNum]); //labelSlice[elemNum] = (double) value_IK; //if( (value_PK == 0) && !( 0 == value_IK ) ) { if(value_IK != value_PK){ //cout << "IK!=PK; IK = " << value_IK << ", PK = " << value_PK << endl; //cout << "crap, extraneous loss of levelset! " << endl; assert(0); } elemNum++; } } bool bSavePNG = true; if( bSavePNG ) { std::stringstream ss,ssI; ss << "label_slice_" << THREE_DIGITS(currSlice) << "_" << THREE_DIGITS(save_count_per_slice[currSlice]) << "_" << FIVE_DIGITS(num_actuated_voxels) << ".png"; ssI<< "image_slice_" << THREE_DIGITS(currSlice) << ".png"; static std::vector<cv::Mat> chans(3); static cv::Mat tmpPng; cv::flip( tmp.clone(), tmp, 0 ); double dmin,dmax; cv::minMaxLoc(tmp,&dmin,&dmax); cout << "min_label=" << dmin << ", max_label=" << dmax << "; "; for(int c=0;c<3;c++){ tmp.convertTo(chans[c],CV_8UC1); } cv::merge(chans,tmpPng); cout << "write to " << ss.str() << " result: " << cv::imwrite(ss.str(),tmpPng) << endl; cv::flip( tmpI.clone(), tmpI, 0 ); cv::minMaxLoc(tmpI,&dmin,&dmax); cout << "min_image=" << dmin << ", max_image=" << dmax << "; "; for(int c=0;c<3;c++){ tmpI.convertTo(chans[c],CV_8UC1); } cv::merge(chans,tmpPng); cout << "write to " << ssI.str() << " result: " << cv::imwrite(ssI.str(),tmpPng) << endl; save_count_per_slice[currSlice] += 1; //saveMatToPNG( tmp, ss.str() ); } cout << string("update2D in ") + string(__FILE__) + ": Lz size: " << LL2D.Lz->length << endl; // store cached \phi level set func std::memcpy( &(cache_phi[0]),&(phiSlice[0]),sizeof(double)*sz ); delete [] imgSlice; delete [] labelSlice; delete [] maskSlice; delete [] phiSlice; delete [] U_I_slice; m_UpdateVector.clear(); m_CoordinatesVector.clear(); }
int main(int argc, char** argv) { string path=string(argv[0]); unsigned int loc=path.rfind("/"); string basepath= loc == string::npos ? "./" : path.substr(0,loc+1); basepath= osgDB::getRealPath (basepath); // use an ArgumentParser object to manage the program arguments. osg::ArgumentParser arguments(&argc,argv); arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName()); arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ..."); bool pbufferOnly = !arguments.read("--show"); unsigned int width=512; unsigned int height=512; arguments.read("--pbuffer-only",width,height); int _tileColumns=0; int _tileRows=0; osg::BoundingBox totalbb; double lat=0,lon=0; arguments.read("-lat",lat); arguments.read("-lon",lon); bool untex= arguments.read("-untex"); string ext; bool nogfx= arguments.read("-nogfx",ext); std::vector<picture_cell> cells; FILE *fp=fopen(argv[1],"r"); if(!fp) { fprintf(stderr,"Can't open %s\n",argv[1]); exit(-1); } int cnt=0; while(!feof(fp)) { char fname[1024]; float minx,maxx,miny,maxy,minz,maxz; int row,col; int res=fscanf(fp,"%f %f %f %f %f %f %d %d %s\n",&minx,&maxx,&miny,&maxy,&minz,&maxz,&col,&row,fname); if(res != 9) { fprintf(stderr,"Bad parse\n"); exit(-1); } if(cnt==0) { totalbb=osg::BoundingBox(minx,miny,minz,maxx,maxy,maxz); _tileColumns=col; _tileRows=row; } else { picture_cell cell; cell.bbox=osg::BoundingBox(minx,miny,minz,maxx,maxy,maxz); cell.col=col; cell.row=row; if(std::string(fname) != "null") cell.name=std::string(argv[2])+"/"+std::string(fname); else cell.name=std::string(fname); cells.push_back(cell); } cnt++; } osg::Matrixd view,proj; std::stringstream os2; os2<< "view.mat"; std::fstream _file(os2.str().c_str(),std::ios::binary|std::ios::in); for(int i=0; i<4; i++) for(int j=0; j<4; j++) _file.read(reinterpret_cast<char*>(&(view(i,j))),sizeof(double)); for(int i=0; i<4; i++) for(int j=0; j<4; j++) _file.read(reinterpret_cast<char*>(&(proj(i,j))),sizeof(double)); _file.close(); // std::ostringstream os; // os <<"subtile.ppm";//<<":deflate"; vips::VImage raw; vips::VImage raw_untex; printf("X: %d Y: %d\n",width*_tileColumns,height*_tileRows); raw.initdesc(width*_tileColumns,height*_tileRows,3,vips::VImage::FMTUCHAR,vips::VImage::NOCODING,vips::VImage::sRGB,1.0,1.0,0,0); if(untex) raw_untex.initdesc(width*_tileColumns,height*_tileRows,3,vips::VImage::FMTUCHAR,vips::VImage::NOCODING,vips::VImage::sRGB,1.0,1.0,0,0); double vm, rss; process_mem_usage(vm, rss); cout << "VM: " << get_size_string(vm) << "; RSS: " << get_size_string(rss) << endl; osg::Matrix win; unsigned int validCount=0; for(int i=0; i < (int)cells.size(); i++) { if(cells[i].name != "null") validCount++; } osg::Timer_t startTick = osg::Timer::instance()->tick(); formatBar("Img",startTick,0,validCount); FILE *logfp=fopen("DItiming.txt","w"); int count=0; for(int i=0; i < (int)cells.size(); i++) { osg::Timer_t loopTick = osg::Timer::instance()->tick(); if(cells[i].name == "null" ) continue; if(nogfx) { char tmp[1024]; { sprintf(tmp,"mosaic/image_r%04d_c%04d_rs%04d_cs%04d.%s",cells[i].row,cells[i].col,_tileRows,_tileColumns,ext.c_str()); if(osgDB::fileExists(tmp)) { vips::VImage tmpI(tmp); raw.insertplace(tmpI.extract_bands(0,3),width*cells[i].col,height*(_tileRows-cells[i].row-1)); } else { vips::VImage tmpI; tmpI.initdesc(width,height,3,vips::VImage::FMTUCHAR,vips::VImage::NOCODING,vips::VImage::sRGB,1.0,1.0,0,0); memset(tmpI.data(),255,width*height*3); raw.insertplace(tmpI,width*cells[i].col,height*(_tileRows-cells[i].row-1)); fprintf(stderr,"Can't find %s\n",tmp); } } if(untex) { sprintf(tmp,"mosaic/image_r%04d_c%04d_rs%04d_cs%04d_untex.%s",cells[i].row,cells[i].col,_tileRows,_tileColumns,ext.c_str()); if(osgDB::fileExists(tmp)) { vips::VImage tmpI(tmp); raw_untex.insertplace(tmpI.extract_bands(0,3),width*cells[i].col,height*(_tileRows-cells[i].row-1)); } else { vips::VImage tmpI; tmpI.initdesc(width,height,3,vips::VImage::FMTUCHAR,vips::VImage::NOCODING,vips::VImage::sRGB,1.0,1.0,0,0); memset(tmpI.data(),255,width*height*3); raw.insertplace(tmpI,width*cells[i].col,height*(_tileRows-cells[i].row-1)); fprintf(stderr,"Can't find %s\n",tmp); } } } else { osgViewer::Viewer viewer(arguments); GLenum readBuffer = GL_BACK; WindowCaptureCallback::FramePosition position = WindowCaptureCallback::END_FRAME; WindowCaptureCallback::Mode mode = WindowCaptureCallback::SINGLE_PBO; osg::ref_ptr<osg::GraphicsContext> pbuffer; { osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->x = 0; traits->y = 0; traits->width = width; traits->height = height; traits->red = 8; traits->green = 8; traits->blue = 8; traits->alpha = 8; traits->windowDecoration = false; traits->pbuffer = true; traits->doubleBuffer = true; traits->sharedContext = 0; pbuffer = osg::GraphicsContext::createGraphicsContext(traits.get()); //std::cout << "Buffer obj "<< pbuffer->getState()->getMaxBufferObjectPoolSize() << " tex "<< pbuffer->getState()->getMaxBufferObjectPoolSize() <<std::endl; if (pbuffer.valid()) { // osg::notify(osg::INFO)<<"Pixel buffer has been created successfully."<<std::endl; } else { osg::notify(osg::INFO)<<"Pixel buffer has not been created successfully."<<std::endl; } } osg::ref_ptr<WindowCaptureCallback> wcc=new WindowCaptureCallback(mode, position, readBuffer); osg::ref_ptr<osg::Camera> camera; if (pbuffer.valid()) { camera = new osg::Camera; camera->setGraphicsContext(pbuffer.get()); camera->setViewport(new osg::Viewport(0,0,width,height)); GLenum buffer = pbuffer->getTraits()->doubleBuffer ? GL_BACK : GL_FRONT; camera->setDrawBuffer(buffer); camera->setReadBuffer(buffer); camera->setFinalDrawCallback(wcc); if (pbufferOnly) { viewer.addSlave(camera.get(), osg::Matrixd(), osg::Matrixd()); viewer.realize(); } else { viewer.realize(); viewer.stopThreading(); pbuffer->realize(); viewer.addSlave(camera.get(), osg::Matrixd(), osg::Matrixd()); viewer.startThreading(); } } else { viewer.realize(); addCallbackToViewer(viewer, wcc); } osg::Timer_t timeEndSetup = osg::Timer::instance()->tick(); //double setupTime = osg::Timer::instance()->delta_s(loopTick, timeEndSetup); // load the data osg::Matrixd offsetMatrix=osg::Matrixd::scale(_tileColumns, _tileRows, 1.0)*osg::Matrixd::translate(_tileColumns-1-2*cells[i].col, _tileRows-1-2*cells[i].row, 0.0); /* printf("\r%03d/%03d",i,(int)cells.size()); fflush(stdout); */ // std::cout <<"row: "<<cells[i].row << " col: "<<cells[i].col<<" tc: "<<_tileColumns << " "<<_tileRows<<" "<<"\n"<<osg::Matrix::scale(_tileColumns, _tileRows, 1.0) << "\n"<<osg::Matrix::translate(_tileColumns-1-2*cells[i].col, _tileRows-1-2*cells[i].row, 0.0) <<"\n"<<offsetMatrix<<endl; osg::ref_ptr<osg::Node> node=osgDB::readNodeFile(cells[i].name); osg::Timer_t timeEndLoad = osg::Timer::instance()->tick(); double loadTime = osg::Timer::instance()->delta_s(timeEndSetup, timeEndLoad); int mem=0; if (node.valid() ) { viewer.setSceneData( node ); viewer.getCamera()->setProjectionMatrix(proj*offsetMatrix); viewer.getCamera()->setViewMatrix(view); viewer.frame(); viewer.advance(); viewer.updateTraversal(); viewer.renderingTraversals(); osg::Timer_t timeEndRender = osg::Timer::instance()->tick(); double renderTime = osg::Timer::instance()->delta_s(timeEndLoad, timeEndRender); gpuUsage(1,mem); fprintf(logfp,"cnt: %d load %.1fs render: %.1fs mem1: %d MB",count,loadTime,renderTime,mem); osg::Image *img=(wcc->getContextData(pbuffer)->_imageBuffer[wcc->getContextData(pbuffer)->_currentImageIndex]); vips::VImage tmp(img->data(),img->s(),img->t(),4,vips::VImage::FMTUCHAR); raw.insertplace(tmp.flipver().extract_bands(0,3),width*cells[i].col,height*(_tileRows-cells[i].row-1)); if(untex) { node->getOrCreateStateSet()->addUniform(new osg::Uniform("shaderOut",3)); viewer.setSceneData( node ); viewer.frame(); viewer.advance(); viewer.updateTraversal(); viewer.renderingTraversals(); osg::Timer_t timeEndRender2 = osg::Timer::instance()->tick(); double renderTime2 = osg::Timer::instance()->delta_s(timeEndRender, timeEndRender2); gpuUsage(1,mem); osg::Image *img=(wcc->getContextData(pbuffer)->_imageBuffer[wcc->getContextData(pbuffer)->_currentImageIndex]); vips::VImage tmp(img->data(),img->s(),img->t(),4,vips::VImage::FMTUCHAR); raw_untex.insertplace(tmp.flipver().extract_bands(0,3),width*cells[i].col,height*(_tileRows-cells[i].row-1)); fprintf(logfp," render2: %.1fs mem2: %d",renderTime2,mem); } } else { std::cout << "Invalid " << cells[i].name << "\n"; } } formatBar("Img",startTick,++count,validCount); osg::Timer_t timeEndLoop = osg::Timer::instance()->tick(); double loopTime = osg::Timer::instance()->delta_s(loopTick, timeEndLoop); fprintf(logfp," loop: %.1fs\n",loopTime); fflush(logfp); } formatBar("Img",startTick,validCount,validCount); osg::Timer_t writeStart = osg::Timer::instance()->tick(); process_mem_usage(vm, rss); cout << "VM: " << get_size_string(vm) << "; RSS: " << get_size_string(rss) << endl; raw.write("subtile.v"); double writeTime = osg::Timer::instance()->delta_s(writeStart, osg::Timer::instance()->tick()); fprintf(logfp,"Write Time %.1fs\n",writeTime); if(untex) { osg::Timer_t writeStart = osg::Timer::instance()->tick(); raw_untex.write("subtile_untex.v"); double writeTime = osg::Timer::instance()->delta_s(writeStart, osg::Timer::instance()->tick()); fprintf(logfp,"Write Time 2 %.1fs\n",writeTime); } printf("Done\n"); fclose(logfp); applyGeoTags("subtile.tif",osg::Vec2(lat,lon),view*proj,raw.Xsize(),raw.Ysize(),basepath); }