double SecondOrderOptimizeFusionMove::evaluateEnergy(const Depth &disp) const { CHECK_EQ(disp.getWidth(), width); CHECK_EQ(disp.getHeight(), height); double e = 0.0; for (auto i = 0; i < width * height; ++i) { int l = (int) disp[i]; e += (model->operator()(i, l) / model->MRFRatio); } auto tripleE = [&](int id1, int id2, int id3, double w){ double lam = w * model->weight_smooth; // if (refSeg[id1] == refSeg[id2] && refSeg[id1] == refSeg[id3]) // lam = lamh; // else // lam = laml; return lapE(disp[id1], disp[id2], disp[id3]) * lam; }; for (auto x = 1; x < width - 1; ++x) { for (auto y = 1; y < height - 1; ++y) { e += tripleE(y * width + x - 1, y * width + x, y * width + x + 1, model->hCue[y*width+x]); e += tripleE((y - 1) * width + x, y * width + x, (y + 1) * width + x, model->vCue[y*width+x]); } } return e; }
void SceneManager::drawDepth(Depth & depth, int x, int y) { depthShader.begin(); depthShader.setUniform1i("isClipping", 0); depth.draw(x, y, depth.getWidth() * 0.6, depth.getHeight() * 0.6); depthShader.end(); }