void TrackerMedianFlowImpl::check_NCC(const Mat& oldImage,const Mat& newImage, const std::vector<Point2f>& oldPoints,const std::vector<Point2f>& newPoints,std::vector<bool>& status){ std::vector<float> NCC(oldPoints.size(),0.0); Size patch(30,30); Mat p1,p2; for (int i = 0; i < (int)oldPoints.size(); i++) { getRectSubPix( oldImage, patch, oldPoints[i],p1); getRectSubPix( newImage, patch, newPoints[i],p2); const int N=900; double s1=sum(p1)(0),s2=sum(p2)(0); double n1=norm(p1),n2=norm(p2); double prod=p1.dot(p2); double sq1=sqrt(n1*n1-s1*s1/N),sq2=sqrt(n2*n2-s2*s2/N); double ares=(sq2==0)?sq1/abs(sq1):(prod-s1*s2/N)/sq1/sq2; NCC[i] = (float)ares; } float median = getMedian(NCC); for(int i = 0; i < (int)oldPoints.size(); i++) { status[i] = status[i] && (NCC[i]>median); } }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); connect(ui->openButton, SIGNAL(clicked()), this, SLOT(Open())); connect(ui->saveButton, SIGNAL(clicked()), this, SLOT(SaveImage())); connect(ui->SSDButton, SIGNAL(clicked()), this, SLOT(SSD())); connect(ui->SADButton, SIGNAL(clicked()), this, SLOT(SAD())); connect(ui->NCCButton, SIGNAL(clicked()), this, SLOT(NCC())); connect(ui->GTCheckBox, SIGNAL(clicked()), this, SLOT(GTOnOff())); connect(ui->gaussianButton, SIGNAL(clicked()), this, SLOT(Gaussian())); connect(ui->maxButton, SIGNAL(clicked()), this, SLOT(FindBestDisparity())); connect(ui->bilateralButton, SIGNAL(clicked()), this, SLOT(Bilateral())); connect(ui->segmentButton, SIGNAL(clicked()), this, SLOT(Segment())); connect(ui->renderButton, SIGNAL(clicked()), this, SLOT(Render())); connect(ui->renderSlider, SIGNAL(valueChanged(int)), this, SLOT(RenderSlider(int))); connect(ui->magicButton, SIGNAL(clicked()), this, SLOT(MagicStereo(int))); ui->GTCheckBox->setChecked(true); ui->pixelErrorLabel->setText(""); ui->gaussianSigmaSpinBox->setValue(1.0); ui->biSigmaSSpinBox->setValue(1.0); ui->biSigmaISpinBox->setValue(20.0); ui->renderSlider->setValue(100); ui->SADOffsetBox->setValue(2); ui->SSDOffsetBox->setValue(2); ui->NCCOffsetBox->setValue(2); ui->segmentGridBox->setValue(20); ui->segmentColorSpinBox->setValue(20.0); ui->segmentSpatialSpinBox->setValue(6.0); ui->segmentIterBox->setValue(4); m_Image1Display.setParent(ui->tab); m_Image2Display.setParent(ui->tab_2); m_GTDisplay.setParent(ui->tab_4); m_DisparityDisplay.setParent(ui->tab_3); m_ErrorDisplay.setParent(ui->tab_5); m_RenderDisplay.setParent(ui->tab_6); m_SegmentDisplay.setParent(ui->tab_7); m_Image1Display.window = this; m_Image2Display.window = this; m_GTDisplay.window = this; m_DisparityDisplay.window = this; m_ErrorDisplay.window = this; m_RenderDisplay.window = this; m_SegmentDisplay.window = this; ui->tabWidget->setCurrentIndex(0); m_LastRow = 0; m_SegmentIteration = 0; m_MatchCost = NULL; }
// Calculate Relative similarity of the patch (NN-Model) double TLDDetector::Sr(const Mat_<uchar>& patch) { double splus = 0.0, sminus = 0.0; Mat_<uchar> modelSample(STANDARD_PATCH_SIZE, STANDARD_PATCH_SIZE); for (int i = 0; i < *posNum; i++) { modelSample.data = &(posExp->data[i * 225]); splus = std::max(splus, 0.5 * (NCC(modelSample, patch) + 1.0)); } for (int i = 0; i < *negNum; i++) { modelSample.data = &(negExp->data[i * 225]); sminus = std::max(sminus, 0.5 * (NCC(modelSample, patch) + 1.0)); } if (splus + sminus == 0.0) return 0.0; return splus / (sminus + splus); }
// Calculate Conservative similarity of the patch (NN-Model) double TLDDetector::Sc(const Mat_<uchar>& patch) { double splus = 0.0, sminus = 0.0; Mat_<uchar> modelSample(STANDARD_PATCH_SIZE, STANDARD_PATCH_SIZE); int med = getMedian((*timeStampsPositive)); for (int i = 0; i < *posNum; i++) { if ((int)(*timeStampsPositive)[i] <= med) { modelSample.data = &(posExp->data[i * 225]); splus = std::max(splus, 0.5 * (NCC(modelSample, patch) + 1.0)); } } for (int i = 0; i < *negNum; i++) { modelSample.data = &(negExp->data[i * 225]); sminus = std::max(sminus, 0.5 * (NCC(modelSample, patch) + 1.0)); } if (splus + sminus == 0.0) return 0.0; return splus / (sminus + splus); }