QmitkFillHoleToolGUI::QmitkFillHoleToolGUI() :QmitkToolGUI() { //std::cout << "hi from " << __FUNCSIG__ << std::endl; // create the visible widgets QBoxLayout* verticalLayout = new QVBoxLayout( this ); m_HorizontalLayout = new QHBoxLayout(); verticalLayout->addLayout(m_HorizontalLayout); m_HorizontalLayout1 = new QHBoxLayout(); verticalLayout->addLayout(m_HorizontalLayout1); m_HorizontalLayout2 = new QHBoxLayout(); verticalLayout->addLayout(m_HorizontalLayout2); m_SelectSurfaceBox = new QComboBox(); m_HorizontalLayout->addWidget(m_SelectSurfaceBox); connect(m_SelectSurfaceBox, SIGNAL(activated(int)), this, SLOT(SelectSurface(int))); m_PbtnSelectSurfaceViaMouse = new QPushButton(); QIcon icn_OpenFile; icn_OpenFile.addFile(":/threeDEditing/res/threeDEditing/mousepointer.png"); m_PbtnSelectSurfaceViaMouse->setIcon(icn_OpenFile); m_PbtnSelectSurfaceViaMouse->setFixedSize(22,22); m_HorizontalLayout->addWidget(m_PbtnSelectSurfaceViaMouse); connect(m_PbtnSelectSurfaceViaMouse, SIGNAL(clicked()), this, SLOT(SelectSurfaceViaMouse())); m_PbtnReinitSelection = new QPushButton(); m_PbtnReinitSelection->setText("Reinit Selection"); m_PbtnReinitSelection->setCheckable(true); m_HorizontalLayout1->addWidget(m_PbtnReinitSelection); connect(m_PbtnReinitSelection, SIGNAL(clicked()), this, SLOT(ReinitSelection())); m_PbtnJumpToPosition = new QPushButton(); m_PbtnJumpToPosition->setText("Jump to Position"); m_PbtnJumpToPosition->setCheckable(true); m_HorizontalLayout1->addWidget(m_PbtnJumpToPosition); connect(m_PbtnJumpToPosition, SIGNAL(clicked()), this, SLOT(JumpToPosition())); QLabel* label = new QLabel( "Radius", this ); QFont f = label->font(); f.setBold(false); label->setFont( f ); m_HorizontalLayout2->addWidget(label); m_RadiusSlider = new QSlider(Qt::Horizontal); m_RadiusSlider->setSliderPosition(20); m_HorizontalLayout2->addWidget(m_RadiusSlider); QObject::connect(m_RadiusSlider, SIGNAL(sliderMoved(int)), this, SLOT(RadiusChanged(int))); // Tool Specific QBoxLayout* horizontalLayout3 = new QHBoxLayout(); verticalLayout->addLayout(horizontalLayout3); QBoxLayout* horizontalLayout4 = new QHBoxLayout(); verticalLayout->addLayout(horizontalLayout4); QBoxLayout* horizontalLayout5 = new QHBoxLayout(); verticalLayout->addLayout(horizontalLayout5); QBoxLayout* horizontalLayout6 = new QHBoxLayout(); verticalLayout->addLayout(horizontalLayout6); QFrame *frame = new QFrame( this ); frame->setFrameStyle( QFrame::Box | QFrame::Plain ); frame->setLineWidth(10); frame->setFixedSize(200,10); QColor color(214,247,202); QPalette colorPalette(color); colorPalette.setColor(QPalette::Foreground, color); frame->setPalette(colorPalette); horizontalLayout3->addWidget(frame); QPushButton* pbtn_DetectHoles = new QPushButton(); pbtn_DetectHoles->setText("Detect Holes"); horizontalLayout4->addWidget(pbtn_DetectHoles); connect(pbtn_DetectHoles, SIGNAL(clicked()), this, SLOT(DetectHoles())); QPushButton* pbtn_FillHoles = new QPushButton(); pbtn_FillHoles->setText("Fill Holes"); horizontalLayout5->addWidget(pbtn_FillHoles); connect(pbtn_FillHoles, SIGNAL(clicked()), this, SLOT(FillHoles())); QPushButton* pbtn_FillHolesVOI = new QPushButton(); pbtn_FillHolesVOI->setText("Fill Holes VOI"); horizontalLayout6->addWidget(pbtn_FillHolesVOI); connect(pbtn_FillHolesVOI, SIGNAL(clicked()), this, SLOT(FillHolesVOI())); connect( this, SIGNAL(NewToolAssociated(mitk::Tool*)), this, SLOT(OnNewToolAssociated(mitk::Tool*)) ); //std::cout << "ciao from " << __FUNCSIG__ << std::endl; }
/******************************************************************************* Render warped views between the images image - Image to be warped disparities - The disparities for each pixel disparityScale - The amount to warp the image, usually between 0 and 1 renderImage - The final rendered image *******************************************************************************/ void MainWindow::Render(QImage image, double *disparities, double disparityScale, QImage *renderImage) { int r, c; int w = image.width(); int h = image.height(); double *projDisparity = new double [w*h]; double *projDisparityCt = new double [w*h]; QRgb pixel0; QRgb pixel1; memset(projDisparity, 0, w*h*sizeof(double)); memset(projDisparityCt, 0, w*h*sizeof(double)); for(r=0;r<h;r++) for(c=0;c<w;c++) { double disparity = -disparities[r*w + c]*disparityScale; double x = (double) c + disparity; int cp = (int) x; double del = x - (double) cp; if(cp >= 0 && cp < w-1) { // Make sure we get the depth ordering correct. if(projDisparityCt[r*w + cp] == 0) { projDisparity[r*w + cp] = (1.0 - del)*disparity; projDisparityCt[r*w + cp] = (1.0 - del); } else { if(fabs(disparity) > fabs(2.0 + projDisparity[r*w + cp]/projDisparityCt[r*w + cp])) { projDisparity[r*w + cp] = (1.0 - del)*disparity; projDisparityCt[r*w + cp] = (1.0 - del); } else { projDisparity[r*w + cp] += (1.0 - del)*disparity; projDisparityCt[r*w + cp] += (1.0 - del); } } if(projDisparityCt[r*w + cp + 1] == 0) { projDisparity[r*w + cp + 1] = (del)*disparity; projDisparityCt[r*w + cp + 1] = (del); } else { if(fabs(disparity) > fabs(2.0 + projDisparity[r*w + cp + 1]/projDisparityCt[r*w + cp + 1])) { projDisparity[r*w + cp + 1] = (del)*disparity; projDisparityCt[r*w + cp + 1] = (del); } else { projDisparity[r*w + cp + 1] += (del)*disparity; projDisparityCt[r*w + cp + 1] += (del); } } } } for(r=0;r<h;r++) for(c=0;c<w;c++) { if(projDisparityCt[r*w + c] > 0.0) { projDisparity[r*w + c] /= projDisparityCt[r*w + c]; } } FillHoles(projDisparity, projDisparityCt, w, h); renderImage->fill(qRgb(0,0,0)); for(r=0;r<h;r++) for(c=0;c<w;c++) if(projDisparityCt[r*w + c] > 0.0) { double disparity = projDisparity[r*w + c]; double x = (double) c - disparity; int cp = (int) x; double del = x - (double) cp; if(cp >= 0 && cp < w-1) { pixel0 = image.pixel(cp, r); pixel1 = image.pixel(cp+1, r); int red = (int) ((1.0 - del)*(double)qRed(pixel0) + del*(double)qRed(pixel1)); int green = (int) ((1.0 - del)*(double)qGreen(pixel0) + del*(double)qGreen(pixel1)); int blue = (int) ((1.0 - del)*(double)qBlue(pixel0) + del*(double)qBlue(pixel1)); // Uncomment if you want to see the disparities // red = (int) disparity*4.0; // green = (int) disparity*4.0; // blue = (int) disparity*4.0; renderImage->setPixel(c, r, qRgb(red, green, blue)); } } delete [] projDisparity; delete [] projDisparityCt; }