@Override protected void updateBackground(int x0, int y0, int x1, int y1, Planar<T> frame) { transform.setModel(worldToCurrent); interpolationInput.setImage(frame); final int numBands = frame.getNumBands(); float minusLearn = 1.0f - learnRate; for (int y = y0; y < y1; y++) { int indexBG = background.startIndex + y*background.stride + x0; for (int x = x0; x < x1; x++, indexBG++ ) { transform.compute(x,y,work); if( work.x >= 0 && work.x < frame.width && work.y >= 0 && work.y < frame.height) { interpolationInput.get(work.x,work.y, pixelInput); backgroundWrapper.getF(indexBG,pixelBack); for (int band = 0; band < numBands; band++) { float value = pixelInput[band]; float bg = pixelBack[band]; if( bg == Float.MAX_VALUE ) { pixelBack[band] = value; } else { pixelBack[band] = minusLearn*bg + learnRate*value; } } backgroundWrapper.setF(indexBG,pixelBack); } } } }