/** * Sets the image spacial derivatives. These should be computed from an image at the appropriate scale * in scale-space. * * @param derivX x-derivative of input image * @param derivY y-derivative of input image */ public void setImageGradient(Deriv derivX , Deriv derivY ) { this.imageDerivX.wrap(derivX); this.imageDerivY.wrap(derivY); }
@Override public void wrap(ImageBase image) { if( this.sb == null ) { this.sb = FactoryGImageGray.wrap((ImageGray)image); } else { this.sb.wrap((ImageGray)image); } }
/** * Sets the image which is going to be processed. Must call {@link #setImage(ImageGray)} first. */ public void setImage(T image) { integralImage.wrap(image); integral.setImage(integralImage); }
/** * Sets the image which is going to be processed. */ public void setImage(T image) { integralImage.wrap(image); integral.setImage(integralImage); }
/** * Sets the gradient and precomputes pixel orientation and magnitude * * @param derivX image derivative x-axis * @param derivY image derivative y-axis */ public void setImageGradient(D derivX , D derivY ) { InputSanityCheck.checkSameShape(derivX,derivY); if( derivX.stride != derivY.stride || derivX.startIndex != derivY.startIndex ) throw new IllegalArgumentException("stride and start index must be the same"); savedAngle.reshape(derivX.width,derivX.height); savedMagnitude.reshape(derivX.width,derivX.height); imageDerivX.wrap(derivX); imageDerivY.wrap(derivY); precomputeAngles(derivX); }
@Override public void segment(T frame, GrayU8 segmented) { if( background.width == 1 ) { ImageMiscOps.fill(segmented,unknownValue); return; } InputSanityCheck.checkSameShape(background,frame,segmented); inputWrapper.wrap(frame); float thresholdSq = threshold*threshold; int indexBG = 0; for (int y = 0; y < frame.height; y++) { int indexInput = frame.startIndex + y*frame.stride; int indexSegmented = segmented.startIndex + y*segmented.stride; int end = indexInput + frame.width; while( indexInput < end ) { float bg = background.data[indexBG]; float pixelFrame = inputWrapper.getF(indexInput); float diff = bg - pixelFrame; if (diff * diff <= thresholdSq) { segmented.data[indexSegmented] = 0; } else { segmented.data[indexSegmented] = 1; } indexInput++; indexSegmented++; indexBG++; } } }
@Override public void wrap(ImageBase image) { if( this.image == null ) { this.image = (Planar) image; bandWrappers = new GImageGray[this.image.getNumBands()]; for (int i = 0; i < bandWrappers.length; i++) { bandWrappers[i] = FactoryGImageGray.wrap(this.image.getBand(i)); } } else { this.image = (Planar) image; for (int i = 0; i < bandWrappers.length; i++) { bandWrappers[i].wrap(this.image.getBand(i)); } } }
@Override public void updateBackground( T frame) { if( background.width == 1 ) { background.reshape(frame.width, frame.height); GConvertImage.convert(frame, background); return; } else { InputSanityCheck.checkSameShape(background,frame); } inputWrapper.wrap(frame); float minusLearn = 1.0f - learnRate; int indexBG = 0; for (int y = 0; y < frame.height; y++) { int indexInput = frame.startIndex + y*frame.stride; int end = indexInput + frame.width; while( indexInput < end ) { float value = inputWrapper.getF(indexInput++); float bg = background.data[indexBG]; background.data[indexBG++] = minusLearn*bg + learnRate*value; } } }
@Override protected void _segment(Motion currentToWorld, T frame, GrayU8 segmented) { transform.setModel(currentToWorld); inputWrapper.wrap(frame); float thresholdSq = threshold*threshold; for (int y = 0; y < frame.height; y++) { int indexFrame = frame.startIndex + y*frame.stride; int indexSegmented = segmented.startIndex + y*segmented.stride; for (int x = 0; x < frame.width; x++, indexFrame++ , indexSegmented++ ) { transform.compute(x,y,work); if( work.x >= 0 && work.x < background.width && work.y >= 0 && work.y < background.height) { float bg = interpolationBG.get(work.x,work.y); float pixelFrame = inputWrapper.getF(indexFrame); if( bg == Float.MAX_VALUE ) { segmented.data[indexSegmented] = unknownValue; } else { float diff = bg - pixelFrame; if (diff * diff <= thresholdSq) { segmented.data[indexSegmented] = 0; } else { segmented.data[indexSegmented] = 1; } } } else { // there is no background here. Just mark it as not moving to avoid false positives segmented.data[indexSegmented] = unknownValue; } } } }
@Override protected void _segment(Motion currentToWorld, T frame, GrayU8 segmented) { transform.setModel(currentToWorld); inputWrapper.wrap(frame);
inputWrapper.wrap(frame);
@Override public void updateBackground( T frame) { if( background.width == 1 ) { background.reshape(frame.width, frame.height); GConvertImage.convert(frame, background.getBand(0)); GImageMiscOps.fill(background.getBand(1),initialVariance); return; } else { InputSanityCheck.checkSameShape(background, frame); } inputWrapper.wrap(frame); float minusLearn = 1.0f - learnRate; GrayF32 backgroundMean = background.getBand(0); GrayF32 backgroundVar = background.getBand(1); int indexBG = 0; for (int y = 0; y < background.height; y++) { int indexInput = frame.startIndex + y*frame.stride; int end = indexInput + frame.width; while( indexInput < end ) { float inputValue = inputWrapper.getF(indexInput); float meanBG = backgroundMean.data[indexBG]; float varianceBG = backgroundVar.data[indexBG]; float diff = meanBG-inputValue; backgroundMean.data[indexBG] = minusLearn*meanBG + learnRate*inputValue; backgroundVar.data[indexBG] = minusLearn*varianceBG + learnRate*diff*diff; indexBG++; indexInput++; } } }