1
- #include " normalstask.h"
1
+ #include " normalstask.h"
2
2
#include " ../src/jpeg_decoder.h"
3
3
#include " ../src/jpeg_encoder.h"
4
4
#include " ../src/imageset.h"
@@ -139,19 +139,19 @@ void NormalsTask::run() {
139
139
if (parameters.flatMethod != FLAT_NONE) {
140
140
141
141
switch (parameters.flatMethod ) {
142
- case FLAT_NONE: break ;
143
- case FLAT_RADIAL:
144
- flattenRadialNormals (width, height, normals, 100 );
145
- break ;
146
- case FLAT_FOURIER:
147
- // convert radius to frequencies
148
- double sigma = width*parameters.flatPercentage /100 ;
149
- try {
150
- flattenFourierNormals (width, height, normals, 0.2 , sigma);
151
- } catch (std::length_error e) {
152
- return ;
153
- }
154
- break ;
142
+ case FLAT_NONE: break ;
143
+ case FLAT_RADIAL:
144
+ flattenRadialNormals (width, height, normals, 100 );
145
+ break ;
146
+ case FLAT_FOURIER:
147
+ // convert radius to frequencies
148
+ double sigma = width*parameters.flatPercentage /100 ;
149
+ try {
150
+ flattenFourierNormals (width, height, normals, 0.2 , sigma);
151
+ } catch (std::length_error e) {
152
+ return ;
153
+ }
154
+ break ;
155
155
}
156
156
}
157
157
@@ -163,15 +163,15 @@ void NormalsTask::run() {
163
163
normalmap[i] = floor (((normals[i] + 1 .0f ) / 2 .0f ) * 255 );
164
164
165
165
QImage img (normalmap.data (), width, height, width*3 , QImage::Format_RGB888);
166
-
166
+
167
167
168
168
// Set spatial resolution if known. Need to convert as pixelSize stored in mm/pixel whereas QImage requires pixels/m
169
169
if ( pixelSize > 0 ) {
170
170
int dotsPerMeter = round (1000.0 /pixelSize);
171
171
img.setDotsPerMeterX (dotsPerMeter);
172
172
img.setDotsPerMeterY (dotsPerMeter);
173
173
}
174
- img.save (parameters.path );
174
+ img.save (parameters.path , nullptr , 98 );
175
175
}
176
176
177
177
@@ -283,7 +283,7 @@ bool savePly(const char *filename, pmp::SurfaceMesh &mesh) {
283
283
bool saveObj (const char *filename, pmp::SurfaceMesh &mesh) {
284
284
FILE *fp = fopen (filename, " wb" );
285
285
if (!fp) {
286
- // cerr << "Could not open file: " << filename << endl;
286
+ // cerr << "Could not open file: " << filename << endl;
287
287
return false ;
288
288
}
289
289
int nvertices = 0 ;
@@ -341,7 +341,8 @@ void NormalsWorker::run() {
341
341
switch (solver)
342
342
{
343
343
case NORMALS_L2:
344
- solveL2 ();
344
+ // solveL2();
345
+ solveL2Histogram ();
345
346
break ;
346
347
case NORMALS_SBL:
347
348
solveSBL ();
@@ -399,6 +400,64 @@ void NormalsWorker::solveL2()
399
400
normalIdx += 3 ;
400
401
}
401
402
}
403
+
404
+ void NormalsWorker::solveL2Histogram (){
405
+ // filter lights by elevation keep between 30 and 60.
406
+ vector<Vector3f> &m_Lights = m_Imageset.lights ();
407
+
408
+ Eigen::MatrixXd mLights (m_Lights.size (), 3 );
409
+ Eigen::MatrixXd mPixel (m_Lights.size (), 1 );
410
+
411
+ unsigned int normalIdx = 0 ;
412
+
413
+ for (size_t p = 0 ; p < m_Row.size (); p++) {
414
+ std::vector<std::pair<float , Vector3f>> entries (m_Lights.size ());
415
+
416
+ for (size_t i = 0 ; i < m_Lights.size (); i++) {
417
+ float c = m_Row[p][i].mean ();
418
+ entries[i] = make_pair (c, m_Lights[i]);
419
+ }
420
+ sort (entries.begin (), entries.end (), [](const auto & a, const auto & b) {
421
+ return a.first < b.first ;
422
+ });
423
+ int start = entries.size ()/8 ;
424
+ int end = entries.size ()*7 /8 ;
425
+ for (int i = 0 ; i < start - end; i++)
426
+ entries[i] = entries[i + start];
427
+ entries.resize (end - start);
428
+
429
+ mLights .resize (entries.size (), 3 );
430
+ mPixel .resize (entries.size (), 1 );
431
+
432
+ for (size_t i = 0 ; i < entries.size (); i++) {
433
+ auto &entry = entries[i];
434
+
435
+ Vector3f light;
436
+ if (m_Imageset.light3d ) {
437
+ light = m_Imageset.relativeLight (entry.second , p, m_Imageset.height - row);
438
+ light.normalize ();
439
+ } else
440
+ light = entry.second ;
441
+
442
+ for (int j = 0 ; j < 3 ; j++)
443
+ mLights (i, j) = light[j];
444
+
445
+ mPixel (i, 0 ) = entry.first ;
446
+ }
447
+
448
+ Eigen::MatrixXd mNormals = (mLights .transpose () * mLights ).ldlt ().solve (mLights .transpose () * mPixel );
449
+ mNormals .col (0 ).normalize ();
450
+ assert (!isnan (mNormals .col (0 )[0 ]));
451
+ assert (!isnan (mNormals .col (0 )[1 ]));
452
+ assert (!isnan (mNormals .col (0 )[2 ]));
453
+ m_Normals[normalIdx+0 ] = float (mNormals .col (0 )[0 ]);
454
+ m_Normals[normalIdx+1 ] = float (mNormals .col (0 )[1 ]);
455
+ m_Normals[normalIdx+2 ] = float (mNormals .col (0 )[2 ]);
456
+
457
+ normalIdx += 3 ;
458
+ }
459
+ }
460
+
402
461
void NormalsWorker::solveSBL ()
403
462
{
404
463
}
0 commit comments