Exemplo n.º 1
0
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();
}
Exemplo n.º 2
0
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);

}