freebsd-ports/graphics/pfscalibration/files/patch-src-pfshdrcalibrate.cpp
Martin Wilke 8d147cc513 PFScalibration package provides an implementation of the Robertson
et al. 2003 method for the photometric calibration of cameras and
for the recovery of high dynamic range (HDR) images from the set
of low dynamic range (LDR) exposures.

WWW: http://www.mpii.mpg.de/resources/hdr/calibration/pfs.html

PR:		ports/118388
Submitted by:	argv[0] (Iouri V. Ivliev)
2007-12-14 17:16:13 +00:00

99 lines
3.5 KiB
C++

--- src/pfshdrcalibrate.cpp.orig Wed Aug 23 14:49:59 2006
+++ src/pfshdrcalibrate.cpp Thu Jun 21 14:40:28 2007
@@ -108,7 +108,7 @@
{ "help", no_argument, NULL, 'h' },
{ "verbose", no_argument, NULL, 'v' },
{ "luminance", no_argument, NULL, 'Y' },
- { "fillin-response", no_argument, NULL, 'F' },
+// { "fillin-response", no_argument, NULL, 'F' },
{ "calibration", required_argument, NULL, 'c' },
{ "gauss", required_argument, NULL, 'g' },
{ "max-response", required_argument, NULL, 'A' },
@@ -123,7 +123,7 @@
int optionIndex = 0;
while( 1 ) {
- int c = getopt_long (argc, argv, "hvYFc:g:r:f:s:m:b:", cmdLineOptions, &optionIndex);
+ int c = getopt_long (argc, argv, "hvYFc:g:r:f:s:m:b:S:A:", cmdLineOptions, &optionIndex);
if( c == -1 ) break;
switch( c ) {
case 'h':
@@ -246,8 +246,8 @@
throw pfs::Exception("calibration method not set or not supported");
}
- VERBOSE_STR << "interpolate missing parts of response: "
- << (opt_fillgaps ? "yes" : "no") << endl;
+// VERBOSE_STR << "interpolate missing parts of response: "
+// << (opt_fillgaps ? "yes" : "no") << endl;
if( responseSaveFile!=NULL )
VERBOSE_STR << "save response curve to a file (do not generate HDR image)" << endl;
@@ -434,6 +434,8 @@
pfs::Channel *Xj, *Yj, *Zj;
frame->createXYZChannels( Xj, Yj, Zj );
+ // !!! this currently does more bad than good, relevant command line
+ // option is disabled
if( opt_fillgaps )
{
if( opt_luminance )
@@ -453,42 +455,50 @@
}
// calibration
+ long sp = 0; // saturated pixels
switch( opt_calibration )
{
case NONE:
if( opt_luminance )
{
VERBOSE_STR << "applying response to Y channel..." << endl;
- robertson02_applyResponse( Yj, imgsY, Iy, w, M);
+ sp = robertson02_applyResponse( Yj, imgsY, Iy, w, M);
}
else
{
VERBOSE_STR << "applying response to R channel..." << endl;
- robertson02_applyResponse( Xj, imgsR, Ir, w, M);
+ sp = robertson02_applyResponse( Xj, imgsR, Ir, w, M);
VERBOSE_STR << "applying response to G channel..." << endl;
- robertson02_applyResponse( Yj, imgsG, Ig, w, M);
+ sp += robertson02_applyResponse( Yj, imgsG, Ig, w, M);
VERBOSE_STR << "applying response to B channel..." << endl;
- robertson02_applyResponse( Zj, imgsB, Ib, w, M);
+ sp += robertson02_applyResponse( Zj, imgsB, Ib, w, M);
+ sp /= 3;
}
break;
case ROBERTSON:
if( opt_luminance )
{
VERBOSE_STR << "recovering Y channel..." << endl;
- robertson02_getResponse( Yj, imgsY, Iy, w, M);
+ sp = robertson02_getResponse( Yj, imgsY, Iy, w, M);
}
else
{
VERBOSE_STR << "recovering R channel..." << endl;
- robertson02_getResponse( Xj, imgsR, Ir, w, M);
+ sp = robertson02_getResponse( Xj, imgsR, Ir, w, M);
VERBOSE_STR << "recovering G channel..." << endl;
- robertson02_getResponse( Yj, imgsG, Ig, w, M);
+ sp += robertson02_getResponse( Yj, imgsG, Ig, w, M);
VERBOSE_STR << "recovering B channel..." << endl;
- robertson02_getResponse( Zj, imgsB, Ib, w, M);
+ sp += robertson02_getResponse( Zj, imgsB, Ib, w, M);
+ sp /= 3;
}
break;
case DEBEVEC:
break;
+ }
+ if( sp>0 )
+ {
+ float perc = ceilf(100.0f*sp/size);
+ VERBOSE_STR << "saturated pixels found in " << perc << "% of the image!" << endl;
}
// save response curve to a given file