5 #include "boost/format.hpp" 
   15 template <
typename ImageT>
 
   18     explicit SetPixels() : _value(0) {}
 
   20     void setValue(
float value) { _value = value; }
 
   29 template <
typename ImageT>
 
   34                             float saturatedPixelValue  
 
   36     int const width = rim.getWidth(), height = rim.getHeight();
 
   37     int const x0 = rim.getX0(), y0 = rim.getY0();
 
   39     if (width != gim.getWidth() || height != gim.getHeight() || x0 != gim.getX0() || y0 != gim.getY0()) {
 
   42                 str(
boost::format(
"R image has different size/origin from G image " 
   43                                   "(%dx%d+%d+%d v. %dx%d+%d+%d") %
 
   44                     width % height % x0 % y0 % gim.getWidth() % gim.getHeight() % gim.getX0() % gim.getY0()));
 
   46     if (width != bim.getWidth() || height != bim.getHeight() || x0 != bim.getX0() || y0 != bim.getY0()) {
 
   49                 str(
boost::format(
"R image has different size/origin from B image " 
   50                                   "(%dx%d+%d+%d v. %dx%d+%d+%d") %
 
   51                     width % height % x0 % y0 % bim.getWidth() % bim.getHeight() % bim.getX0() % bim.getY0()));
 
   56     SetPixels<typename ImageT::Image> setR, setG, setB;  
 
   59     int const npixMin = 1;  
 
   69     for (FootprintList::const_iterator 
ptr = feet->begin(), 
end = feet->end(); 
ptr != 
end; ++
ptr) {
 
   71         auto const bigFoot = std::make_shared<detection::Footprint>(foot->getSpans()->dilated(borderWidth),
 
   74         double sumR = 0, sumG = 0, sumB = 0;  
 
   75         double maxR = 0, maxG = 0, maxB = 0;  
 
   77         for (
auto span = bigFoot->getSpans()->begin(), send = bigFoot->getSpans()->end(); span != send;
 
   79             int const y = span->getY() - y0;
 
   80             if (y < 0 || y >= height) {
 
   83             int sx0 = span->getX0() - x0;
 
   87             int sx1 = span->getX1() - x0;
 
   92             for (
typename ImageT::iterator rptr = rim.at(sx0, 
y), rend = rim.at(sx1 + 1, 
y),
 
   93                                            gptr = gim.at(sx0, 
y), bptr = bim.at(sx0, 
y);
 
   94                  rptr != rend; ++rptr, ++gptr, ++bptr) {
 
   95                 if (!((rptr.mask() | gptr.mask() | bptr.mask()) & SAT)) {
 
   96                     float val = rptr.image();
 
  118         float R = 0, G = 0, B = 0;  
 
  119         if (sumR + sumB + sumG > 0) {
 
  122                     R = useMaxPixel ? maxR : saturatedPixelValue;
 
  124                     G = (R * sumG) / sumR;
 
  125                     B = (R * sumB) / sumR;
 
  127                     B = useMaxPixel ? maxB : saturatedPixelValue;
 
  128                     R = (B * sumR) / sumB;
 
  129                     G = (B * sumG) / sumB;
 
  133                     G = useMaxPixel ? maxG : saturatedPixelValue;
 
  134                     R = (G * sumR) / sumG;
 
  135                     B = (G * sumB) / sumG;
 
  137                     B = useMaxPixel ? maxB : saturatedPixelValue;
 
  138                     R = (B * sumR) / sumB;
 
  139                     G = (B * sumG) / sumB;
 
  145         foot->getSpans()->applyFunctor(setR, *rim.getImage());
 
  147         foot->getSpans()->applyFunctor(setG, *gim.getImage());
 
  149         foot->getSpans()->applyFunctor(setB, *bim.getImage());
 
  155                                      float saturatedPixelValue);