#include namespace icl { // {{{ C++ fallback template void WeightedSum::compute(const Img *src, Img *dst, const std::vector& weights) { ICLASSERT_RETURN( src && dst ); ICLASSERT_RETURN( src->getROISize() == dst->getROISize() ); ICLASSERT_RETURN( src->getChannels() == (int)weights.size() ); ICLASSERT_RETURN( dst->getChannels() == 1); ConstImgIterator itSrc = src->getROIIterator(0); ImgIterator itDst = dst->getROIIterator(0); float w = weights[0]; for(;itSrc.inRegion(); ++itSrc, ++itDst){ *itDst = *itSrc * w; } for (int c=src->getChannels()-1; c > 0; c--) { w = weights[c]; itSrc = src->getROIIterator(c); itDst = dst->getROIIterator(0); for(;itSrc.inRegion(); ++itSrc, ++itDst){ *itDst += *itSrc * w; } } } // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: compute (poSrc->asImg(), poDst, weights); break; void WeightedSum::apply (ImgBase *poSrc, Img *poDst, const std::vector& weights) { ImgBase *poDstBase = static_cast(poDst); if (!Filter::prepare (&poDstBase, depth32f, Filter::chooseSize (poSrc), formatMatrix, 1, chooseROI (poSrc), poSrc->getTime())) return; switch (poSrc->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_DEPTH; } } #undef ICL_INSTANTIATE_DEPTH }