21PatchOptimization::PatchOptimization(
22 std::vector<SingleView::Ptr>
const& _views,
39 sampler(
PatchSampler::create(views, settings, midx, midy, depth, dzI, dzJ)),
40 ii(
sqr(settings.filterWidth)),
41 jj(
sqr(settings.filterWidth)),
42 localVS(views, settings, _globalViewIDs, _localViewIDs, sampler)
48 if (!sampler->success[settings.
refViewNr]) {
54 std::size_t count = 0;
57 pixel_weight.resize(sampler->getNrSamples());
58 for (
int j = -halfFW; j <= halfFW; ++j)
59 for (
int i = -halfFW; i <= halfFW; ++i) {
62 pixel_weight[count] = 1.f;
73 float masterMeanCol = sampler->getMasterMeanColor();
74 for (std::size_t idx = 0; idx < views.size(); ++idx) {
85 Samples const & mCol = sampler->getMasterColorSamples();
87 IndexSet::const_iterator id;
88 for (
id = neighIDs.begin();
id != neighIDs.end(); ++id)
91 Samples const & nCol = sampler->getNeighColorSamples(*
id);
92 if (!sampler->success[*
id])
94 for (
int c = 0; c < 3; ++c) {
98 for (std::size_t i = 0; i < mCol.size(); ++i) {
99 ab += (mCol[i][c] - nCol[i][c] * colorScale[*id][c]) * nCol[i][c];
100 aa +=
sqr(nCol[i][c]);
102 if (std::abs(aa) > 1e-6) {
103 colorScale[*id][c] += ab / aa;
104 if (colorScale[*
id][c] > 1e3)
124 IndexSet::const_iterator id;
125 for (
id = neighIDs.begin();
id != neighIDs.end(); ++id) {
126 meanNCC += sampler->getFastNCC(*
id);
128 meanNCC /= neighIDs.size();
130 float score = (meanNCC - settings.
acceptNCC) /
135 math::Vec3f viewDir(refV->viewRayScaled(midx, midy));
137 float dotP = - normal.
dot(viewDir);
148 IndexSet::const_iterator id;
149 std::size_t nrSamples = sampler->getNrSamples();
152 for (
id = neighIDs.begin();
id != neighIDs.end(); ++id)
155 sampler->fastColAndDeriv(*
id, nCol, nDeriv);
156 if (!sampler->success[*
id]) {
162 for (std::size_t i = 0; i < nrSamples; ++i) {
163 norm += pixel_weight[i] * (cs.
cw_mult(nDeriv[i])).square_norm();
182 bool viewRemoved =
false;
183 bool converged =
false;
188 IndexSet::const_iterator id;
190 std::vector<float> oldNCC;
191 for (
id = neighIDs.begin();
id != neighIDs.end(); ++id) {
192 oldNCC.push_back(sampler->getFastNCC(*
id));
208 std::size_t count = 0;
211 for (
id = neighIDs.begin();
id != neighIDs.end(); ++id, ++count)
213 float ncc = sampler->getFastNCC(*
id);
220 toBeReplaced.insert(*
id);
236 else if (converged) {
247 Samples const & mCol = sampler->getMasterColorSamples();
248 std::size_t nrSamples = sampler->getNrSamples();
250 IndexSet::const_iterator id;
252 for (
id = neighIDs.begin();
id != neighIDs.end(); ++id) {
253 Samples const & nCol = sampler->getNeighColorSamples(*
id);
254 if (!sampler->success[*
id])
257 for (std::size_t i = 0; i < nrSamples; ++i) {
258 obj += pixel_weight[i] * (mCol[i] - cs.
cw_mult(nCol[i])).square_norm();
267 float numerator = 0.f;
269 Samples const & mCol = sampler->getMasterColorSamples();
271 IndexSet::const_iterator id;
272 std::size_t nrSamples = sampler->getNrSamples();
274 for (
id = neighIDs.begin();
id != neighIDs.end(); ++id)
277 sampler->fastColAndDeriv(*
id, nCol, nDeriv);
278 if (!sampler->success[*
id]) {
284 for (std::size_t i = 0; i < nrSamples; ++i) {
285 numerator += pixel_weight[i] * (cs.
cw_mult(nDeriv[i])).dot
286 (mCol[i] - cs.
cw_mult(nCol[i]));
287 denom += pixel_weight[i] * (cs.
cw_mult(nDeriv[i])).square_norm();
292 depth += numerator / denom;
293 sampler->update(depth, dzI, dzJ);
294 if (sampler->success[settings.
refViewNr])
308 std::size_t nrSamples = sampler->getNrSamples();
314 Samples const & mCol = sampler->getMasterColorSamples();
315 IndexSet::const_iterator id;
317 for (
id = neighIDs.begin();
id != neighIDs.end(); ++id)
320 sampler->fastColAndDeriv(*
id, nCol, nDeriv);
321 if (!sampler->success[*
id]) {
326 for (std::size_t i = 0; i < nrSamples; ++i) {
327 for (
int c = 0; c < 3; ++c) {
329 a_i[0] = pixel_weight[i] * cs[c] * nDeriv[i][c];
330 a_i[1] = pixel_weight[i] * ii[i] * cs[c] * nDeriv[i][c];
331 a_i[2] = pixel_weight[i] * jj[i] * cs[c] * nDeriv[i][c];
332 float b_i = pixel_weight[i] * (mCol[i][c] - cs[c] * nCol[i][c]);
337 ATA(0,0) += a_i[0] * a_i[0];
338 ATA(0,1) += a_i[0] * a_i[1];
339 ATA(0,2) += a_i[0] * a_i[2];
340 ATA(1,1) += a_i[1] * a_i[1];
341 ATA(1,2) += a_i[1] * a_i[2];
342 ATA(2,2) += a_i[2] * a_i[2];
348 ATA(1,0) = ATA(0,1); ATA(2,0) = ATA(0,2); ATA(2,1) = ATA(1,2);
361 sampler->update(depth, dzI, dzJ);
362 if (sampler->success[settings.
refViewNr])
Matrix< T, N, N > matrix_inverse(Matrix< T, N, N > const &mat)
Calculates the inverse of the given matrix.