WikiFilters
Advertisement

< Code

Code of 'FiltersTest'[]

-> the most inportant is the procedure Test()

unit test;

(* ***** BEGIN LICENSE BLOCK *****
 * Copyright (C) 2004-2007 Durand Emmanuel
 * Copyright (C) 2004-2007 Burgel Eric
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Contact :
 *   filters@edurand.com
 *   filters@burgel.com
 * Site :
 *   http://filters.sourceforge.net/
 *
 * ***** END LICENSE BLOCK ***** *)

{
 edurand (filters@edurand.com)
 eburgel (filters@burgel.com)
}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Types,
  Dialogs, StdCtrls, image, ExtCtrls, imageIO, imageIOVideo, ExtDlgs,
  ComCtrls,
  filter, AppEvnts, GLScene,
  GLWin32Viewer, Buttons, GLObjects, GLMisc, GLGraph,
  application1,
  application2,
  VectorTypes,
  VectorGeometry, GLTexture,
  wrapper_filtersdll, Grids
  ;

type

  TMainForm = class(TForm)
    TimerAutoProcess: TTimer;
    DlgOpenFilm: TOpenDialog;
    dlgSave: TSaveDialog;
    dlgOpen: TOpenPictureDialog;
    GLScene1: TGLScene;
    HeightField1: TGLHeightField;
    GLLightSource1: TGLLightSource;
    GLCamera1: TGLCamera;
    pnlMain: TPanel;
    cmdCopyImageOut2: TButton;
    cmdCopyImageOut: TBitBtn;
    splMidle: TSplitter;
    pnlBottom: TPanel;
    ViewerImageOut: TImage;
    lblImageOut: TLabel;
    shpROIout: TShape;
    ViewerImageOut2: TImage;
    lblImageOut2: TLabel;
    shpViewerToolROI: TShape;
    pnlDivers: TPanel;
    rbgViewerTools: TRadioGroup;
    pnlBottomCenter: TPanel;
    pnlViewerTools: TPanel;
    ViewerToolImage: TImage;
    ViewerToolGLScene: TGLSceneViewer;
    pnlTop: TPanel;
    splTop: TSplitter;
    pnlTopRight: TPanel;
    ViewerImageIn: TImage;
    Label1: TLabel;
    shpROI: TShape;
    imageInSize: TLabel;
    lineY: TShape;
    lineX: TShape;
    pnlTopLeft: TPanel;
    pnlFilters: TPanel;
    pPyramid: TPanel;
    LblPyramid: TLabel;
    lblPyramideNormalisation: TLabel;
    sbPyramid: TScrollBar;
    lstPyramidFilter: TRadioGroup;
    chkPyramidSmasher: TCheckBox;
    sbPyramidNormalisation: TScrollBar;
    pCellOnOff: TPanel;
    Label27: TLabel;
    pInvert: TPanel;
    Label4: TLabel;
    pWavelets: TPanel;
    lblWavelets: TLabel;
    pSubstract: TPanel;
    Label34: TLabel;
    pAdd: TPanel;
    Label50: TLabel;
    pBlur: TPanel;
    Label6: TLabel;
    sbBlurRadius: TScrollBar;
    pExplorer: TPanel;
    Label15: TLabel;
    Label16: TLabel;
    Label7: TLabel;
    sbExplorerX: TScrollBar;
    sbExplorerY: TScrollBar;
    pHistogramContrast: TPanel;
    Label36: TLabel;
    Label37: TLabel;
    Label38: TLabel;
    Label39: TLabel;
    Label40: TLabel;
    Label41: TLabel;
    Label42: TLabel;
    Label43: TLabel;
    Label44: TLabel;
    Label48: TLabel;
    sbHistogramContrastRectangleWidth: TScrollBar;
    sbHistogramContrastRectangleHeight: TScrollBar;
    txtHistogramContrastRectangleWidth: TEdit;
    txtHistogramContrastRectangleHeight: TEdit;
    sbHistogramContrastPrecision: TScrollBar;
    txtHistogramContrastPrecision: TEdit;
    cbHistogramContrastMode: TComboBox;
    sbHistogramContrastGridSpacingWidth: TScrollBar;
    sbHistogramContrastGridSpacingHeight: TScrollBar;
    txtHistogramContrastGridSpacingWidth: TEdit;
    txtHistogramContrastGridSpacingHeight: TEdit;
    sbHistogramContrastBlur: TScrollBar;
    txtHistogramContrastBlur: TEdit;
    pContrastExplorer: TPanel;
    Label19: TLabel;
    Label28: TLabel;
    sbContrastExplorerPrecision: TScrollBar;
    txtContrastExplorerPrecision: TEdit;
    pGranularityExplorer: TPanel;
    Label45: TLabel;
    Label46: TLabel;
    Label49: TLabel;
    sbGranularityExplorerPrecision: TScrollBar;
    txtGranularityExplorerPrecision: TEdit;
    sbGranularityExplorerSensibility: TScrollBar;
    txtGranularityExplorerSensibility: TEdit;
    pApplication2: TPanel;
    LblSurfaceInspection2: TLabel;
    Label53: TLabel;
    rtfInspection2: TRichEdit;
    txtApplication2DefectAreaMin: TEdit;
    sbApplication2DefectAreaMin: TScrollBar;
    pConvolutions: TPanel;
    ViewerImageConv: TImage;
    Label5: TLabel;
    lstConvType: TListBox;
    pLocalDeviation: TPanel;
    Label79: TLabel;
    LblLocalDeviation: TLabel;
    sbPercentLocalDeviation: TScrollBar;
    txtPercentLocalDeviation: TEdit;
    sbLocalDeviationSize: TScrollBar;
    txtLocalDeviationSize: TEdit;
    pApplication1: TPanel;
    Label62: TLabel;
    Label52: TLabel;
    Label54: TLabel;
    shapeApplication1Decision: TShape;
    Label57: TLabel;
    Label63: TLabel;
    Label64: TLabel;
    txtApplication1DefectAreaMin: TEdit;
    sbApplication1DefectAreaMin: TScrollBar;
    RichEdit1: TRichEdit;
    txtApplication1NumberOfDefects: TEdit;
    txtApplication1MinNumberOfDefectsForOK: TEdit;
    sbApplication1MinNumberOfDefectsForOK: TScrollBar;
    txtApplication1MaxNumberOfDefectsForNG: TEdit;
    sbApplication1MaxNumberOfDefectsForNG: TScrollBar;
    pConstantAdd: TPanel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    sbConstantAdd: TScrollBar;
    txtConstantAddValue: TEdit;
    cbConstantAddOverflowingMode: TComboBox;
    pCopy: TPanel;
    Label75: TLabel;
    Label89: TLabel;
    pHistogram: TPanel;
    Label31: TLabel;
    Label32: TLabel;
    Label33: TLabel;
    Label90: TLabel;
    cbHistogramNormalize: TComboBox;
    sbHistogramPrecision: TScrollBar;
    txtHistogramPrecision: TEdit;
    pMorphology: TPanel;
    Label22: TLabel;
    Label23: TLabel;
    Label24: TLabel;
    Label29: TLabel;
    sbMorphologySE_size: TScrollBar;
    txtMorphologySE_size: TEdit;
    sbMorphologyIteration: TScrollBar;
    txtMorphologyIteration: TEdit;
    pSobel: TPanel;
    Label17: TLabel;
    Label18: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label26: TLabel;
    Label65: TLabel;
    sbSobelBlurIteration: TScrollBar;
    txtSobelBlurIteration: TEdit;
    sbSobelGain: TScrollBar;
    txtSobelGain: TEdit;
    sbSobelThresholdLower: TScrollBar;
    txtSobelThresholdLower: TEdit;
    sbSobelThresholdUpper: TScrollBar;
    txtSobelThresholdUpper: TEdit;
    cbSobelModeFast: TComboBox;
    pSUSAN: TPanel;
    Label66: TLabel;
    Label67: TLabel;
    Label68: TLabel;
    Label69: TLabel;
    Label71: TLabel;
    Label72: TLabel;
    sbSUSANprecision: TScrollBar;
    txtSUSANprecision: TEdit;
    txtSUSANpixelBrightnessDifferenceThreshold: TEdit;
    sbSUSANpixelBrightnessDifferenceThreshold: TScrollBar;
    cbSUSANmode: TComboBox;
    sbSUSANpixelCentroidDifferenceThreshold: TScrollBar;
    txtSUSANpixelCentroidDifferenceThreshold: TEdit;
    cbSUSANmasktype: TComboBox;
    pDistancesMap: TPanel;
    lblDistanceMap: TLabel;
    lblMaxEDM: TLabeledEdit;
    gBeforeDistanceMap: TGroupBox;
    chkDistanceMapPreInvert: TCheckBox;
    gAfterDistanceMap: TGroupBox;
    sbDistanceMapScale: TScrollBar;
    pNonMaximaSuppression: TPanel;
    Label74: TLabel;
    Label91: TLabel;
    cbNonMaximaSuppressionOutputColor: TComboBox;
    pThresholdBinary: TPanel;
    Label2: TLabel;
    Label3: TLabel;
    Label14: TLabel;
    sbThresholdBinaryLower: TScrollBar;
    txtThresholdBinaryLowerValue: TEdit;
    sbThresholdBinaryUpper: TScrollBar;
    txtThresholdBinaryUpperValue: TEdit;
    rdgLow: TRadioGroup;
    rdgMiddle: TRadioGroup;
    rdgHigh: TRadioGroup;
    pSPV: TPanel;
    Label76: TLabel;
    Label70: TLabel;
    Label78: TLabel;
    Label80: TLabel;
    Label81: TLabel;
    Label82: TLabel;
    Label77: TLabel;
    Label85: TLabel;
    Label86: TLabel;
    Label87: TLabel;
    Label88: TLabel;
    txtSPVScanLineIncrement: TEdit;
    sbSPVScanLineIncrement: TScrollBar;
    txtSPVmaximalTrackingStep: TEdit;
    sbSPVmaximalTrackingStep: TScrollBar;
    txtSPVmaximalTrackingCycles: TEdit;
    sbSPVmaximalTrackingCycles: TScrollBar;
    cbSPVmonitoring: TComboBox;
    txtSPVpolygonalApproximationEpsilone: TEdit;
    sbSPVpolygonalApproximationEpsilone: TScrollBar;
    txtSPVBackground: TEdit;
    sbSPVBackground: TScrollBar;
    cbSPVShowVectorWidth: TComboBox;
    cbSPVShowConnectedVector: TComboBox;
    pBlobExplorer: TPanel;
    Label56: TLabel;
    Label58: TLabel;
    Label60: TLabel;
    Label55: TLabel;
    Label83: TLabel;
    Label84: TLabel;
    Label105: TLabel;
    Label106: TLabel;
    sbBlobExplorerAreaMin: TScrollBar;
    txtBlobExplorerAreaMin: TEdit;
    txtBlobExplorerAreaMax: TEdit;
    sbBlobExplorerAreaMax: TScrollBar;
    cbBlobExplorerEnableBlobArea: TComboBox;
    txtBlobExplorerNumberOfBlobs: TEdit;
    txtBlobExplorerIntensityBackground: TEdit;
    sbBlobExplorerIntensityBackground: TScrollBar;
    txtBlobExplorerIntensityPrecision: TEdit;
    sbBlobExplorerIntensityPrecision: TScrollBar;
    chkBlobExplorerContour: TCheckBox;
    chkBlobExplorerCriticalPoints: TCheckBox;
    txtBlobExplorerCriticalPointsAppoximationAccuracy: TEdit;
    sbBlobExplorerCriticalPointsAppoximationAccuracy: TScrollBar;
    cbBlobExplorerApproximationMethod: TComboBox;
    pContour: TPanel;
    Label103: TLabel;
    Label104: TLabel;
    Label59: TLabel;
    Label61: TLabel;
    txtContourThreshold: TEdit;
    sbContourThreshold: TScrollBar;
    chkContourFill: TCheckBox;
    chkContourCriticalPoints: TCheckBox;
    txtContourApproximationaccuracy: TEdit;
    sbContourApproximationaccuracy: TScrollBar;
    pCanny: TPanel;
    Label95: TLabel;
    Label98: TLabel;
    Label99: TLabel;
    txtCannyThreshold1: TEdit;
    sbCannyThreshold1: TScrollBar;
    txtCannyThreshold2: TEdit;
    sbCannyThreshold2: TScrollBar;
    pLogPolar: TPanel;
    Label94: TLabel;
    Label93: TLabel;
    txtLogpolarMagnitude: TEdit;
    sbLogpolarMagnitude: TScrollBar;
    chkLogpolarReinversetransformation: TCheckBox;
    pCutter: TPanel;
    Label97: TLabel;
    Label102: TLabel;
    Label108: TLabel;
    cbCutterType: TComboBox;
    chkCutterMonitoring: TCheckBox;
    sbCutterOutImages: TScrollBar;
    pCutterTiles: TPanel;
    Label107: TLabel;
    Label101: TLabel;
    txtCutterRectHeight: TEdit;
    sbCutterRectHeight: TScrollBar;
    txtCutterRectWidth: TEdit;
    sbCutterRectWidth: TScrollBar;
    pAdjust: TPanel;
    lblAdjust: TLabel;
    Label109: TLabel;
    lblBrightness: TLabel;
    sbConstrast: TScrollBar;
    sbBrightness: TScrollBar;
    pStandardDeviation: TPanel;
    Label25: TLabel;
    Label30: TLabel;
    Label47: TLabel;
    sbPercentStandardDeviation: TScrollBar;
    txtPercentStandardDeviation: TEdit;
    cbStandardDeviationOutputColor: TComboBox;
    pnlControl: TPanel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    cmdProcess: TButton;
    txtProcessCount: TEdit;
    txtProcessTime: TEdit;
    chkShowRoi: TCheckBox;
    chkUseROI: TCheckBox;
    pnlRight: TPanel;
    lbFiltersClassic: TListBox;
    lbFiltersOther: TListBox;
    lbApplications: TListBox;
    pMedian: TPanel;
    Label110: TLabel;
    Label111: TLabel;
    sbMedian: TScrollBar;
    txtMedian: TEdit;
    pnlRightTop: TPanel;
    cbFilterType: TComboBox;
    cmdCopyImageOut1ToImageOut2: TButton;
    chkWaveletsInverse: TCheckBox;
    Label92: TLabel;
    cbSubstractMode: TComboBox;
    Label51: TLabel;
    Label96: TLabel;
    Label35: TLabel;
    pCutterBlob: TPanel;
    Label100: TLabel;
    txtCutterBlobBackground: TEdit;
    sbCutterBlobBackground: TScrollBar;
    Label113: TLabel;
    txtCutterBlobAreaMin: TEdit;
    sbCutterBlobAreaMin: TScrollBar;
    txtCutterBlobAreaMax: TEdit;
    sbCutterBlobAreaMax: TScrollBar;
    txtCutterOutimageIndex: TEdit;
    chkBlobExplorerSurfaceInfo: TCheckBox;
    pRotation: TPanel;
    lblRotation: TLabel;
    sbRotationAngle: TScrollBar;
    txtRotationAngle: TEdit;
    sbRotationCenterX: TScrollBar;
    sbRotationCenterY: TScrollBar;
    rdgRotationInterpolation: TRadioGroup;
    Label114: TLabel;
    Label115: TLabel;
    Label116: TLabel;
    Label117: TLabel;
    txtCutterMargin: TEdit;
    sbCutterMargin: TScrollBar;
    Label118: TLabel;
    cbRotationMissingpixelcolormode: TComboBox;
    Label119: TLabel;
    chkRotationMonitoring: TCheckBox;
    chkRotationAutoadjustsize: TCheckBox;
    pIntegration: TPanel;
    lblIntegration: TLabel;
    sbIntegrationScale: TScrollBar;
    sbIntegrationOffset: TScrollBar;
    rdgBlurMode: TRadioGroup;
    pBlobRepositioning: TPanel;
    Label120: TLabel;
    chkBlobRepositioningMonitoring: TCheckBox;
    cbBlobRepositioningMonitoringView: TComboBox;
    txtBlobRepositioningComputedAngle: TEdit;
    lblBlobRepositioningMonitoringView: TLabel;
    Label130: TLabel;
    pVectorHistogram: TPanel;
    Label125: TLabel;
    Label133: TLabel;
    sbVectorHistogramSmooth: TScrollBar;
    Panel2: TPanel;
    Label129: TLabel;
    Label134: TLabel;
    Label135: TLabel;
    Label136: TLabel;
    Label137: TLabel;
    txtVectorHistogramBlobNumero: TEdit;
    sbVectorHistogramBlobNumero: TScrollBar;
    Label139: TLabel;
    txtSubstractDeltaTotal: TEdit;
    chkCutterBlobUseblobrepositioning: TCheckBox;
    pCorrelation: TPanel;
    Label141: TLabel;
    Label145: TLabel;
    txtCorrelationCorrelation: TEdit;
    Label142: TLabel;
    txtVectorHistogramSmooth: TEdit;
    cbVectorHistogramAngleprecision: TComboBox;
    PageControl1: TPageControl;
    tabBlobRepositioningPreprocessing: TTabSheet;
    tabBlobRepositioningMethodVectorhistogram: TTabSheet;
    Label127: TLabel;
    Label128: TLabel;
    txtBlobRepositioningSimulateAngle: TEdit;
    sbBlobRepositioningSimulateAngle: TScrollBar;
    Label131: TLabel;
    sbBlobRepositioningSmooth: TScrollBar;
    Label143: TLabel;
    cbBlobRepositioningVectorhistogramAngleprecision: TComboBox;
    pResize: TPanel;
    lblResize: TLabel;
    sbResizeScale: TScrollBar;
    cbResizeMode: TComboBox;
    txtResizeScale: TEdit;
    Label144: TLabel;
    Label146: TLabel;
    TabSheet1: TTabSheet;
    Label147: TLabel;
    txtBlobRepositioningAutomatictestAngleFrom: TEdit;
    txtBlobRepositioningAutomatictestAngleTo: TEdit;
    Label148: TLabel;
    Label149: TLabel;
    cmdBlobRepositioningAutomatictest: TButton;
    txtBlobRepositioningAutomatictestAngleInc: TEdit;
    txtBlobRepositioningAutomatictestAverageError: TEdit;
    Label150: TLabel;
    Label151: TLabel;
    pbBlobRepositioningAutomatictest: TProgressBar;
    Label155: TLabel;
    txtBlobRepositioningAutomatictestMaxError: TEdit;
    Label156: TLabel;
    cmdBlobRepositioningAutomatictestStop: TButton;
    pGradientAnisotropicDiffusion: TPanel;
    Label153: TLabel;
    Label154: TLabel;
    txtGradientAnisotropicDiffusionConductance: TEdit;
    sbGradientAnisotropicDiffusionConductance: TScrollBar;
    Label157: TLabel;
    txtGradientAnisotropicDiffusionIteration: TEdit;
    sbGradientAnisotropicDiffusionIteration: TScrollBar;
    pRescaleIntensity: TPanel;
    Label158: TLabel;
    Label159: TLabel;
    Label160: TLabel;
    txtRescaleIntensityMinimum: TEdit;
    sbRescaleIntensityMinimum: TScrollBar;
    txtRescaleIntensityMaximum: TEdit;
    sbRescaleIntensityMaximum: TScrollBar;
    pWaves: TPanel;
    lblWaves: TLabel;
    cmdWavesStep: TButton;
    Label161: TLabel;
    cbGradientAnisotropicDiffusionMethod: TComboBox;
    pSigmoid: TPanel;
    Label162: TLabel;
    Label163: TLabel;
    Label164: TLabel;
    txtSigmoidMinimum: TEdit;
    sbSigmoidMinimum: TScrollBar;
    txtSigmoidMaximum: TEdit;
    sbSigmoidMaximum: TScrollBar;
    Label165: TLabel;
    txtSigmoidAlpha: TEdit;
    sbSigmoidAlpha: TScrollBar;
    Label166: TLabel;
    txtSigmoidBeta: TEdit;
    sbSigmoidBeta: TScrollBar;
    pBilateral: TPanel;
    Label167: TLabel;
    Label168: TLabel;
    Label169: TLabel;
    txtBilateralDomainsigma: TEdit;
    sbBilateralDomainsigma: TScrollBar;
    txtBilateralRangesigma: TEdit;
    sbBilateralRangeSigma: TScrollBar;
    ApplicationEvents: TApplicationEvents;
    chkWavesContinue: TCheckBox;
    Label170: TLabel;
    txtCorrelationRangeMin: TEdit;
    sbCorrelationRangeMin: TScrollBar;
    Label171: TLabel;
    txtCorrelationRangeMax: TEdit;
    sbCorrelationRangeMax: TScrollBar;
    chkCorrelationMonitoring: TCheckBox;
    txtBlobRepositioningAutomatictestAngle: TEdit;
    Label172: TLabel;
    Label173: TLabel;
    cbHistogramFeature: TComboBox;
    pImageLoader: TPanel;
    Label174: TLabel;
    Label176: TLabel;
    cmdImageLoaderLoad: TButton;
    lstImageLoaderViewImage: TListBox;
    Label175: TLabel;
    cmdImageLoaderOpen: TButton;
    txtImageLoaderFiles: TMemo;
    dlgImageLoaderOpen: TOpenDialog;
    pImageSaver: TPanel;
    Label177: TLabel;
    Label178: TLabel;
    cmdImageSaverSave: TButton;
    cmdImageSaverSelect: TButton;
    txtImageSaverFilename: TMemo;
    rgImageSaverImage: TRadioGroup;
    dlgImageSaverSelect: TSaveDialog;
    pProjectionLine: TPanel;
    Label179: TLabel;
    Label180: TLabel;
    sbProjectionLineSmooth: TScrollBar;
    Panel3: TPanel;
    Label182: TLabel;
    Label183: TLabel;
    Label184: TLabel;
    Label185: TLabel;
    txtProjectionLinePreprocessingBlobIndex: TEdit;
    sbProjectionLinePreprocessingBlobIndex: TScrollBar;
    txtProjectionLineSmooth: TEdit;
    Label181: TLabel;
    Label186: TLabel;
    txtProjectionLinePreprocessingSimulateAngle: TEdit;
    sbProjectionLinePreprocessingSimulateAngle: TScrollBar;
    Label187: TLabel;
    rgProjectionLineInput: TRadioGroup;
    Label195: TLabel;
    Label196: TLabel;
    txtVectorHistogramPreprocessingAngle: TEdit;
    sbVectorHistogramPreprocessingAngle: TScrollBar;
    pBlobBalance: TPanel;
    Label188: TLabel;
    Panel4: TPanel;
    Label190: TLabel;
    Label191: TLabel;
    Label192: TLabel;
    Label193: TLabel;
    Label194: TLabel;
    Label197: TLabel;
    Label198: TLabel;
    txtBlobBalancePreprocessingBlobIndex: TEdit;
    sbBlobBalancePreprocessingBlobIndex: TScrollBar;
    txtBlobBalancePreprocessingAngle: TEdit;
    sbBlobBalancePreprocessingAngle: TScrollBar;
    chkBlobBalanceMonitoring: TCheckBox;
    Label189: TLabel;
    txtProjectionLineMaximum: TEdit;
    Label199: TLabel;
    txtBlobBalanceAngle: TEdit;
    cmdBlobBalanceSetAngleToZero: TButton;
    Label200: TLabel;
    cmdBlobRepositioningLearn: TButton;
    Label140: TLabel;
    txtBlobRepositioningMargin: TEdit;
    sbBlobRepositioningMargin: TScrollBar;
    txtBlobRepositioningBlobThreshold: TEdit;
    Label123: TLabel;
    sbBlobRepositioningBlobThreshold: TScrollBar;
    Label122: TLabel;
    txtBlobRepositioningBlobAreaMin: TEdit;
    sbBlobRepositioningBlobAreaMin: TScrollBar;
    txtBlobRepositioningBlobAreaMax: TEdit;
    sbBlobRepositioningBlobAreaMax: TScrollBar;
    pBlobRepositioning2: TPanel;
    Label124: TLabel;
    Label132: TLabel;
    Label138: TLabel;
    chkBlobRepositioning2Monitoring: TCheckBox;
    txtBlobRepositioning2ComputedAngle: TEdit;
    PageControl2: TPageControl;
    TabSheet2: TTabSheet;
    Label152: TLabel;
    Label201: TLabel;
    txtBlobRepositioning2SimulateAngle: TEdit;
    sbBlobRepositioning2SimulateAngle: TScrollBar;
    TabSheet3: TTabSheet;
    Label205: TLabel;
    Label206: TLabel;
    Label207: TLabel;
    cmdBlobRepositioning2Learn: TButton;
    txtBlobRepositioning2Margin: TEdit;
    sbBlobRepositioning2Margin: TScrollBar;
    txtBlobRepositioning2BlobThreshold: TEdit;
    sbBlobRepositioning2BlobThreshold: TScrollBar;
    txtBlobRepositioning2BlobAreaMin: TEdit;
    sbBlobRepositioning2BlobAreaMin: TScrollBar;
    txtBlobRepositioning2BlobAreaMax: TEdit;
    sbBlobRepositioning2BlobAreaMax: TScrollBar;
    TabSheet4: TTabSheet;
    Label208: TLabel;
    Label209: TLabel;
    Label210: TLabel;
    Label211: TLabel;
    Label212: TLabel;
    Label213: TLabel;
    Label214: TLabel;
    Label215: TLabel;
    Label216: TLabel;
    txtBlobRepositioning2AutomatictestAngleFrom: TEdit;
    txtBlobRepositioning2AutomatictestAngleTo: TEdit;
    cmdBlobRepositioning2Automatictest: TButton;
    txtBlobRepositioning2AutomatictestAngleInc: TEdit;
    txtBlobRepositioning2AutomatictestAverageError: TEdit;
    pbBlobRepositioning2Automatictest: TProgressBar;
    txtBlobRepositioning2AutomatictestMaxError: TEdit;
    cmdBlobRepositioning2AutomatictestStop: TButton;
    txtBlobRepositioning2AutomatictestAngle: TEdit;
    cbBlobRepositioning2MonitoringView: TComboBox;
    Label126: TLabel;
    Label121: TLabel;
    Label202: TLabel;
    txtBlobRepositioning2Error: TEdit;
    Label203: TLabel;
    txtBlobRepositioningError: TEdit;
    sbHelp: TSpeedButton;
    chkCutterBlobClean: TCheckBox;
    chkPyramidNormalize: TCheckBox;
    MemoHelp: TMemo;
    lstMorphologyType: TListBox;
    pBlobGrouping: TPanel;
    Label204: TLabel;
    Label217: TLabel;
    txtBlobGroupingIntensityPrecision: TEdit;
    sbBlobGroupingIntensityPrecision: TScrollBar;
    chkStandardDeviationShowOnlyROI: TCheckBox;
    Label218: TLabel;
    txtExplorerPrecision: TEdit;
    sbExplorerPrecision: TScrollBar;
    txtExplorerX: TEdit;
    txtExplorerY: TEdit;
    chkBlobExplorerIgnoreBlobsOnImageEdges: TCheckBox;
    chkBlobRepositioning2BackgroundColor: TCheckBox;
    txtBlurRadius: TEdit;
    Label219: TLabel;
    pImageCreator: TPanel;
    Label220: TLabel;
    Label221: TLabel;
    txtImageCreatorHelp: TMemo;
    Label222: TLabel;
    txtImageCreatorCommand: TEdit;
    rgrpMorphoSE: TRadioGroup;
    gridMorphologySE: TStringGrid;
    cbContrastExplorerMode: TComboBox;
    Label223: TLabel;
    txtViewerToolText1: TEdit;
    txtViewerToolText2: TEdit;
    pCoOccurrenceMatrix: TPanel;
    lblCooccurenceMatrix: TLabel;
    sbCooccurenceHorSize: TScrollBar;
    lblHorCoSize: TLabel;
    txtHorCoSize: TEdit;
    cbCopyOutputColor: TComboBox;
    Label73: TLabel;
    txtVerCoSize: TEdit;
    sbCooccurenceVerSize: TScrollBar;
    Label224: TLabel;
    sbCoOccurenceScale: TScrollBar;
    txtCoocurrenceScale: TEdit;
    rdCoocurenceX: TRadioGroup;
    rdCoocurenceY: TRadioGroup;
    chkSobelAngleCalculation: TCheckBox;
    chkCoocurenceResultROI: TCheckBox;
    txtNonMaximaSuppressionGain: TEdit;
    Label225: TLabel;
    sbNonMaximaSuppressionGain: TScrollBar;
    chkSusanAngleCalculation: TCheckBox;
    txtSusanGain: TEdit;
    sbSusanGain: TScrollBar;
    Label226: TLabel;
    chkCoocurenceShift45: TCheckBox;
    Label227: TLabel;
    txtSubstractDeltaTotalNormalized: TEdit;
    sbGranularityExplorerDifferenceThreshold: TScrollBar;
    txtGranularityExplorerDifferenceThreshold: TEdit;
    Label228: TLabel;
    pStackAnalyser: TPanel;
    Label229: TLabel;
    lstStackAnalyserAnalyse: TListBox;
    Analyse: TLabel;
    sbStackAnalyserInImages: TScrollBar;
    Label230: TLabel;
    chkMask: TCheckBox;
    pStackCreator: TPanel;
    Label231: TLabel;
    sbStackCreatorImageIndex: TScrollBar;
    Label232: TLabel;
    txtStackCreatorImageIndex: TEdit;
    sbStackCreatorStackSize: TScrollBar;
    txtStackCreatorStackSize: TEdit;
    Label233: TLabel;
    chkStackCreatorDemoStackAnalyser: TCheckBox;
    pEnvelope: TPanel;
    Label234: TLabel;
    Label235: TLabel;
    lstEnvelopeOutputs: TListBox;
    Label236: TLabel;
    txtEnvelopeSmooth: TEdit;
    sbEnvelopeSmooth: TScrollBar;
    Label237: TLabel;
    pMeans: TPanel;
    Label238: TLabel;
    Label239: TLabel;
    sbMeansPrecision: TScrollBar;
    txtMeansPrecision: TEdit;
    pImageInfo: TPanel;
    Label240: TLabel;
    Label112: TLabel;
    txtImageInfoPixelMin: TEdit;
    Label241: TLabel;
    txtImageInfoPixelMax: TEdit;
    Label242: TLabel;
    txtImageInfoPixelMaxSubMin: TEdit;
    Label243: TLabel;
    cbAddMode: TComboBox;
    Label244: TLabel;
    GroupBox1: TGroupBox;
    Label245: TLabel;
    txtCoOccurrenceMatrixFeaturesEnergy: TEdit;
    Label246: TLabel;
    txtCoOccurrenceMatrixFeaturesEntropy: TEdit;
    Label247: TLabel;
    txtCoOccurrenceMatrixFeaturesContrast: TEdit;
    Label248: TLabel;
    txtCoOccurrenceMatrixFeaturesInversedifferencemoment: TEdit;
    Label249: TLabel;
    txtCoOccurrenceMatrixFeaturesAngularSecondMoment: TEdit;
    pLog: TPanel;
    Label250: TLabel;
    chkAdjustAuto: TCheckBox;
    chkLogAdjustAuto: TCheckBox;
    Label251: TLabel;
    txtLogIntensityMax: TEdit;
    sbLogIntensityMax: TScrollBar;
    Label252: TLabel;
    txtCoOccurrenceMatrixFeaturesDissimilarity: TEdit;
    Label253: TLabel;
    txtCoOccurrenceMatrixFeaturesMeanI: TEdit;
    Label254: TLabel;
    txtCoOccurrenceMatrixFeaturesMeanJ: TEdit;
    Label255: TLabel;
    Label256: TLabel;
    txtCoOccurrenceMatrixFeaturesVarianceI: TEdit;
    Label257: TLabel;
    txtCoOccurrenceMatrixFeaturesVarianceJ: TEdit;
    Label258: TLabel;
    txtCoOccurrenceMatrixFeaturesCorrelation: TEdit;
    rdgBlobRepositioning2RotationInterpolation: TRadioGroup;
    pCompare: TPanel;
    Label259: TLabel;
    Label260: TLabel;
    Label261: TLabel;
    Label262: TLabel;
    cbCompareMode: TComboBox;
    Label265: TLabel;
    Label263: TLabel;
    Label264: TLabel;
    pRGB: TPanel;
    sbRGBConstantR: TScrollBar;
    txtRGBConstantR: TEdit;
    cbRGBOverflowingMode: TComboBox;
    sbRGBConstantG: TScrollBar;
    txtRGBConstantG: TEdit;
    sbRGBConstantB: TScrollBar;
    txtRGBConstantB: TEdit;
    Label266: TLabel;
    Label267: TLabel;
    Label268: TLabel;
    Label269: TLabel;
    Label270: TLabel;
    chkBlobExplorerIntensityInvert: TCheckBox;
    pFiltersPlugin_TestDelphi: TPanel;
    Label271: TLabel;
    lbFiltersPlugins: TListBox;
    Label272: TLabel;
    pHoughTransform: TPanel;
    Label273: TLabel;
    Label274: TLabel;
    txtHoughTransformThreshold: TEdit;
    sbHoughTransformThreshold: TScrollBar;
    cbHoughTransformPreprocessor: TComboBox;
    Label275: TLabel;
    cbBlobExplorerImageToShow: TComboBox;
    Label276: TLabel;
    GroupBox2: TGroupBox;
    Label277: TLabel;
    txtPluginSampleOutputInteger: TEdit;
    Label278: TLabel;
    Label280: TLabel;
    Label281: TLabel;
    txtPluginSampleOutputFloat: TEdit;
    Label282: TLabel;
    testImageOutput: TLabel;
    Label283: TLabel;
    cbPluginSampleOutputImages: TComboBox;
    Label284: TLabel;
    txtPluginOutputArrayPointers: TMemo;
    Label285: TLabel;
    GroupBox3: TGroupBox;
    Label286: TLabel;
    txtPluginSampleParameterInteger: TEdit;
    Label279: TLabel;
    txtPluginSampleParameterFloat: TEdit;
    chkPluginSampleParameterBoolean: TCheckBox;
    Label287: TLabel;
    txtPluginSampleParameterString: TEdit;
    Label288: TLabel;
    Label289: TLabel;
    pFiltersPlugin_TestC: TPanel;
    Label290: TLabel;
    Label291: TLabel;
    GroupBox4: TGroupBox;
    Label292: TLabel;
    Label293: TLabel;
    Label294: TLabel;
    Label295: TLabel;
    Label296: TLabel;
    Label297: TLabel;
    Label298: TLabel;
    Label299: TLabel;
    txtPluginTestC_OutputInteger: TEdit;
    txtPluginTestC_OutputFloat: TEdit;
    cbPluginTestC_OutputImages: TComboBox;
    txtPluginTestC_OutputArrayPointers: TMemo;
    GroupBox5: TGroupBox;
    Label300: TLabel;
    Label301: TLabel;
    Label302: TLabel;
    Label303: TLabel;
    Label304: TLabel;
    txtPluginTestC_ParameterInteger: TEdit;
    txtPluginTestC_ParameterFloat: TEdit;
    chkPluginTestC_ParameterBoolean: TCheckBox;
    txtPluginTestC_ParameterString: TEdit;
    pFiltersPlugin_Video: TPanel;
    Label305: TLabel;
    chkPluginVideoShowViewer: TCheckBox;
    cmdPluginVideoFileName: TButton;
    dlgPluginVideoOpen: TOpenDialog;
    txtPluginVideoFileName: TEdit;
    cmdPluginVideoLoad: TButton;
    cmdPluginVideoPlay: TButton;
    cmdPluginVideoStop: TButton;
    Label306: TLabel;
    cmdPluginVideoPause: TButton;
    pFiltersPlugin_WebCam: TPanel;
    Label307: TLabel;
    Label308: TLabel;
    chkPluginWebCamShowViewer: TCheckBox;
    btnPluginWebCamGetDevices: TButton;
    lbPluginWebCamDevices: TListBox;
    btnPluginWebCamGetFormats: TButton;
    lbPluginWebCamDeviceFormats: TListBox;
    txtPluginWebCamDeviceIndex: TEdit;
    chkPluginWebCamDeviceOpenClose: TCheckBox;
    txtPluginWebCamFormatIndex: TEdit;
    PageControlSource: TPageControl;
    tabImage: TTabSheet;
    tabVideo: TTabSheet;
    tabWebCam: TTabSheet;
    cmdLoadImage: TButton;
    cmdSave: TButton;
    btnWebCamLive: TButton;
    cbWebCamDevice: TComboBox;
    cbWebCamFormat: TComboBox;
    lblROI: TLabel;
    cmdLoadVideo: TButton;
    cmdPlay: TBitBtn;
    cmdPause: TBitBtn;
    cmdStop: TBitBtn;
    btnVideoCapture: TButton;
    chkVideoAutoCaptureRun: TCheckBox;
    btnWebCamCapture: TButton;
    chkWebCamAutoCaptureRun: TCheckBox;
    pFiltersPlugin_Viewer: TPanel;
    Label309: TLabel;
    Label310: TLabel;
    chkPluginViewerShowViewer: TCheckBox;
    pFiltersPlugin_Resonator: TPanel;
    lblResonator: TLabel;
    lblOmega: TLabel;
    scrOmega: TScrollBar;
    txtViewerToolText3: TEdit;
    pFiltersPlugin_SnapShot: TPanel;
    Label311: TLabel;
    Label312: TLabel;
    btnPluginSnapShotGetWindowsTitle: TButton;
    lbPluginSnapShotWindowsTitle: TListBox;
    txtPluginSnapShotWindowTitle: TEdit;
    btnPluginSnapShotApplication: TButton;
    txtPluginSnapShotApplication: TEdit;
    Label313: TLabel;
    txtPluginSnapShotWindowHandle: TEdit;
    Label314: TLabel;
    Label315: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure readCommandLine();
    procedure AcceptFiles( var msg : TMessage ); message WM_DROPFILES;
    procedure cmdLoadImageClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
    procedure sbConstantAddChange(Sender: TObject);
    procedure cbConstantAddOverflowingModeChange(Sender: TObject);
    procedure lstConvTypeClick(Sender: TObject);
    procedure sbThresholdBinaryLowerChange(Sender: TObject);
    procedure sbThresholdBinaryUpperChange(Sender: TObject);
    procedure sbExplorerXChange(Sender: TObject);
    procedure splMidleMoved(Sender: TObject);
    procedure pcTestChange(Sender: TObject);
    procedure sbSobelChange(Sender: TObject);
    procedure sbContrastExplorerPrecisionChange(Sender: TObject);
    procedure sbMorphologySE_sizeChange(Sender: TObject);
    procedure cbMorphologyTypeChange(Sender: TObject);
    procedure sbMorphologyIterationChange(Sender: TObject);
    procedure sbPercentStandardDeviationChange(Sender: TObject);
    procedure shpROIMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure shpROIMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ViewerImageInMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    procedure lbFiltersClassicClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure cmdProcessClick(Sender: TObject);
    procedure chkUseROIClick(Sender: TObject);
    procedure ViewerImageInMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ViewerImageInMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure cbHistogramNormalizeChange(Sender: TObject);
    procedure sbHistogramPrecisionChange(Sender: TObject);
    procedure cbFilterTypeChange(Sender: TObject);
    procedure lbFiltersOtherClick(Sender: TObject);
    procedure sbBlurRadiusChange(Sender: TObject);
    procedure splTopMoved(Sender: TObject);
    procedure sbHistogramContrastRectangleWidthChange(Sender: TObject);
    procedure sbHistogramContrastRectangleHeightChange(Sender: TObject);
    procedure sbHistogramContrastPrecisionChange(Sender: TObject);
    procedure sbPyramidChange(Sender: TObject);
    procedure cbHistogramContrastModeChange(Sender: TObject);
    procedure sbHistogramContrastGridSpacingWidthChange(Sender: TObject);
    procedure sbHistogramContrastGridSpacingHeightChange(Sender: TObject);
    procedure btnWebCamLiveClick(Sender: TObject);
    procedure cbWebCamDeviceChange(Sender: TObject);
    procedure cmdCopyImageOut2Click(Sender: TObject);
    procedure btnVideoCaptureClick(Sender: TObject);
    procedure chkVideoAutoCaptureRunClick(Sender: TObject);
    procedure sbGranularityExplorerPrecisionChange(Sender: TObject);
    procedure cbStandardDeviationOutputColorChange(Sender: TObject);
    procedure sbHistogramContrastBlurChange(Sender: TObject);
    procedure sbGranularityExplorerSensibilityChange(Sender: TObject);
    procedure lstPyramidFilterClick(Sender: TObject);
    procedure cmdCopyImageOut1ToImageOut2Click(Sender: TObject);
    procedure sbBlobExplorerChange(Sender: TObject);
    procedure cbBlobExplorerEnableBlobSizeChange(Sender: TObject);
    procedure sbPyramidNormalisationChange(Sender: TObject);
    procedure lbApplicationsClick(Sender: TObject);
    procedure sbApplication1DefectAreaMinChange(Sender: TObject);
    procedure sbApplication2DefectAreaMinChange(Sender: TObject);
    procedure sbApplication1MinMaxNumberOfDefectsChange(Sender: TObject);
    procedure cbSobelModeFastChange(Sender: TObject);
    procedure sbSUSANprecisionChange(Sender: TObject);
    procedure sbSUSANpixelBrightnessDifferenceThresholdChange(
      Sender: TObject);
    procedure cbSUSANmodeChange(Sender: TObject);
    procedure sbSUSANpixelCentroidDifferenceThresholdChange(
      Sender: TObject);
    procedure sbSPVScanLineIncrementChange(Sender: TObject);
    procedure cbSPVbackgroundColorChange(Sender: TObject);
    procedure lbFiltersClassicDblClick(Sender: TObject);
    procedure sbLocalDeviationSizeChange(Sender: TObject);
    procedure chkShowRoiClick(Sender: TObject);
    procedure sbBlobExplorerIntensityBackgroundChange(Sender: TObject);
    procedure pnlFiltersDblClick(Sender: TObject);
    procedure ViewerImageOut2Click(Sender: TObject);
    procedure sbDistanceMapScaleChange(Sender: TObject);
    procedure chkDistanceMapPreInvertClick(Sender: TObject);
    procedure TimerAutoProcessTimer(Sender: TObject);
    procedure rdgThresholdClick(Sender: TObject);
    procedure cbNonMaximaSuppressionOutputColorChange(Sender: TObject);
    procedure lbFiltersOtherDblClick(Sender: TObject);
    procedure lbApplicationsDblClick(Sender: TObject);
    procedure lbFiltersOpencvDblClick(Sender: TObject);
    procedure sbContourThresholdChange(Sender: TObject);
    procedure chkContourFillClick(Sender: TObject);
    procedure cmdLoadVideoClick(Sender: TObject);
    procedure cmdCopyImageOutClick(Sender: TObject);
    procedure cmdSaveClick(Sender: TObject);
    procedure cmdPauseClick(Sender: TObject);
    procedure cmdStopClick(Sender: TObject);
    procedure cmdPlayClick(Sender: TObject);
    procedure chkBlobExplorerCriticalPointsClick(Sender: TObject);
    procedure sbBlobExplorerCriticalPointsAppoximationAccuracyChange(
      Sender: TObject);
    procedure shpViewerToolROIMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure shpViewerToolROIMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    procedure ViewerImageOutMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    procedure ViewerImageOutMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure rbgViewerToolsClick(Sender: TObject);
    procedure HeightField1GetHeight(const x, y: Single; var z: Single;
      var color: TVector4f; var texPoint: TTexPoint);
    procedure ViewerToolGLSceneMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure ViewerToolGLSceneMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    procedure shpViewerToolROIMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure sbLogpolarMagnitudeChange(Sender: TObject);
    procedure chkLogpolarReinversetransformationClick(Sender: TObject);
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: Types.TPoint; var Handled: Boolean);
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: Types.TPoint; var Handled: Boolean);
    procedure sbCutterRectWidthChange(Sender: TObject);
    procedure sbCutterRectHeightChange(Sender: TObject);
    procedure chkCutterMonitoringClick(Sender: TObject);
    procedure sbCutterOutImagesChange(Sender: TObject);
    procedure sbConstrastChange(Sender: TObject);
    procedure sbBrightnessChange(Sender: TObject);
    procedure sbMedianChange(Sender: TObject);
    procedure sbCannyThresholdChange(Sender: TObject);
    procedure chkWaveletsInverseClick(Sender: TObject);
    procedure cbSubstractModeChange(Sender: TObject);
    procedure cbCutterTypeChange(Sender: TObject);
    procedure sbCutterBlobBackgroundChange(Sender: TObject);
    procedure sbCutterBlobAreaChange(Sender: TObject);
    procedure sbRotationAngleChange(Sender: TObject);
    procedure sbRotationCenterXChange(Sender: TObject);
    procedure rdgRotationInterpolationClick(Sender: TObject);
    procedure sbCutterMarginChange(Sender: TObject);
    procedure cbRotationMissingpixelcolormodeChange(Sender: TObject);
    procedure chkRotationMonitoringClick(Sender: TObject);
    procedure sbIntegrationScaleChange(Sender: TObject);
    procedure sbIntegrationOffsetChange(Sender: TObject);
    procedure rdgBlurModeClick(Sender: TObject);
    procedure sbBlobRepositioningBlobNumeroChange(Sender: TObject);
    procedure sbBlobRepositioningSimulateAngleChange(Sender: TObject);
    procedure cbBlobRepositioningMonitoringViewChange(Sender: TObject);
    procedure sbBlobRepositioningSmoothChange(Sender: TObject);
    procedure cmdBlobRepositioningLearnClick(Sender: TObject);
    procedure sbVectorHistogramSmoothChange(Sender: TObject);
    procedure sbVectorHistogramBlobNumeroChange(Sender: TObject);
    procedure sbBlobRepositioningMarginChange(Sender: TObject);
    procedure chkCutterBlobUseblobrepositioningClick(Sender: TObject);
    procedure cbVectorHistogramAngleprecisionChange(Sender: TObject);
    procedure chkBlobRepositioningMonitoringClick(Sender: TObject);
    procedure cbBlobRepositioningMethodChange(Sender: TObject);
    procedure cbBlobRepositioningVectorhistogramAngleprecisionChange(
      Sender: TObject);
    procedure sbResizeScaleChange(Sender: TObject);
    procedure cbResizeModeChange(Sender: TObject);
    procedure cmdBlobRepositioningAutomatictestClick(Sender: TObject);
    procedure cmdBlobRepositioning2AutomatictestClick(Sender: TObject);
    procedure cmdBlobRepositioningAutomatictestStopClick(Sender: TObject);
    procedure sbGradientAnisotropicDiffusionConductanceChange(
      Sender: TObject);
    procedure sbRescaleIntensityChange(Sender: TObject);
    procedure cmdWavesStepClick(Sender: TObject);
    procedure cbGradientAnisotropicDiffusionMethodChange(Sender: TObject);
    procedure sbSigmoidMinimumChange(Sender: TObject);
    procedure sbBilateralDomainsigmaChange(Sender: TObject);
    procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
    procedure sbCorrelationRangeMinChange(Sender: TObject);
    procedure chkCorrelationMonitoringClick(Sender: TObject);
    procedure cbHistogramFeatureChange(Sender: TObject);
    procedure shpROIMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure cmdImageLoaderLoadClick(Sender: TObject);
    procedure cmdImageLoaderOpenClick(Sender: TObject);
    procedure lstImageLoaderViewImageClick(Sender: TObject);
    procedure cmdImageSaverSaveClick(Sender: TObject);
    procedure cmdImageSaverSelectClick(Sender: TObject);
    procedure sbProjectionLinePreprocessingBlobIndexChange(
      Sender: TObject);
    procedure sbProjectionLineSmoothChange(Sender: TObject);
    procedure sbProjectionLinePreprocessingSimulateAngleChange(
      Sender: TObject);
    procedure rgProjectionLineInputClick(Sender: TObject);
    procedure sbVectorHistogramPreprocessingAngleChange(Sender: TObject);
    procedure sbBlobBalancePreprocessingAngleChange(Sender: TObject);
    procedure sbBlobBalancePreprocessingBlobIndexChange(Sender: TObject);
    procedure chkBlobBalanceMonitoringClick(Sender: TObject);
    procedure cmdBlobBalanceSetAngleToZeroClick(Sender: TObject);
    procedure txtBlobRepositioningBlobThresholdChange(Sender: TObject);
    procedure sbBlobRepositioningBlobChange(Sender: TObject);
    procedure cmdBlobRepositioning2LearnClick(Sender: TObject);
    procedure sbHelpClick(Sender: TObject);
    procedure MemoHelpMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure chkPyramidSmasherClick(Sender: TObject);
    procedure lbFiltersClassicMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure lstMorphologyTypeClick(Sender: TObject);
    procedure sbBlobGroupingIntensityPrecisionChange(Sender: TObject);
    procedure chkStandardDeviationShowOnlyROIClick(Sender: TObject);
    procedure sbExplorerPrecisionChange(Sender: TObject);
    procedure chkBlobRepositioning2BackgroundColorClick(Sender: TObject);
    procedure txtImageCreatorCommandKeyPress(Sender: TObject;
      var Key: Char);
    procedure rgrpMorphoSEClick(Sender: TObject);
    procedure gridMorphologySEMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure gridMorphologySEMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    procedure cbContrastExplorerModeChange(Sender: TObject);
    procedure sbCooccurenceHorSizeChange(Sender: TObject);
    procedure cbCopyOutputColorChange(Sender: TObject);
    procedure rdCoocurenceClick(Sender: TObject);
    procedure chkSobelAngleCalculationClick(Sender: TObject);
    procedure chkCoocurenceResultROIClik(Sender: TObject);
    procedure sbNonMaximaSuppressionGainChange(Sender: TObject);
    procedure chkSusanAngleCalculationClick(Sender: TObject);
    procedure sbSusanGainChange(Sender: TObject);
    procedure ViewerImageOutDblClick(Sender: TObject);
    procedure chkCoocurenceShift45Click(Sender: TObject);
    procedure sbGranularityExplorerDifferenceThresholdChange(
      Sender: TObject);
    procedure lstStackAnalyserAnalyseClick(Sender: TObject);
    procedure sbStackAnalyserInImagesChange(Sender: TObject);
    procedure chkMaskClick(Sender: TObject);
    procedure sbStackCreatorImageIndexChange(Sender: TObject);
    procedure chkStackCreatorDemoStackAnalyserClick(Sender: TObject);
    procedure lstEnvelopeOutputsClick(Sender: TObject);
    procedure sbEnvelopeSmoothChange(Sender: TObject);
    procedure sbMeansPrecisionChange(Sender: TObject);
    procedure cbAddModeChange(Sender: TObject);
    procedure chkAdjustAutoClick(Sender: TObject);
    procedure sbLogIntensityMaxChange(Sender: TObject);
    procedure sbRGBConstantRChange(Sender: TObject);
    procedure chkBlobExplorerIntensityInvertClick(Sender: TObject);
    procedure lbFiltersPluginsClick(Sender: TObject);
    procedure lbFiltersPluginsDblClick(Sender: TObject);
    procedure sbHoughTransformThresholdChange(Sender: TObject);
    procedure cbHoughTransformPreprocessorChange(Sender: TObject);
    procedure cbBlobExplorerImageToShowChange(Sender: TObject);
    procedure cbPluginSampleOutputImagesChange(Sender: TObject);
    procedure txtPluginSampleParameterIntegerChange(Sender: TObject);
    procedure chkPluginSampleParameterBooleanClick(Sender: TObject);
    procedure txtImageCreatorHelpDblClick(Sender: TObject);
    procedure chkPluginVideoShowViewerClick(Sender: TObject);
    procedure cmdPluginVideoFileNameClick(Sender: TObject);
    procedure lstPluginVideoCommandClick(Sender: TObject);
    procedure cmdPluginVideoLoadClick(Sender: TObject);
    procedure cmdPluginVideoPlayClick(Sender: TObject);
    procedure cmdPluginVideoStopClick(Sender: TObject);
    procedure cmdPluginVideoPauseClick(Sender: TObject);
    procedure btnPluginWebCamGetDevicesClick(Sender: TObject);
    procedure lbPluginWebCamDevicesClick(Sender: TObject);
    procedure btnPluginWebCamGetFormatsClick(Sender: TObject);
    procedure lbPluginWebCamDevicesDblClick(Sender: TObject);
    procedure chkPluginWebCamDeviceOpenCloseClick(Sender: TObject);
    procedure lbPluginWebCamDeviceFormatsClick(Sender: TObject);
    procedure lbPluginWebCamDeviceFormatsDblClick(Sender: TObject);
    procedure btnWebCamCaptureClick(Sender: TObject);
    procedure chkWebCamAutoCaptureRunClick(Sender: TObject);
    procedure cbWebCamFormatChange(Sender: TObject);
    procedure chkPluginViewerShowViewerClick(Sender: TObject);
    procedure chkBlobExplorerContourClick(Sender: TObject);
    procedure btnPluginSnapShotGetWindowsTitleClick(Sender: TObject);
    procedure lbPluginSnapShotWindowsTitleDblClick(Sender: TObject);
    procedure lbPluginSnapShotWindowsTitleClick(Sender: TObject);
    procedure btnPluginSnapShotApplicationClick(Sender: TObject);
  private
    filterArithmeticAdd : Integer;
    filterArithmeticConstantAdd : Integer;
    filterRGB : Integer;
    filterArithmeticSubstract : Integer;
    filterBlobExplorer : Integer;
    filterBlobRepositioning : Integer;
    filterBlobRepositioning2 : Integer;
    fRotationForSimulateAngle : Integer;
    fBlobExplorerForBlob : Integer;
    filterBlur : Integer;
    filterContrastExplorer : Integer;
    filterConvolution : Integer;
    filterCoOccurrenceMatrix : Integer;
    filterCopy : Integer;
    filterDistancesMap : Integer;
    filterExplorer : Integer;
    filterGranularityExplorer : Integer;
    filterHistogram : Integer;
    filterHistogramContrast : Integer;
    filterInvert : Integer;
    filterResize : Integer;
    filterLocalDeviation : Integer;
    filterMorphology : Integer;
    filterNonMaximaSuppression : Integer;
    filterMeans : Integer;
    filterImageInfo : Integer;
    filterMedian : Integer;
    filterNormalize : Integer;
    filterOnOffCell : Integer;
    filterPyramid : Integer;
    filterCutter : Integer;
    filterSobel : Integer;
    filterSPV : Integer;
    filterStackAnalyser : Integer;
    filterEnvelope : Integer;
    filterStackCreator : Integer;
    filterStackProcessor : Integer;
    filterStackSmasher : Integer;
    filterStandardDeviation : Integer;
    filterSUSAN : Integer;
    filterThresholdBinary : Integer;
    filterWavelet : Integer;
    filterAdjust : Integer;
    filterCanny : Integer;
    filterCompare : Integer;
    filterContour : Integer;
    filterLog : Integer;
    filterLogPolar : Integer;
    filterHoughTransform : Integer;
    filterRotation : Integer;
    filterViewerToolCopy : Integer;
    filterViewerToolExplorer : Integer;
    filterIntegration : Integer;
    filterVectorHistogram : Integer;
    filterCorrelation : Integer;
    filterGradientAnisotropicDiffusion : Integer;
    filterRescaleIntensity : Integer;
    filterWaves : Integer;
    filterSigmoid : Integer;
    filterSmoothBilateral : Integer;
    filterImageCreator : Integer;
    filterImageLoader : Integer;
    filterImageSaver : Integer;
    filterProjectionLine : Integer;
    filterBlobBalance : Integer;
    filterBlobGrouping : Integer;
    filtersPlugin_Resonator : Integer;
    filtersPlugin_TestDelphi : Integer;
    filtersPlugin_TestC : Integer;
    filtersPlugin_Video : Integer;
    filtersPlugin_Video2 : Integer;
    filtersPlugin_WebCam : Integer;
    filtersPlugin_WebCam2 : Integer;
    filtersPlugin_Viewer : Integer;
    filtersPlugin_SnapShot : Integer;

    testing : boolean;
    isWavesSimpleRun : Boolean ;
    convImage : PBitmap32;
    imageIn, imageOut, imageOut2 : PBitmap32;
    imageSimulateAngle : PBitmap32;
    imageBlob : PBitmap32;
    imagesInStackAnalyser : ArrayOfPBitmap32;
    imageMask : PBitmap32;
    viewertoolImageOut : PBitmap32;
    moveROI, resizeROI : boolean;
    mouseDownX : Integer ;
    mouseDownY : Integer ;
    cameraDownX, cameraDownY, cameraDownZ : Single ;
    cameraDownRollAngle : Single ;
    moveViewerToolROI, resizeViewerToolROI : boolean;
    poi : TPoint;
    roi : TRect;
    roiViewerTool : TRect;
    panelActif : TPanel;
    image1, image2 : PBitmap32;
    application1 : TApplication1;
    application2 : TApplication2;
    bCapture : TBitmap;
    bAutotestStop : boolean;
    selectedPoint : TFPoint;
    viewertoolGlscene_mx, viewertoolGlscene_my : Integer;
    blobRepositioningLearnedAngle,blobRepositioning2LearnedAngle : Single;
    morphoSE : PBitmap32;
    _runCommand : String;
    _videoPlaying : Boolean;

    procedure setModeProd(b:boolean);
    procedure Test();
    procedure preprocessSimulateAngle( img : PBitmap32; angle : Single );
    procedure preprocessBlob( img : PBitmap32 );
    procedure preprocessStackAnalyser();
    procedure preprocessMask();
    procedure changeFilter(lb: TListBox);
    procedure setImageIn(aImage:PBitmap32);
    procedure setROI(X,Y,W,H:Integer);
    procedure setViewerToolROI(X,Y,W,H:Integer);
    procedure setLineXY(aLine:TShape;aLeft,aTop,aWidth,aHeight:Integer);
    procedure initLive;
    procedure processViewerTool;
    procedure processViewerToolPixelinfo( mouseX, mouseY : Integer );
    function calculAngleError(angleCurrent,angleOnLearn,computedAngle:Single) : Single;
    procedure updateMorphologySE();
    procedure initPanelImageCreator;
  end;

var
  MainForm: TMainForm;

implementation
uses
  Math, Chronometer, Jpeg, ShellAPI, fmask;

var
  _PROD : boolean;

{$R *.dfm}

procedure TMainForm.setModeProd(b:boolean);
begin
  _PROD:=b;
  if _PROD=true then begin
    cbFilterType.Items.Add('applications');
  end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  initialize();

  DecimalSeparator := '.';

  testing := false;
  moveROI := false;
  resizeROI := false;
  moveViewerToolROI := false;
  resizeViewerToolROI := false;

  bCapture := TBitmap.Create ;
  //bCapture.PixelFormat := pf24bit;
  bAutotestStop := false;

  Caption := 'FiltersTest '+StrPas( getVersion() )+'  -  http://filters.sourceforge.net             by filters@edurand.com and filters@burgel.com';

  // create imageIn
  setImageIn( image.createImageTest(512,512) );

  // create imageOut
  image.freeImage(imageOut);
  imageOut:=image.createImageLike(imageIn);
  image.freeImage(imageOut2);
  imageOut2:=image.createImageLike(imageIn);

  filterThresholdBinary:=createFilter('filterThresholdBinary');
  filterInvert :=  createFilter('filterInvert');
  filterResize := createFilter('filterResize');
  filterBlur :=  createFilter('filterBlur');
  filterExplorer := createFilter('filterExplorer');
  filterSobel := createFilter('filterSobel');
  filterOnOffCell := createFilter('filterOnOffCell');
  filterArithmeticConstantAdd := createFilter('filterArithmeticConstantAdd');
  filterRGB := createFilter('filterRGB');
  filterArithmeticAdd := createFilter('filterArithmeticAdd');;
  filterArithmeticSubstract := createFilter('filterArithmeticSubstract');
  filterContrastExplorer := createFilter('filterContrastExplorer');
  filterCoOccurrenceMatrix := createFilter('filterCoOccurrenceMatrix');
  filterGranularityExplorer := createFilter('filterGranularityExplorer');
  filterMorphology := createFilter('filterMorphology');
  filterStandardDeviation := createFilter('filterStandardDeviation');
  filterHistogram := createFilter('filterHistogram');
  filterWavelet := createFilter('filterHaar');
  filterPyramid := createFilter('filterPyramid');
  filterEnvelope := createFilter('filterEnvelope');
  filterStackAnalyser := createFilter('filterStackAnalyser');
  filterStackCreator := createFilter('filterStackCreator');
  filterStackProcessor := createFilter('filterStackProcessor');
  filterHistogramContrast:=createFilter('filterHistogramContrast');
  filterStackSmasher := createFilter('filterStackSmasher');
  filterBlobExplorer := createFilter('filterBlobExplorer');
  filterBlobRepositioning := createFilter('filterBlobRepositioning');
  filterBlobRepositioning2 := createFilter('filterBlobRepositioning2');;
  fRotationForSimulateAngle:=createFilter('filterRotation');
  fBlobExplorerForBlob := createFilter('filterBlobExplorer');
  filterNormalize := createFilter('filterNormalize');
  filterSUSAN := createFilter('filterSUSAN');
  filterNonMaximaSuppression := createFilter('filterNonMaximaSuppression');
  filterMeans := createFilter('filterMeans');
  filterImageInfo := createFilter('filterImageInfo');
  filterMedian := createFilter('filterMedian');
  filterCopy := createFilter('filterCopy');
  filterSPV := createFilter('filterSPV');
  filterLocalDeviation := createFilter('filterLocalDeviation');
  filterDistancesMap := createFilter('filterDistancesMap');
  filterCutter := createFilter('filterCutter');
  filterAdjust := createFilter('filterAdjust');
  filterCanny := createFilter('filterCanny');
  filterCompare := createFilter('filterCompare');
  filterContour := createFilter('filterContour');
  filterLog := createFilter('filterLog');
  filterLogPolar := createFilter('filterLogPolar');
  filterHoughTransform := createFilter('filterHoughTransform');
  filterRotation := createFilter('filterRotation');
  filterIntegration := createFilter('filterIntegration');
  filterVectorHistogram := createFilter('filterVectorHistogram');
  filterCorrelation := createFilter('filterCorrelation');
  filterGradientAnisotropicDiffusion := createFilter('filterGradientAnisotropicDiffusion');
  filterRescaleIntensity := createFilter('filterRescaleIntensity');
  filterWaves := createFilter('filterWaves');
  filterSigmoid :=createFilter('filterSigmoid');
  filterSmoothBilateral := createFilter('filterSmoothBilateral');
  filterImageCreator := createFilter('filterImageCreator');
  filterImageLoader := createFilter('filterImageLoader');
  filterImageSaver := createFilter('filterImageSaver');
  filterProjectionLine := createFilter('filterProjectionLine');
  filterBlobBalance := createFilter('filterBlobBalance');
  filterBlobGrouping := createFilter('filterBlobGrouping');

  filtersPlugin_Resonator := createFilter('filtersPlugin_Resonator');
  filtersPlugin_TestDelphi := createFilter('filtersPlugin_TestDelphi');
  filtersPlugin_TestC := createFilter('filtersPlugin_TestC');
  filtersPlugin_Video := createFilter('filtersPlugin_Video');
  filtersPlugin_Video2 := createFilter('filtersPlugin_Video');
  _videoPlaying := False;
  filtersPlugin_WebCam := createFilter('filtersPlugin_WebCam');
  filtersPlugin_WebCam2 := createFilter('filtersPlugin_WebCam');
  filtersPlugin_Viewer := createFilter('filtersPlugin_Viewer');
  filtersPlugin_SnapShot := createFilter('filtersPlugin_SnapShot');

  filterViewerToolCopy := createFilter('filterCopy');
  filterViewerToolExplorer := createFilter('filterExplorer');

  filterConvolution := createFilter('filterConvolution');
  convImage := image.createImage(3, 3) ;
  setWeight(convImage, 0, 0, -16) ;
  setWeight(convImage, 1, 0, -16) ;
  setWeight(convImage, 2, 0, -16) ;
  setWeight(convImage, 0, 1, -16) ;
  setWeight(convImage, 1, 1, 127) ;
  setWeight(convImage, 2, 1, -16) ;
  setWeight(convImage, 0, 2, -16) ;
  setWeight(convImage, 1, 2, -16) ;
  setWeight(convImage, 2, 2, -16) ;
  setParameterImage(filterConvolution,'imageConv',convImage);
  setParameterInteger(filterConvolution,'z', $1);

  isWavesSimpleRun := false ;

  imageIOVideo.showImage(convImage,ViewerImageConv);

  cbFilterTypeChange(Self);
  initLive() ;

  application1 := TApplication1.Create();
  application2 := TApplication2.Create();
  eraseImage( imageOut );
  eraseImage( imageOut2 );

  blobRepositioningLearnedAngle := 0;
  blobRepositioning2LearnedAngle := 0;

  sbHelpClick( Self );

  // tell Windows that you're accepting drag and drop files
  DragAcceptFiles( Handle, True );

  initPanelImageCreator();

  rgrpMorphoSEClick( Self );

  readCommandLine();
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  application1.Free();
  application2.Free();

  deleteFilter(filterBlobGrouping);
  deleteFilter(filterBlobBalance);
  deleteFilter(filterProjectionLine);
  deleteFilter(filterImageSaver);
  deleteFilter(filterImageLoader);
  deleteFilter(filterImageCreator);
  deleteFilter(filterSmoothBilateral);
  deleteFilter(filterSigmoid);
  deleteFilter(filterRescaleIntensity);
  deleteFilter(filterGradientAnisotropicDiffusion);
  deleteFilter(filterCorrelation);
  deleteFilter(filterVectorHistogram);
  deleteFilter(fBlobExplorerForBlob);
  deleteFilter(fRotationForSimulateAngle);
  deleteFilter(filterBlobRepositioning2);
  deleteFilter(filterBlobRepositioning);
  deleteFilter(filterBlobExplorer);
  deleteFilter(filterHistogramContrast);
  deleteFilter(filterHistogram);
  deleteFilter(filterStandardDeviation);
  deleteFilter(filterMorphology);
  deleteFilter(filterContrastExplorer);
  deleteFilter(filterGranularityExplorer);
  deleteFilter(filterOnOffCell);
  deleteFilter(filterSobel);
  deleteFilter(filterExplorer);
  deleteFilter(filterBlur);
  deleteFilter(filterArithmeticAdd);
  deleteFilter(filterArithmeticSubstract);
  deleteFilter(filterArithmeticConstantAdd);
  deleteFilter(filterRGB);
  deleteFilter(filterThresholdBinary);
  deleteFilter(filterInvert);
  deleteFilter(filterResize);
  deleteFilter(filterConvolution);
  deleteFilter(filterWavelet);
  deleteFilter(filterPyramid);
  deleteFilter(filterEnvelope);
  deleteFilter(filterStackAnalyser);
  deleteFilter(filterStackCreator);
  deleteFilter(filterStackProcessor);
  deleteFilter(filterStackSmasher);
  deleteFilter(filterNormalize);
  deleteFilter(filterSUSAN);
  deleteFilter(filterNonMaximaSuppression);
  deleteFilter(filterMeans);
  deleteFilter(filterImageInfo);
  deleteFilter(filterMedian);
  deleteFilter(filterCopy);
  deleteFilter(filterSPV);
  deleteFilter(filterLocalDeviation);
  deleteFilter(filterDistancesMap);
  deleteFilter(filterCutter);
  deleteFilter(filterAdjust);
  deleteFilter(filterCanny);
  deleteFilter(filterContour);
  deleteFilter(filterCompare);
  deleteFilter(filterLog);
  deleteFilter(filterLogPolar);
  deleteFilter(filterHoughTransform);
  deleteFilter(filterRotation);
  deleteFilter(filterIntegration);
  deleteFilter(filterWaves);
  deleteFilter(filterCoOccurrenceMatrix) ;
  deleteFilter(filtersPlugin_Resonator) ;
  deleteFilter(filtersPlugin_TestDelphi);
  deleteFilter(filtersPlugin_TestC);
  deleteFilter(filtersPlugin_Video);
  deleteFilter(filtersPlugin_Video2);
  deleteFilter(filtersPlugin_WebCam);
  deleteFilter(filtersPlugin_WebCam2);
  deleteFilter(filtersPlugin_Viewer);
  deleteFilter(filtersPlugin_SnapShot);

  deleteFilter(filterViewerToolCopy);
  deleteFilter(filterViewerToolExplorer);

  image.freeImage( morphoSE );
  image.freeImage( imageIn );
  image.freeImage( imageOut );
  image.freeImage( imageOut2 );
  image.freeImage( convImage );
  image.freeImage( imageSimulateAngle );
  image.freeImage( imageBlob );
  image.freeImages( @imagesInStackAnalyser );
  image.freeImage( imageMask );
  bCapture.Free;

  unInitialize();
end;

procedure TMainForm.readCommandLine();
var
  i, tmpI : integer;
begin
  if ParamCount>=1 then begin
    // we will use the ImageLoader panel
    tmpI := lbFiltersClassic.Items.IndexOf('ImageLoader');
    lbFiltersClassic.Selected[tmpI] := True;
    txtImageLoaderFiles.Text := '';
    changeFilter(lbFiltersClassic);
    for i:=1 to ParamCount do begin
      txtImageLoaderFiles.Text := txtImageLoaderFiles.Text + ParamStr(i) + ';';
    end;
    cmdImageLoaderLoad.Click();
  end;
end;

// code inspired from : http://www.chami.com/tips/delphi/111196D.html
procedure TMainForm.AcceptFiles( var msg : TMessage );
const
  cnMaxFileNameLen = 255;
var
  i,
  nCount     : integer;
  acFileName : array [0..cnMaxFileNameLen] of char;
  tmpI : Integer;
begin
  // find out how many files we're accepting
  nCount := DragQueryFile( msg.WParam, $FFFFFFFF, acFileName, cnMaxFileNameLen );
  if nCount>0 then begin
    // we will use the ImageLoader panel
    tmpI := lbFiltersClassic.Items.IndexOf('ImageLoader');
    lbFiltersClassic.Selected[tmpI] := True;
    txtImageLoaderFiles.Text := '';
    changeFilter(lbFiltersClassic);
    // query Windows one at a time for the file name
    for i := 0 to nCount-1 do begin
      DragQueryFile( msg.WParam, i, acFileName, cnMaxFileNameLen );
      // do your thing with the acFileName
      //MessageBox( Handle, acFileName, '', MB_OK );
      txtImageLoaderFiles.Text := txtImageLoaderFiles.Text + acFileName + ';';
    end;
    cmdImageLoaderLoad.Click();
  end;
  // let Windows know that you're done
  DragFinish( msg.WParam );
end;

procedure TMainForm.pnlFiltersDblClick(Sender: TObject);
begin
  setModeProd( true );
  cmdLoadVideo.Visible := True;
end;

procedure TMainForm.initLive();
var
  tmpI : integer;
  pointers : PArrayOfPointers;
  tmpStr : String;
begin
  setParameterBoolean( filtersPlugin_WebCam2, 'showViewer', False );
  runCommand( filtersPlugin_WebCam2, 'READ_DEVICES' );
  // get devices list
  pointers := getOutputArrayPointers( filtersPlugin_WebCam2, 'devices' );
  // we know that it is pointers on C string
  cbWebCamDevice.Clear();
  for tmpI:=0 to Length(pointers^)-1 do begin
    tmpStr := StrPas( pointers^[tmpI] );
    cbWebCamDevice.Items.Add( tmpStr );
  end;
end;

procedure TMainForm.setImageIn(aImage:PBitmap32);
begin
  image.freeImage( imageIn );
  imageIn := aImage;
  // show imageIn
  imageIOVideo.showImage( imageIn, ViewerImageIn );
  // show imageOut
  //imageIOVideo.showImage(imageOut,ViewerImageOut);
  //imageIOVideo.showImage(imageOut2,ViewerImageOut2);
  // show imageIn size
  imageInSize.Caption:=IntToStr(imageIn.Width)+'*'+IntToStr(imageIn.Height);
  selectedPoint.x:=imageIn.Width div 2;
  selectedPoint.y:=imageIn.Height div 2;
  // specific test
  sbExplorerX.Max := imageIn.Width-1;
  sbExplorerX.Position := Floor(selectedPoint.x);
  sbExplorerY.Max := imageIn.Height-1;
  sbExplorerY.Position := Floor(selectedPoint.y);
  sbRotationCenterX.Max:=imageIn.Width;
  sbRotationCenterX.Position:=sbRotationCenterX.Max div 2;
  sbRotationCenterY.Max:=imageIn.Height;
  sbRotationCenterY.Position:=sbRotationCenterY.Max div 2;
  // reset lineX/Y
  setLineXY(lineX,lineX.Left,0,lineX.Width,ViewerImageIn.Height);
  setLineXY(lineY,0,lineY.Top,ViewerImageIn.Width,LineY.Height);
  // image shown is set to nil
  image1 := nil;
  image2 := nil;
  //
  image.freeImages( @imagesInStackAnalyser );
  image.freeImage( imageMask );
end;

{procedure TMainForm.setImageOut(aImage:PBitmap32);
begin
  freeBitmap(imageOut);
  imageOut:=image.createImageFromImage(image);
end;}

procedure TMainForm.setLineXY(aLine:TShape;aLeft,aTop,aWidth,aHeight:Integer);
begin
  with aLine do begin
    Left:=aLeft;
    Top:=aTop;
    Width:=aWidth;
    Height:=aHeight;
    Refresh;
  end;
  poi.X := LineX.Left * imageIn.Width div ViewerImageIn.Width;
  poi.Y := LineY.Top * imageIn.Height div ViewerImageIn.Height;
end;

procedure TMainForm.cmdLoadImageClick(Sender: TObject);
Var
  fileName : String ;
begin
  if dlgOpen.Execute then Begin
    fileName := dlgOpen.FileName ;
    if extractFileExt(fileName) = '.avi' Then Begin

    end else Begin
      setImageIn(imageio.createImageFromFile(fileName));
    end ;
  end;
end;

procedure TMainForm.cmdSaveClick(Sender: TObject);
var
  fileName : String ;
  tmpImageIn : PBitmap32;
begin
  tmpImageIn:=image1;
  if tmpImageIn=nil then begin
    tmpImageIn:=imageIn;
  end;
  if dlgSave.Execute then begin
    fileName := dlgSave.FileName ;
    copyImageToFile(tmpImageIn,fileName);
  end;
end;

procedure TMainForm.cmdCopyImageOutClick(Sender: TObject);
var
  copyImage : PBitmap32;
begin
  if image1<>nil then begin
    copyImage:=image.createImageFromImage(image1);
    setImageIn(copyImage);
  end;
end;

procedure TMainForm.cmdCopyImageOut2Click(Sender: TObject);
begin
  if image2<>nil then begin
    setImageIn(image.createImageFromImage(image2));
  end;
end;

procedure TMainForm.btnVideoCaptureClick(Sender: TObject);
var
  imageOutput, aImage : PBitmap32;
begin
  run( filtersPlugin_Video2 );
  imageOutput := getOutputImage( filtersPlugin_Video2, 'outImage' );
  if imageOutput<>nil then begin
    aImage := image.createImageFromImage( imageOutput );
    setImageIn( aImage );
    Test();
  end;
end;

procedure TMainForm.btnWebCamCaptureClick(Sender: TObject);
var
  imageOutput, aImage : PBitmap32;
begin
  run( filtersPlugin_WebCam2 );
  imageOutput := getOutputImage( filtersPlugin_WebCam2, 'outImage' );
  if imageOutput<>nil then begin
    aImage := image.createImageFromImage( imageOutput );
    setImageIn( aImage );
    Test();
  end;
end;

procedure TMainForm.btnCloseClick(Sender: TObject);
begin
  Close();
end;

procedure TMainForm.Test();
var
  chrono : TChronometer;
  i, count : Integer;
  timePerRun : Integer;
  images : PArrayOfPBitmap32;
  pointers : PArrayOfPointers;
  decision : Integer;
  tmpPointer : Pointer;
  tmpI : Integer;
  tmpBlob : PBlob;
  tmpSingle : Single;
  tmpBoolean : boolean;
  tmpImage : PBitmap32;
  tmpImages : ArrayOfPBitmap32;
  tmpStr : String;
  tmpStrC : array[0..1024] of Char;
  x1, y1, x2, y2 : Integer ;
begin
 if testing=false then begin
  testing := true;
  image1:=imageOut; image2:=imageOut2;
  images:=nil;
  count:=StrToInt(txtProcessCount.Text);
  chrono:=TChronometer.Create;
  timePerRun:=0;
  for i:=1 to count do begin
    if panelActif=pAdd then begin
        imageOut2:=image.eraseOrCreateImageLike(imageOut2,imageIn);
        image2:=imageOut2;
        chrono.Start;
        setParameterImage( filterArithmeticAdd, 'inImage1', imageIn );
        setParameterImage( filterArithmeticAdd, 'inImage2', imageOut );
        setParameterImage( filterArithmeticAdd, 'outImage', imageOut2 );
        setParameterString( filterArithmeticAdd, 'mode', cbAddMode.Text );
        run( filterArithmeticAdd );
        chrono.Stop;
    end else
    if panelActif=pBlobExplorer then begin
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterBlobExplorer, 'inImage', imageIn );
        setParameterImage( filterBlobExplorer, 'outImage', imageOut );
        setParameterBoolean( filterBlobExplorer, 'intensityInvert', chkBlobExplorerIntensityInvert.Checked );
        setParameterInteger( filterBlobExplorer, 'intensityBackground', sbBlobExplorerIntensityBackground.Position );
        setParameterInteger( filterBlobExplorer, 'intensityPrecision', sbBlobExplorerIntensityPrecision.Position );
        setParameterString( filterBlobExplorer, 'enableBlobArea', cbBlobExplorerEnableBlobArea.Text );
        setParameterInteger( filterBlobExplorer, 'blobAreaMin', StrToInt(txtBlobExplorerAreaMin.Text) );
        setParameterInteger( filterBlobExplorer, 'blobAreaMax', StrToInt(txtBlobExplorerAreaMax.Text) );
        setParameterBoolean( filterBlobExplorer, 'contour', chkBlobExplorerContour.Checked );
        setParameterBoolean( filterBlobExplorer, 'criticalPoints', chkBlobExplorerCriticalPoints.Checked );
        setParameterInteger( filterBlobExplorer, 'contourCriticalPointsAppoximationAccuracy', sbBlobExplorerCriticalPointsAppoximationAccuracy.Position );
        setParameterString( filterBlobExplorer, 'approximationMethod', cbBlobExplorerApproximationMethod.Text );
        setParameterBoolean( filterBlobExplorer, 'blobSurfaceInfo', chkBlobExplorerSurfaceInfo.Checked );
        setParameterBoolean( filterBlobExplorer, 'ignoreBlobsOnImageEdges', chkBlobExplorerIgnoreBlobsOnImageEdges.Checked );
        if cbBlobExplorerImageToShow.Text='blobs' then begin
          setParameterBoolean( filterBlobExplorer, 'monitoring', False );
        end else begin
          setParameterBoolean( filterBlobExplorer, 'monitoring', True );
        end;
        run( filterBlobExplorer);
        chrono.Stop;
        pointers := getOutputArrayPointers( filterBlobExplorer, 'blobs' );
        txtBlobExplorerNumberOfBlobs.Text := IntToStr( Length(pointers^) );
    end else
    if panelActif=pBlobRepositioning then begin
        // to test this filter, we need to do somethings
        preprocessSimulateAngle(imageIn,StrToFloat(txtBlobRepositioningSimulateAngle.Text)); // this function set 'imageSimulateAngle'
        chrono.Start;
          setParameterImage(filterBlobRepositioning,'inImage',imageSimulateAngle);
          setParameterBoolean(filterBlobRepositioning,'monitoring',chkBlobRepositioningMonitoring.Checked);
          setParameterInteger(filterBlobRepositioning,'margin', sbBlobRepositioningMargin.Position);
          tmpI:=360;
          if cbBlobRepositioningVectorhistogramAngleprecision.ItemIndex=1 then tmpI:=720
          else if cbBlobRepositioningVectorhistogramAngleprecision.ItemIndex=2 then tmpI:=3600
          else if cbBlobRepositioningVectorhistogramAngleprecision.ItemIndex=3 then tmpI:=36000;
          setParameterInteger(filterBlobRepositioning,'blob_ThresholdBackground',sbBlobRepositioningBlobThreshold.Position);
          setParameterInteger(filterBlobRepositioning,'blob_AreaMin',StrToInt(txtBlobRepositioningBlobAreaMin.Text));
          setParameterInteger(filterBlobRepositioning,'blob_AreaMax',StrToInt(txtBlobRepositioningBlobAreaMax.Text));
          setParameterInteger(filterBlobRepositioning,'vectorHistogram_anglePrecision', tmpI);
          setParameterInteger(filterBlobRepositioning,'vectorHistogram_smooth', sbBlobRepositioningSmooth.Position);
          run(filterBlobRepositioning);
          chrono.Stop;
          image1 := getOutputImage(filterBlobRepositioning,'outImage');
          imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
          image.copyImageToImage(image1,imageOut);
          if chkBlobRepositioningMonitoring.Checked=true then begin
            images := getOutputImages(filterBlobRepositioning,'outImagesMonitoring');
            if (images<>nil) and (Length(images^)>0) then begin
              image2 := images^[cbBlobRepositioningMonitoringView.ItemIndex];
              imageOut2:=image.eraseOrCreateImageLike(imageOut2,image2);
              image.copyImageToImage(image2,imageOut2);
            end;
          end;
          tmpSingle:=getOutputFloat(filterBlobRepositioning,'angleToRestorOrientation');
          txtBlobRepositioningComputedAngle.Text := FloatToStrF(tmpSingle,ffFixed,4,1);
          tmpSingle:=calculAngleError(StrToFloat(txtBlobRepositioningSimulateAngle.Text),blobRepositioningLearnedAngle,getOutputFloat(filterBlobRepositioning,'angleToRestorOrientation'));
          txtBlobRepositioningError.Text := FloatToStrF(tmpSingle,ffFixed,4,1);
    end else
    if panelActif=pBlobRepositioning2 then begin
        // to test this filter, we need to do somethings
        preprocessSimulateAngle( imageIn, StrToFloat(txtBlobRepositioning2SimulateAngle.Text) ); // this function set 'imageSimulateAngle'
        chrono.Start;
          setParameterImage( filterBlobRepositioning2, 'inImage', imageSimulateAngle );
          setParameterBoolean( filterBlobRepositioning2, 'monitoring', chkBlobRepositioningMonitoring.Checked );
          setParameterInteger( filterBlobRepositioning2, 'margin', sbBlobRepositioning2Margin.Position );
          setParameterInteger( filterBlobRepositioning2, 'blob_ThresholdBackground', sbBlobRepositioning2BlobThreshold.Position );
          setParameterInteger( filterBlobRepositioning2, 'blob_AreaMin', StrToInt(txtBlobRepositioning2BlobAreaMin.Text) );
          setParameterInteger( filterBlobRepositioning2, 'blob_AreaMax', StrToInt(txtBlobRepositioning2BlobAreaMax.Text) );
          setParameterBoolean( filterBlobRepositioning2, 'backgroundColorBlack', chkBlobRepositioning2BackgroundColor.Checked );
          setParameterInteger( filterBlobRepositioning2, 'rotation_InterpolationMode', rdgBlobRepositioning2RotationInterpolation.ItemIndex );
          run( filterBlobRepositioning2 );
          chrono.Stop;
          image1 := getOutputImage( filterBlobRepositioning2, 'outImage' );
          imageOut := image.eraseOrCreateImageLike( imageOut, image1 );
          image.copyImageToImage( image1, imageOut );
          if chkBlobRepositioning2Monitoring.Checked=true then begin
            images := getOutputImages( filterBlobRepositioning2, 'outImagesMonitoring' );
            if (images<>nil) and (Length(images^)>0) then begin
              image2 := images^[cbBlobRepositioning2MonitoringView.ItemIndex];
              if image2<>nil then begin
                imageOut2 := image.eraseOrCreateImageLike( imageOut2, image2 );
                image.copyImageToImage( image2, imageOut2 );
              end;
            end;
          end;
          tmpSingle := getOutputFloat( filterBlobRepositioning2, 'angleToRestorOrientation' );
          txtBlobRepositioning2ComputedAngle.Text := FloatToStrF( tmpSingle, ffFixed, 4, 1 );
          tmpSingle := calculAngleError( StrToFloat(txtBlobRepositioning2SimulateAngle.Text), blobRepositioning2LearnedAngle, getOutputFloat(filterBlobRepositioning2, 'angleToRestorOrientation') );
          txtBlobRepositioning2Error.Text := FloatToStrF( tmpSingle, ffFixed, 6, 3 );
    end else
    if panelActif=pBlur then begin
        imageOut := image.eraseOrCreateImageLike(imageOut,imageIn);
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterBlur, 'inImage', imageIn );
        setParameterImage( filterBlur, 'outImage', imageOut );
        setParameterInteger( filterBlur, 'mode', rdgBlurMode.ItemIndex );
        setParameterInteger( filterBlur, 'radius', sbBlurRadius.position );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterBlur, @roi );
        end else begin
          unsetRegionOfInterest( filterBlur );
        end;
        run( filterBlur );
        chrono.Stop;
    end else
    if panelActif=pCellOnOff then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        imageOut2:=image.eraseOrCreateImageLike(imageOut2,imageIn);
        image2:=imageOut2;
        chrono.Start;
        setParameterImage(filterOnOffCell,'inImage',imageIn);
        setParameterImage(filterOnOffCell,'outImageON',imageOut);
        setParameterImage(filterOnOffCell,'outImageOFF',imageOut2);
        run(filterOnOffCell);
        chrono.Stop;
    end else
    if panelActif=pConstantAdd then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterArithmeticConstantAdd, 'inImage', imageIn );
        setParameterImage( filterArithmeticConstantAdd, 'outImage', imageOut );
        setParameterInteger( filterArithmeticConstantAdd, 'constant', sbConstantAdd.Position );
        setParameterString( filterArithmeticConstantAdd, 'overflowingMode', cbConstantAddOverflowingMode.Text );
        setParameterImage( filterArithmeticConstantAdd, 'mask', imageMask );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterArithmeticConstantAdd, @roi );
        end else begin
          unsetRegionOfInterest( filterArithmeticConstantAdd );
        end;
        run( filterArithmeticConstantAdd );
        chrono.Stop;
    end else
    if panelActif=pRGB then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterRGB, 'inImage', imageIn );
        setParameterImage( filterRGB, 'outImage', imageOut );
        setParameterInteger( filterRGB, 'constant_R', sbRGBConstantR.Position );
        setParameterInteger( filterRGB, 'constant_G', sbRGBConstantG.Position );
        setParameterInteger( filterRGB, 'constant_B', sbRGBConstantB.Position );
        setParameterString( filterRGB, 'overflowingMode', cbRGBOverflowingMode.Text );
        setParameterImage( filterRGB, 'mask', imageMask );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterRGB, @roi );
        end else begin
          unsetRegionOfInterest( filterRGB );
        end;
        run( filterRGB );
        chrono.Stop;
    end else
    if panelActif=pCorrelation then begin
        chrono.Start;
        setParameterImage(filterCorrelation,'inImage1',imageIn);
        setParameterImage(filterCorrelation,'inImage2',imageOut);
        setParameterInteger(filterCorrelation,'X',Floor(selectedPoint.x));
        setParameterInteger(filterCorrelation,'Y',Floor(selectedPoint.y));
        setParameterInteger(filterCorrelation,'rangeMin',sbCorrelationRangeMin.Position);
        setParameterInteger(filterCorrelation,'rangeMax',sbCorrelationRangeMax.Position);
        setParameterBoolean(filterCorrelation,'monitoring',chkCorrelationMonitoring.Checked);
        run(filterCorrelation);
        chrono.Stop;
        txtCorrelationCorrelation.Text:=FloatToStr(getOutputFloat(filterCorrelation,'correlation'));
        image2:=getOutputImage(filterCorrelation,'outImageMonitoring');
        imageOut2:=image.eraseOrCreateImageLike(imageOut2,image2);
        image.copyImageToImage(image2,imageOut2);
    end else
    if panelActif=pContrastExplorer then begin
        imageOut := image.eraseOrCreateImageLike(imageOut,imageIn);
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterContrastExplorer, 'inImage', imageIn );
        setParameterImage( filterContrastExplorer, 'outImage', imageOut );
        setParameterInteger( filterContrastExplorer, 'precision', sbContrastExplorerPrecision.Position );
        setParameterString( filterContrastExplorer, 'mode', cbContrastExplorerMode.Text );
        run( filterContrastExplorer );
        chrono.Stop;
    end else
    if panelActif=pConvolutions then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterConvolution,'inImage',imageIn);
        setParameterImage(filterConvolution,'outImage',imageOut);
        if lstConvType.ItemIndex>=0 then begin
          setParameterString(filterConvolution,'convType',lstConvType.items[lstConvType.ItemIndex]);
        end;
        run(filterConvolution);
        chrono.Stop;
    end else
    if panelActif=pCopy then begin
        preprocessMask(); // for imageMask
        chrono.Start;
        setParameterImage( filterCopy, 'inImage', imageIn );
        setParameterString( filterCopy, 'outputColor', cbCopyOutputColor.Text );
        setParameterImage( filterCopy, 'mask', imageMask );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterCopy, @roi );
        end else begin
          unsetRegionOfInterest( filterCopy );
        end;
        run( filterCopy );
        chrono.Stop;
        image1 := getOutputImage( filterCopy, 'outImage' );
        imageOut := image.eraseOrCreateImageLike( imageOut, image1 );
        image.copyImageToImage( image1, imageOut );
    end else
    if panelActif=pCutter then begin
        imageOut2:=image.eraseOrCreateImageLike(imageOut2,imageIn);
        image2:=imageOut2;
        chrono.Start;
        txtCutterOutimageIndex.Text:='';
        setParameterImage(filterCutter,'inImage',imageIn);
        setParameterImage(filterCutter,'outImageMonitoring',imageOut2);
        setParameterString(filterCutter,'type', cbCutterType.Text);
        setParameterInteger(filterCutter,'margin',sbCutterMargin.Position);
        if cbCutterType.Text='TILES' then begin
          setParameterInteger(filterCutter,'cutterTiles_RectWidth', sbCutterRectWidth.Position) ;
          setParameterInteger(filterCutter,'cutterTiles_RectHeight', sbCutterRectHeight.Position) ;
        end else
        if cbCutterType.Text='BLOB' then begin
          setParameterInteger(filterCutter,'cutterBlob_ThresholdBackground', sbCutterBlobBackground.Position);
          setParameterInteger(filterCutter,'cutterBlob_AreaMin', StrToInt(txtCutterBlobAreaMin.Text));
          setParameterInteger(filterCutter,'cutterBlob_AreaMax', StrToInt(txtCutterBlobAreaMax.Text));
          setParameterBoolean(filterCutter,'cutterBlob_Clean', chkCutterBlobClean.Checked);
          setParameterBoolean(filterCutter,'cutterBlob_UseBlobRepositioning', chkCutterBlobUseblobrepositioning.Checked);
        end;
        setParameterBoolean(filterCutter,'monitoring',chkCutterMonitoring.Checked);
        run(filterCutter);
        chrono.Stop;
        images := getOutputImages(filterCutter,'outImages');
        if images<>nil then begin
          if Length(images^)>0 then begin
            sbCutterOutImages.Max := Length(images^)-1 ;
          end else begin
            sbCutterOutImages.Max := 0;
          end;
          if sbCutterOutImages.position>=length(images^) then begin
            sbCutterOutImages.position:=0;
          end;
          if Length(images^)>0 then begin
            image1 := images^[sbCutterOutImages.position];
            imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
            image.copyImageToImage(image1,imageOut);
            sbCutterOutImagesChange(Self);
          end;
        end;
    end else
    if panelActif=pDistancesMap then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterDistancesMap,'inImage',imageIn);
        setParameterImage(filterDistancesMap,'outImage',imageOut);
        setParameterBoolean(filterDistancesMap,'preprocessInvert', chkDistanceMapPreInvert.Checked);
        setParameterInteger(filterDistancesMap,'scale', sbDistanceMapScale.Position) ;
        run(filterDistancesMap);
        chrono.Stop;
        lblMaxEDM.Text := IntToStr(getOutputInteger(filterDistancesMap,'maxEDM')) ;
    end else
    if panelActif=pExplorer then begin
        chrono.Start;
        setParameterImage( filterExplorer, 'inImage', imageIn );
        setParameterInteger( filterExplorer, 'X', Round(poi.x) );
        setParameterInteger( filterExplorer, 'Y', Round(poi.y) );
        setParameterInteger( filterExplorer, 'precision', sbExplorerPrecision.Position );
        run( filterExplorer );
        chrono.Stop;
        images := getOutputImages( filterExplorer, 'outImages' );
        image1 := images^[0];
        imageOut:=image.eraseOrCreateImageLike( imageOut, image1 );
        image.copyImageToImage( image1, imageOut );
        image2 := images^[1];
        imageOut2:=image.eraseOrCreateImageLike( imageOut2, image2 );
        image.copyImageToImage( image2, imageOut2 );
    end else
    if panelActif=pGranularityExplorer then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike(imageOut,imageIn);
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterGranularityExplorer, 'inImage', imageIn );
        setParameterImage( filterGranularityExplorer, 'outImage', imageOut );
        setParameterImage( filterGranularityExplorer, 'mask', imageMask );
        setParameterInteger( filterGranularityExplorer, 'precision', sbGranularityExplorerPrecision.Position );
        setParameterInteger( filterGranularityExplorer, 'sensibility', sbGranularityExplorerSensibility.Position );
        setParameterInteger( filterGranularityExplorer, 'differenceThreshold', sbGranularityExplorerDifferenceThreshold.Position );
        run( filterGranularityExplorer );
        chrono.Stop;
    end else
    if panelActif=pHistogram then begin
        chrono.Start;
        setParameterImage(filterHistogram,'inImage',imageIn);
        setParameterString(filterHistogram,'normalize',cbHistogramNormalize.Text);
        setParameterString(filterHistogram,'show','TRUE');
        setParameterInteger(filterHistogram,'precision',sbHistogramPrecision.Position);
        setParameterInteger(filterHistogram,'feature', cbHistogramFeature.ItemIndex);
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterHistogram, @roi );
        end else begin
          unsetRegionOfInterest(filterHistogram);
        end;
        run(filterHistogram);
        chrono.Stop;
        images := getOutputImages(filterHistogram,'outImages');
        image1 := images^[0];
        imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
        image.copyImageToImage(image1,imageOut);
    end else
    if panelActif=pHistogramContrast then begin
        chrono.Start;
        setParameterImage(filterHistogramContrast,'inImage',imageIn);
        setParameterString(filterHistogramContrast,'mode',cbHistogramContrastMode.Text);
        setParameterInteger(filterHistogramContrast,'rectangleWidth',sbHistogramContrastRectangleWidth.Position);
        setParameterInteger(filterHistogramContrast,'rectangleHeight',sbHistogramContrastRectangleHeight.Position);
        setParameterInteger(filterHistogramContrast,'gridSpacingWidth',sbHistogramContrastGridSpacingWidth.Position);
        setParameterInteger(filterHistogramContrast,'gridSpacingHeight',sbHistogramContrastGridSpacingHeight.Position);
        setParameterInteger(filterHistogramContrast,'precision',sbHistogramContrastPrecision.Position);
        setParameterInteger(filterHistogramContrast,'blurIteration',sbHistogramContrastBlur.Position);
        if chkUseROI.Checked=true then begin
          setRegionOfInterest(filterHistogramContrast,@roi);
        end else begin
          unsetRegionOfInterest(filterHistogramContrast);
        end;
        run(filterHistogramContrast);
        chrono.Stop;
        images := getOutputImages(filterHistogramContrast,'outImages');
        image1 := images^[0];
        imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
        image.copyImageToImage(image1,imageOut);
        image2 := images^[1];
        if image2<>nil then begin
          imageOut2:=image.eraseOrCreateImageLike(imageOut2,image2);
          image.copyImageToImage(image2,imageOut2);
        end;
    end else
    if panelActif=pInvert then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterInvert,'inImage',imageIn);
        setParameterImage(filterInvert,'outImage',imageOut);
        if chkUseROI.Checked=true then begin
          setRegionOfInterest(filterInvert,@roi);
        end else begin
          unsetRegionOfInterest(filterInvert);
        end;
        run(filterInvert);
        chrono.Stop;
    end else
    if panelActif=pMeans then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterMeans, 'inImage', imageIn );
        setParameterImage( filterMeans, 'outImage', imageOut );
        setParameterImage( filterMeans, 'mask', imageMask );
        setParameterInteger( filterMeans, 'precision', sbMeansPrecision.Position );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterMeans, @roi );
        end else begin
          unsetRegionOfInterest( filterMeans );
        end;
        run( filterMeans );
        chrono.Stop;
    end else
    if panelActif=pMedian then begin
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterMedian, 'inImage', imageIn );
        setParameterImage( filterMedian, 'outImage', imageOut );
        setParameterInteger( filterMedian, 'precision', sbMedian.Position );
        run( filterMedian );
        chrono.Stop;
    end else
    if panelActif=pMorphology then begin
        imageOut := image.eraseOrCreateImageLike(imageOut,imageIn);
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterMorphology, 'inImage', imageIn );
        setParameterImage( filterMorphology, 'outImage', imageOut );
        setParameterImage( filterMorphology, 'structuredElementImage', morphoSE );
        setParameterInteger( filterMorphology, 'iteration', sbMorphologyIteration.Position );
        if lstMorphologyType.ItemIndex>=0 then begin
          setParameterString( filterMorphology, 'type', lstMorphologyType.Items[lstMorphologyType.ItemIndex] );
        end;
        run( filterMorphology );
        chrono.Stop;
    end else
    if panelActif=pNonMaximaSuppression then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike(imageOut,imageIn);
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterNonMaximaSuppression, 'inImage', imageIn );
        setParameterImage( filterNonMaximaSuppression, 'outImage', imageOut );
        setParameterString( filterNonMaximaSuppression, 'outputColor', cbNonMaximaSuppressionOutputColor.Text );
        setParameterInteger( filterNonMaximaSuppression, 'gain', sbNonMaximaSuppressionGain.Position );
        setParameterImage( filterNonMaximaSuppression, 'mask', imageMask );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterNonMaximaSuppression, @roi );
        end else begin
          unsetRegionOfInterest( filterNonMaximaSuppression );
        end;
        run( filterNonMaximaSuppression );
        chrono.Stop;
    end else
    if panelActif=pPyramid then begin
        chrono.Start;
        setParameterImage( filterPyramid, 'inImage', imageIn );
        run( filterPyramid );
        images := getOutputImages( filterPyramid, 'outImages' );

        if (images<>nil) and (Length(images^)>0) then begin
          sbPyramidNormalisation.Max := Length(images^);
          // Normalize ?
          if chkPyramidNormalize.Checked=true then Begin
            imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
            setParameterImage( filterNormalize, 'inImage', imageIn );
            image2 := images^[sbPyramidNormalisation.Max-sbPyramidNormalisation.Position];
            imageOut2 := image.eraseOrCreateImageLike( imageOut2, image2 );
            image.copyImageToImage( image2, imageOut2 );
            setParameterImage( filterNormalize, 'refImage', image2 );
            setParameterImage( filterNormalize, 'outImage', imageOut );
            run( filterNormalize );
            setParameterImage( filterPyramid, 'inImage', imageOut );
            run( filterPyramid );
            images := getOutputImages( filterPyramid, 'outImages' );
          end;
        end;

        // StackProcessor ?
        tmpStr := lstPyramidFilter.Items[lstPyramidFilter.ItemIndex] ;
        if tmpStr = 'ContrastExplorer' then begin
          setParameterPointer( filterStackProcessor, 'filter', Pointer(filterContrastExplorer) );
        end else if tmpStr = 'Blur' then begin
          setParameterPointer( filterStackProcessor, 'filter', Pointer(filterBlur) );
        end else if tmpStr = 'StandardDeviation' then begin
          setParameterPointer( filterStackProcessor, 'filter', Pointer(filterStandardDeviation) );
        end else if tmpStr = 'Convolution' then begin
          setParameterPointer( filterStackProcessor, 'filter', Pointer(filterConvolution) );
        end else if tmpStr = 'GranularityExplorer' then begin
          setParameterPointer( filterStackProcessor, 'filter', Pointer(filterGranularityExplorer) );
        end else if tmpStr = 'Sobel' then begin
          setParameterPointer( filterStackProcessor, 'filter', Pointer(filterSobel) );
        end else if tmpStr = 'Susan' then begin
          setParameterPointer( filterStackProcessor, 'filter', Pointer(filterSusan) );
        end else begin
          setParameterPointer( filterStackProcessor, 'filter',nil);
        end;
        setParameterImages( filterStackProcessor, 'inImages', images );
        run( filterStackProcessor );
        images := getOutputImages( filterStackProcessor, 'outImages' );

        if (images<>nil) and (Length(images^)>0) then begin
          sbPyramidNormalisation.Max := Length(images^)-1 ;
          // StackSmasher ?
          if chkPyramidSmasher.Checked Then Begin
            setParameterImages( filterStackSmasher, 'inImages', images );
            run( filterStackSmasher );
            image1 := getOutputImage( filterStackSmasher, 'outImage' );
            sbPyramid.Enabled := false;
          end else Begin
            sbPyramid.Max := Length(images^)-1 ;
            image1 := images^[sbPyramid.position];
            sbPyramid.Enabled := true ;
          End ;
        end;

        chrono.Stop;
        imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
        image.copyImageToImage(image1,imageOut);
    end else
    if panelActif=pEnvelope then begin
        preprocessMask(); // for imageMask
        chrono.Start;
        setParameterImage( filterEnvelope, 'inImage', imageIn );
        setParameterImage( filterEnvelope, 'mask', imageMask );
        setParameterInteger( filterEnvelope, 'smooth', sbEnvelopeSmooth.Position );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterEnvelope, @roi );
        end else begin
          unsetRegionOfInterest( filterEnvelope );
        end;
        run( filterEnvelope );
        chrono.Stop;
        if lstEnvelopeOutputs.ItemIndex<0 then lstEnvelopeOutputs.ItemIndex := 0;
        lstEnvelopeOutputsClick( Self );
    end else
    if panelActif=pStackAnalyser then begin
        preprocessStackAnalyser();
        chrono.Start;
        setParameterImages( filterStackAnalyser, 'inImages', @imagesInStackAnalyser );
        setParameterImage( filterStackAnalyser, 'mask', imageMask );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterStackAnalyser, @roi );
        end else begin
          unsetRegionOfInterest( filterStackAnalyser );
        end;
        run( filterStackAnalyser );
        chrono.Stop;
        if lstStackAnalyserAnalyse.ItemIndex<0 then lstStackAnalyserAnalyse.ItemIndex := 0;
        lstStackAnalyserAnalyseClick( Self );
        sbStackAnalyserInImagesChange( Self );
    end else
    if panelActif=pStackCreator then begin
        chrono.Start;
        setParameterImage( filterStackCreator, 'inImage', imageIn );
        setParameterInteger( filterStackCreator, 'count', sbStackCreatorStackSize.Position );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterStackCreator, @roi );
        end else begin
          unsetRegionOfInterest( filterStackCreator );
        end;
        run( filterStackCreator );
        chrono.Stop;
        sbStackCreatorImageIndexChange( Self );
        // and we use stackAnalyser for the demo
        if chkStackCreatorDemoStackAnalyser.Checked=True then begin
          images := getOutputImages( filterStackCreator, 'outImages' );
          setParameterImages( filterStackAnalyser, 'inImages', images );
          setParameterImage( filterStackAnalyser, 'mask', imageMask );
          if chkUseROI.Checked=true then begin
            setRegionOfInterest( filterStackAnalyser, @roi );
          end else begin
            unsetRegionOfInterest( filterStackAnalyser );
          end;
          run( filterStackAnalyser );
          images := getOutputImages( filterStackAnalyser, 'outImages' );
          if (images<>nil) then begin
            tmpI := lstStackAnalyserAnalyse.ItemIndex;
            if tmpI<0 then tmpI := 0;
            image2 := images^[tmpI];
            if image2 <> nil Then Begin
              imageOut2 := image.eraseOrCreateImageLike( imageOut2, image2 );
              image.copyImageToImage( image2, imageOut2 );
            end;
          end;
        end;
    end else
    if panelActif=pResize then begin
        tmpSingle:=sbResizeScale.Position/100;
        image.freeImage(imageOut);
        imageOut:=image.createImage(round(imageIn.Width * tmpSingle), round(imageIn.Height * tmpSingle));
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterResize,'inImage',imageIn);
        setParameterImage(filterResize,'outImage',imageOut);
        setParameterInteger(filterResize,'mode', cbResizeMode.ItemIndex);
        if chkUseROI.Checked=true then begin
          setRegionOfInterest(filterResize,@roi);
        end else begin
          unsetRegionOfInterest(filterResize,);
        end;
        run(filterResize);
        chrono.Stop;
    end else
    if panelActif=pSobel then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        imageOut2 := image.eraseOrCreateImageLike( imageOut2, imageIn );
        image2 := imageOut2;
        chrono.Start;
        setParameterImage( filterSobel, 'inImage', imageIn );
        setParameterImage( filterSobel, 'outImage', imageOut );
        setParameterImage( filterSobel, 'mask', imageMask );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterSobel, @roi );
        end else begin
          unsetRegionOfInterest( filterSobel );
        end;
        if chkSobelAngleCalculation.Checked=True then begin
          tmpImage := image.eraseOrCreateImageLike( tmpImage, imageIn );
          setParameterImage( filterSobel, 'outImageAngle', tmpImage );
          setParameterImage( filterSobel, 'outImageAngleMonitoring', imageOut2 );
        end else begin
          tmpImage := nil;
          setParameterImage( filterSobel, 'outImageAngle', nil );
          setParameterImage( filterSobel, 'outImageAngleMonitoring', nil );
        end;
        setParameterInteger( filterSobel, 'blurIteration', sbSobelBlurIteration.Position );
        setParameterInteger( filterSobel, 'gain', sbSobelGain.Position );
        setParameterInteger( filterSobel, 'thresholdLower', sbSobelThresholdLower.Position );
        setParameterInteger( filterSobel, 'thresholdUpper', sbSobelThresholdUpper.Position );
        setParameterString( filterSobel, 'modeFast', cbSobelModeFast.Text );
        run( filterSobel );
        chrono.Stop;
        if tmpImage<>nil then begin
          image.freeImage( tmpImage );
        end;
    end else
    if panelActif=pSPV then begin
        chrono.Start;
        setParameterImage(filterSPV,'inImage',imageIn);
        setParameterInteger(filterSPV,'backgroundThreshold',sbSPVBackground.Position);
        setParameterInteger(filterSPV,'scanLineIncrement',sbSPVScanLineIncrement.Position);
        setParameterInteger(filterSPV,'maximalTrackingStep',sbSPVmaximalTrackingStep.Position);
        setParameterInteger(filterSPV,'maximalTrackingCycles',sbSPVmaximalTrackingCycles.Position);
        setParameterString(filterSPV,'monitoring',cbSPVmonitoring.Text);
        setParameterString(filterSPV,'showVectorWidth',cbSPVShowVectorWidth.Text);
        setParameterString(filterSPV,'showConnectedVector',cbSPVShowConnectedVector.Text);
        setParameterInteger(filterSPV,'polygonalApproximationEpsilone',sbSPVpolygonalApproximationEpsilone.Position);
        run(filterSPV);
        chrono.Stop;
        images := getOutputImages(filterSPV,'outImages');
        image1 := images^[0];
        imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
        image.copyImageToImage(image1,imageOut);
        image2 := images^[1];
        imageOut2:=image.eraseOrCreateImageLike(imageOut2,image2);
        image.copyImageToImage(image2,imageOut2);
    end else
    if panelActif=pStandardDeviation then begin
        imageOut := image.eraseOrCreateImageLike(imageOut,imageIn);
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterStandardDeviation, 'inImage', imageIn );
        setParameterImage( filterStandardDeviation, 'outImage', imageOut );
        setParameterInteger( filterStandardDeviation, 'percentStandardDeviation', sbPercentStandardDeviation.Position );
        setParameterString( filterStandardDeviation, 'outputColor', cbStandardDeviationOutputColor.Text );
        setParameterBoolean( filterStandardDeviation, 'showOnlyROI', chkStandardDeviationShowOnlyROI.Checked );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterStandardDeviation, @roi );
        end else begin
          unsetRegionOfInterest( filterStandardDeviation );
        end;
        run( filterStandardDeviation );
        chrono.Stop;
    end else
    if panelActif=pSubstract then begin
        preprocessMask(); // for imageMask
        imageOut2 := image.eraseOrCreateImageLike( imageOut2, imageIn );
        image2 := imageOut2;
        chrono.Start;
        setParameterImage( filterArithmeticSubstract, 'inImage1', imageIn );
        setParameterImage( filterArithmeticSubstract, 'inImage2', imageOut );
        setParameterImage( filterArithmeticSubstract, 'outImage', imageOut2 );
        setParameterImage( filterArithmeticSubstract, 'mask', imageMask );
        setParameterString( filterArithmeticSubstract, 'mode', cbSubstractMode.Text );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterArithmeticSubstract, @roi );
        end else begin
          unsetRegionOfInterest( filterArithmeticSubstract );
        end;
        run( filterArithmeticSubstract );
        chrono.Stop;
        txtSubstractDeltaTotal.Text := IntToStr( getOutputInteger( filterArithmeticSubstract, 'deltaTotal' ) );
        txtSubstractDeltaTotalNormalized.Text := FloatToStrF( getOutputFloat( filterArithmeticSubstract, 'deltaTotalNormalized' ),ffFixed,5,2 );
    end else
    if panelActif=pSUSAN then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        imageOut2 := image.eraseOrCreateImageLike( imageOut2, imageIn );
        image2 := imageOut2;
        chrono.Start;
        setParameterImage( filterSusan, 'inImage', imageIn );
        setParameterImage( filterSusan, 'outImage', imageOut );
        setParameterImage( filterSusan, 'mask', imageMask );
        if chkSusanAngleCalculation.Checked=True then begin
          tmpImage := image.eraseOrCreateImageLike( tmpImage, imageIn );
          setParameterImage( filterSusan, 'outImageAngle', tmpImage );
          setParameterImage( filterSusan, 'outImageAngleMonitoring', imageOut2 );
        end else begin
          tmpImage := nil;
          setParameterImage( filterSusan, 'outImageAngle', nil );
          setParameterImage( filterSusan, 'outImageAngleMonitoring', nil );
        end;
        setParameterString( filterSusan, 'mode', cbSUSANmode.Text );
        setParameterString( filterSusan, 'maskType', cbSUSANmasktype.Text );
        setParameterInteger( filterSusan, 'precision', sbSUSANprecision.Position );
        setParameterInteger( filterSusan, 'pixelBrightnessDifferenceThreshold', sbSUSANpixelBrightnessDifferenceThreshold.Position);
        setParameterInteger( filterSusan, 'pixelCentroidDifferenceThreshold', sbSUSANpixelCentroidDifferenceThreshold.Position );
        setParameterInteger( filterSusan, 'gain', sbSusanGain.Position );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterSusan, @roi );
        end else begin
          unsetRegionOfInterest( filterSusan );
        end;
        run( filterSusan );
        chrono.Stop;
        if tmpImage<>nil then begin
          image.freeImage( tmpImage );
        end;
    end else
    if panelActif=pThresholdBinary then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterThresholdBinary, 'inImage', imageIn );
        setParameterImage( filterThresholdBinary, 'outImage', imageOut );
        setParameterInteger( filterThresholdBinary, 'thresholdLower', sbThresholdBinaryLower.Position );
        setParameterInteger( filterThresholdBinary, 'thresholdUpper', sbThresholdBinaryUpper.Position );
        setParameterInteger( filterThresholdBinary, 'lowcolor', rdgLow.ItemIndex );
        setParameterInteger( filterThresholdBinary, 'middlecolor', rdgMiddle.ItemIndex );
        setParameterInteger( filterThresholdBinary, 'highcolor', rdgHigh.ItemIndex );
        setParameterImage( filterThresholdBinary, 'mask', imageMask );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterThresholdBinary, @roi );
        end else begin
          unsetRegionOfInterest( filterThresholdBinary );
        end;
        run( filterThresholdBinary );
        chrono.Stop;
    end else
    if panelActif=pVectorHistogram then begin
        preprocessSimulateAngle(imageIn,StrToFloat(txtVectorHistogramPreprocessingAngle.Text)); // this function set 'imageSimulateAngle'
        preprocessBlob(imageSimulateAngle); // this function set 'imageBlob'
        // monitoring
        image2 := imageBlob;
        imageOut2:=image.eraseOrCreateImageLike(imageOut2,image2);
        image.copyImageToImage(image2,imageOut2);
        pointers := getOutputArrayPointers(fBlobExplorerForBlob,'blobs');
        tmpI:=Length(pointers^)-1;
        if tmpI>=0 then begin
          sbVectorHistogramBlobNumero.Max:=tmpI;
          sbVectorHistogramBlobNumero.Visible:=True;
          txtVectorHistogramBlobNumero.Text:=IntToStr(sbVectorHistogramBlobNumero.position+1)+'/'+IntToStr(sbVectorHistogramBlobNumero.Max+1);
        end else begin
          sbVectorHistogramBlobNumero.Visible:=False;
          txtVectorHistogramBlobNumero.Text:='';
          Application.MessageBox('Before using this filter, you must use filter BlobExplorer to obtain a blob', 'Information', MB_OK);
        end;
        chrono.Start;
        if sbVectorHistogramBlobNumero.Visible=True then begin
          tmpI:=sbVectorHistogramBlobNumero.Position;
          pointers := getOutputArrayPointers(fBlobExplorerForBlob,'blobs');
          tmpBlob:=pointers^[tmpI];
          tmpPointer:=tmpBlob.vectorChain;
          setParameterPointer(filterVectorHistogram,'vectorArray',tmpPointer);
          tmpI:=360;
          if cbVectorHistogramAngleprecision.ItemIndex=1 then tmpI:=720
          else if cbVectorHistogramAngleprecision.ItemIndex=2 then tmpI:=3600
          else if cbVectorHistogramAngleprecision.ItemIndex=3 then tmpI:=36000;
          setParameterInteger(filterVectorHistogram,'anglePrecision', tmpI);
          setParameterInteger(filterVectorHistogram,'smooth', sbVectorHistogramSmooth.Position);
          run(filterVectorHistogram);
          chrono.Stop;
          image1 := getOutputImage(filterVectorHistogram,'outImage');
          imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
          image.copyImageToImage(image1,imageOut);
        end;
    end else
    if panelActif=pProjectionLine then begin
        tmpBoolean:=false;
        preprocessSimulateAngle(imageIn,StrToFloat(txtProjectionLinePreprocessingSimulateAngle.Text)); // this function set 'imageSimulateAngle'
        if rgProjectionLineInput.ItemIndex=1 then begin
          setParameterString(filterProjectionLine,'inputType','SEGMENTS');
          preprocessBlob(imageSimulateAngle); // this function set 'imageBlob'
          pointers := getOutputArrayPointers(fBlobExplorerForBlob,'blobs');
          tmpI:=Length(pointers^)-1;
          if tmpI>=0 then begin
            sbProjectionLinePreprocessingBlobIndex.Max:=tmpI;
            sbProjectionLinePreprocessingBlobIndex.Visible:=True;
            txtProjectionLinePreprocessingBlobIndex.Text:=IntToStr(sbProjectionLinePreprocessingBlobIndex.position+1)+'/'+IntToStr(sbProjectionLinePreprocessingBlobIndex.Max+1);
          end else begin
            sbProjectionLinePreprocessingBlobIndex.Visible:=False;
            txtProjectionLinePreprocessingBlobIndex.Text:='';
            Application.MessageBox('Before using this filter, you must use filter BlobExplorer to obtain a blob', 'Information', MB_OK);
          end;
          if sbProjectionLinePreprocessingBlobIndex.Visible=True then begin
            tmpBoolean:=true;
            tmpI:=sbProjectionLinePreprocessingBlobIndex.Position;
            pointers := getOutputArrayPointers(fBlobExplorerForBlob,'blobs');
            tmpBlob := pointers^[tmpI];
            tmpPointer:=tmpBlob.segmentList;
            setParameterPointer(filterProjectionLine,'segmentArray',tmpPointer);
            // monitoring
            image2:=imageBlob;
            imageOut2:=image.eraseOrCreateImageLike(imageOut2,image2);
            image.copyImageToImage(image2,imageOut2);
          end;
        end else begin
          setParameterString(filterProjectionLine,'inputType','IMAGE');
          setParameterImage(filterProjectionLine,'inImage',imageSimulateAngle);
          tmpBoolean:=true;
          // monitoring
          image2:=imageSimulateAngle;
          imageOut2:=image.eraseOrCreateImageLike(imageOut2,image2);
          image.copyImageToImage(image2,imageOut2);
        end;
        chrono.Start;
        if tmpBoolean=true then begin
          setParameterInteger(filterProjectionLine,'smooth', sbProjectionLineSmooth.Position);
          run(filterProjectionLine);
          chrono.Stop;
          txtProjectionLineMaximum.Text:=FloatToStrF(getOutputFloat(filterProjectionLine,'maximum'),ffFixed,6,3);
          image1 := getOutputImage(filterProjectionLine,'outImage');
          imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
          image.copyImageToImage(image1,imageOut);
        end;
    end else
    if panelActif=pBlobBalance then begin
        preprocessSimulateAngle(imageIn,StrToFloat(txtBlobBalancePreprocessingAngle.Text)); // this function set 'imageSimulateAngle'
        preprocessBlob(imageSimulateAngle); // this function set 'imageBlob'
        pointers := getOutputArrayPointers(fBlobExplorerForBlob,'blobs');
        tmpI:=Length(pointers^)-1;
        if tmpI>=0 then begin
          sbBlobBalancePreprocessingBlobIndex.Max:=tmpI;
          sbBlobBalancePreprocessingBlobIndex.Visible:=True;
          txtBlobBalancePreprocessingBlobIndex.Text:=IntToStr(sbBlobBalancePreprocessingBlobIndex.position+1)+'/'+IntToStr(sbBlobBalancePreprocessingBlobIndex.Max+1);
        end else begin
          sbBlobBalancePreprocessingBlobIndex.Visible:=False;
          txtBlobBalancePreprocessingBlobIndex.Text:='';
          Application.MessageBox('Before using this filter, you must use filter BlobExplorer to obtain a blob', 'Information', MB_OK);
        end;
        if sbBlobBalancePreprocessingBlobIndex.Visible=True then begin
          tmpI:=sbBlobBalancePreprocessingBlobIndex.Position;
          pointers := getOutputArrayPointers(fBlobExplorerForBlob,'blobs');
          tmpBlob := pointers^[tmpI];
          tmpPointer:=tmpBlob;
          setParameterPointer(filterBlobBalance,'blob',tmpPointer);
          // monitoring
          imageOut:=image.eraseOrCreateImageLike(imageOut,imageBlob);
          image1:=imageOut;
          setParameterImage(filterBlobBalance,'outImageMonitoring',imageOut);
          setParameterImage(filterBlobBalance,'blobImage',imageBlob);
          setParameterBoolean(filterBlobBalance,'monitoring',chkBlobBalanceMonitoring.Checked);
          chrono.Start;
          run(filterBlobBalance);
          txtBlobBalanceAngle.Text:=FloatToStrF(getOutputFloat(filterBlobBalance,'angle'),ffFixed,5,2);
          chrono.Stop;
        end;
    end else
    if panelActif=pBlobGrouping then begin
        pointers := getOutputArrayPointers(filterBlobExplorer,'blobs');
        tmpI:=Length(pointers^)-1;
        if tmpI>=0 then begin
          imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
          image1 := imageOut;
          setParameterImage( filterBlobGrouping,'inImage', imageIn);
          setParameterImage( filterBlobGrouping,'outImage', imageOut) ;
          setParameterPointer( filterBlobGrouping,'filterBlobExplorer', Pointer(filterBlobExplorer));
          setParameterInteger( filterBlobGrouping, 'intensityPrecision', sbBlobGroupingIntensityPrecision.Position );
          chrono.Start;
          run( filterBlobGrouping );
          chrono.Stop;
        end else begin
          Application.MessageBox('Before using this filter, you must use filter BlobExplorer to obtain some blobs', 'Information', MB_OK);
        end;
    end else
    if panelActif=pWavelets then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterWavelet,'inImage', imageIn);
        setParameterImage(filterWavelet,'outImage', imageOut) ;
        setParameterBoolean(filterWavelet,'invert', chkWaveletsInverse.Checked);
        run(filterWavelet);
        chrono.Stop;
    end else
    if panelActif=pWaves then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        if not isWavesSimpleRun then begin
          setParameterImage(filterWaves,'inImage', imageIn);
        end;
        setParameterImage(filterWaves,'outImage', imageOut) ;
        run(filterWaves) ;
        cmdWavesStep.Enabled := true ;
        chrono.Stop;
    end else
    if panelActif=pIntegration then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterIntegration,'inImage',imageIn);
        setParameterImage(filterIntegration,'outImage',imageOut);
        setParameterFloat(filterIntegration,'scale', sbIntegrationScale.Position/1000);
        setParameterFloat(filterIntegration,'offset', sbIntegrationOffset.Position);
        run(filterIntegration);
        chrono.Stop;
    end else
    if panelActif=pLocalDeviation then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterLocalDeviation,'inImage',imageIn);
        setParameterImage(filterLocalDeviation,'outImage',imageOut);
        setParameterInteger(filterLocalDeviation,'percentLocalDeviation',sbPercentLocalDeviation.Position);
        setParameterInteger(filterLocalDeviation,'localDeviationSize',sbLocalDeviationSize.Position);
        //setParameterString(filterLocalDeviation,'outputColor',cbLocalDeviationOutputColor.Text);
        if chkUseROI.Checked=true then begin
          setRegionOfInterest(filterLocalDeviation,@roi);
        end else begin
          unsetRegionOfInterest(filterLocalDeviation);
        end;
        run(filterLocalDeviation);
        chrono.Stop;
    end else
    if panelActif=pApplication1 then begin
      imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
      image1:=imageOut;
      chrono.Start;
      application1.setInImage(imageIn);
      application1.setDefaultAreaMin(sbApplication1DefectAreaMin.Position);
      application1.setMinNumberOfDefectsForOK(sbApplication1MinNumberOfDefectsForOK.Position);
      application1.setMaxNumberOfDefectsForNG(sbApplication1MaxNumberOfDefectsForNG.Position);
      application1.Run;
      chrono.Stop;
      image.copyImageToImage(application1.getOutImage(),imageOut);
      txtApplication1NumberOfDefects.Text:=IntToStr(application1.getNumberOfDefects());
      decision:=application1.getDecision();
      if decision=1 then shapeApplication1Decision.Brush.Color:=clLime
      else if decision=0 then shapeApplication1Decision.Brush.Color:=clYellow
      else shapeApplication1Decision.Brush.Color:=clRed;
    end else
    if panelActif=pApplication2 then begin
      imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
      image1:=imageOut;
      chrono.Start;
      application2.setInImage(imageIn);
      application2.setDefaultAreaMin(sbApplication2DefectAreaMin.Position);
      application2.Run;
      chrono.Stop;
      image.copyImageToImage(application2.getOutImage(),imageOut);
    end else
    if panelActif=pCanny then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterCanny,'inImage',imageIn);
        setParameterImage(filterCanny,'outImage',imageOut);
        setParameterInteger(filterCanny,'threshold1',sbCannyThreshold1.Position);
        setParameterInteger(filterCanny,'threshold2',sbCannyThreshold2.Position);
        run(filterCanny);
        chrono.Stop;
    end else
    if panelActif=pGradientAnisotropicDiffusion then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterGradientAnisotropicDiffusion,'inImage',imageIn);
        setParameterImage(filterGradientAnisotropicDiffusion,'outImage',imageOut);
        setParameterFloat(filterGradientAnisotropicDiffusion,'conductance',sbGradientAnisotropicDiffusionConductance.Position/10);
        setParameterInteger(filterGradientAnisotropicDiffusion,'iteration',sbGradientAnisotropicDiffusionIteration.Position);
        if cbGradientAnisotropicDiffusionMethod.ItemIndex=1 then setParameterString(filterGradientAnisotropicDiffusion,'method', 'STANDARD_GREY_LEVEL')
        else if cbGradientAnisotropicDiffusionMethod.ItemIndex=2 then setParameterString(filterGradientAnisotropicDiffusion,'method', 'STANDARD_RGB')
        else setParameterString(filterGradientAnisotropicDiffusion,'method', 'FAST_BLUR_ANISOTROPIC');
        run(filterGradientAnisotropicDiffusion);
        chrono.Stop;
    end else
    if panelActif=pBilateral then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterSmoothBilateral,'inImage',imageIn);
        setParameterImage(filterSmoothBilateral,'outImage',imageOut);
        setParameterFloat(filterSmoothBilateral,'domainSigma',sbBilateralDomainsigma.Position/10);
        setParameterFloat(filterSmoothBilateral,'rangeSigma',sbBilateralRangesigma.Position/10);
        run(filterSmoothBilateral);
        chrono.Stop;
    end else
    if panelActif=pRescaleIntensity then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterRescaleIntensity,'inImage',imageIn);
        setParameterImage(filterRescaleIntensity,'outImage',imageOut);
        setParameterInteger(filterRescaleIntensity,'intensityMinimum',sbRescaleIntensityMinimum.Position);
        setParameterInteger(filterRescaleIntensity,'intensityMaximum',sbRescaleIntensityMaximum.Position);
        run(filterRescaleIntensity);
        chrono.Stop;
    end else
    if panelActif=pSigmoid then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filterSigmoid,'inImage',imageIn);
        setParameterImage(filterSigmoid,'outImage',imageOut);
        setParameterInteger(filterSigmoid,'intensityMinimum',sbSigmoidMinimum.Position);
        setParameterInteger(filterSigmoid,'intensityMaximum',sbSigmoidMaximum.Position);
        setParameterFloat(filterSigmoid,'alpha',sbSigmoidAlpha.Position/10);
        setParameterInteger(filterSigmoid,'beta',sbSigmoidBeta.Position);
        run(filterSigmoid);
        chrono.Stop;
    end else
    if panelActif=pCompare then begin
        preprocessMask(); // for imageMask
        imageOut2 := image.eraseOrCreateImageLike( imageOut2, imageIn );
        image2 := imageOut2;
        chrono.Start;
        setParameterImage( filterCompare, 'inImage1', imageIn );
        setParameterImage( filterCompare, 'inImage2', imageOut );
        setParameterImage( filterCompare, 'outImage', imageOut2 );
        setParameterImage( filterCompare, 'mask', imageMask );
        setParameterString( filterCompare, 'mode', cbCompareMode.Text );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterCompare, @roi );
        end else begin
          unsetRegionOfInterest( filterCompare );
        end;
        run( filterCompare );
        chrono.Stop;
    end else
    if panelActif=pContour then begin
        imageOut := image.eraseOrCreateImageLike(imageOut,imageIn);
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterContour, 'inImage', imageIn );
        setParameterImage( filterContour, 'outImage',imageOut );
        setParameterInteger( filterContour, 'threshold', sbContourThreshold.Position );
        setParameterBoolean( filterContour, 'fill', chkContourFill.Checked );
        setParameterBoolean( filterContour, 'criticalPoints', chkContourCriticalPoints.Checked );
        setParameterInteger( filterContour, 'approximationAccuracy', sbContourApproximationaccuracy.Position );
        run( filterContour );
        chrono.Stop;
    end else
    if panelActif=pLog then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterLog, 'inImage', imageIn );
        setParameterImage( filterLog, 'outImage', imageOut );
        setParameterImage( filterLog, 'mask', imageMask );
        setParameterInteger( filterLog, 'intensityMax', sbLogIntensityMax.Position );
        setParameterBoolean( filterLog, 'autoAdjust', chkLogAdjustAuto.Checked );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterLog, @roi );
        end else begin
          unsetRegionOfInterest( filterLog );
        end;
        run( filterLog );
        chrono.Stop;
    end else
    if panelActif=pLogPolar then begin
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterLogPolar, 'inImage', imageIn );
        setParameterImage( filterLogPolar, 'outImage', imageOut );
        setParameterInteger( filterLogPolar, 'magnitude', sbLogpolarMagnitude.Position );
        setParameterBoolean( filterLogPolar, 'reinverseTransformation', chkLogpolarReinversetransformation.Checked );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterLogPolar, @roi );
        end else begin
          unsetRegionOfInterest( filterLogPolar );
        end;
        run( filterLogPolar );
        chrono.Stop;
    end else
    if panelActif=pHoughTransform then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterHoughTransform, 'inImage', imageIn );
        setParameterImage( filterHoughTransform, 'outImage', imageOut );
        setParameterImage( filterHoughTransform, 'mask', imageMask );
        setParameterString( filterHoughTransform, 'preprocessor', cbHoughTransformPreprocessor.Text );
        setParameterInteger( filterHoughTransform, 'threshold', sbHoughTransformThreshold.Position );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterHoughTransform, @roi );
        end else begin
          unsetRegionOfInterest( filterHoughTransform );
        end;
        run( filterHoughTransform );
        chrono.Stop;
    end else
    if panelActif=pAdjust Then Begin
        imageOut := image.eraseOrCreateImageLike(imageOut,imageIn);
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterAdjust, 'inImage', imageIn );
        setParameterImage( filterAdjust, 'outImage', imageOut );
        setParameterInteger( filterAdjust, 'Contrast', sbConstrast.Position );
        setParameterInteger( filterAdjust, 'Brightness', sbBrightness.Position );
        setParameterBoolean( filterAdjust, 'AutoAdjust', chkAdjustAuto.Checked );
        run( filterAdjust );
        chrono.Stop;
    end else
    if panelActif=pRotation Then Begin
        imageOut2:=image.eraseOrCreateImageLike(imageOut2,imageIn);
        image2:=imageOut2;
        chrono.Start;
        setParameterImage(filterRotation,'inImage',imageIn);
        setParameterImage(filterRotation,'outImageMonitoring',imageOut2);
        setParameterBoolean(filterRotation,'monitoring',chkRotationMonitoring.Checked);
        setParameterFloat(filterRotation,'angle', StrToFloat(txtRotationAngle.Text));
        setParameterFloat(filterRotation,'xCenter', sbRotationCenterX.Position) ;
        setParameterFloat(filterRotation,'yCenter', sbRotationCenterY.Position) ;
        setParameterInteger(filterRotation,'interpolationMode', rdgRotationInterpolation.ItemIndex);
        setParameterString(filterRotation,'missingPixelColorMode',cbRotationMissingpixelcolormode.Text);
        setParameterBoolean(filterRotation,'autoAdjustSize',chkRotationAutoadjustsize.Checked);
        run(filterRotation);
        chrono.Stop;
        image1:=getOutputImage(filterRotation,'outImage');
        imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
        image.copyImageToImage(image1,imageOut);
    end else
    if panelActif=pImageCreator then begin
        chrono.Start;
        setParameterString( filterImageCreator, 'command', txtImageCreatorCommand.Text );
        run( filterImageCreator );
        chrono.Stop;
        image1 := getOutputImage( filterImageCreator, 'outImage' );
        imageOut := image.eraseOrCreateImageLike( imageOut, image1 );
        image.copyImageToImage( image1, imageOut );
    end else
    if panelActif=pImageInfo then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterImage( filterImageInfo, 'inImage', imageIn );
        //setParameterImage( filterImageInfo, 'outImage',imageOut );
        setParameterImage( filterImageInfo, 'mask', imageMask );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterImageInfo, @roi );
        end else begin
          unsetRegionOfInterest( filterImageInfo );
        end;
        run( filterImageInfo );
        chrono.Stop;
        txtImageInfoPixelMin.Text := IntToStr( getOutputInteger( filterImageInfo, 'pixelMin' ) );
        txtImageInfoPixelMax.Text := IntToStr( getOutputInteger( filterImageInfo, 'pixelMax' ) );
        txtImageInfoPixelMaxSubMin.Text := IntToStr( getOutputInteger( filterImageInfo, 'pixelMax' ) - getOutputInteger( filterImageInfo, 'pixelMin' ) );
    end else
    if panelActif=pCoOccurrenceMatrix then begin
        preprocessMask(); // for imageMask
        imageOut2 := image.eraseOrCreateImageLike(imageOut2,imageIn);
        image2 := imageOut2;
        chrono.Start;
        setParameterImage( filterCoOccurrenceMatrix, 'inImage', imageIn );
        setParameterImage( filterCoOccurrenceMatrix, 'outImageMonitoring', imageOut2 );
        setParameterImage( filterCoOccurrenceMatrix, 'mask', imageMask );
        setParameterInteger( filterCoOccurrenceMatrix, 'horizontalDistance', sbCooccurenceHorSize.Position );
        setParameterInteger( filterCoOccurrenceMatrix, 'verticalDistance', sbCooccurenceVerSize.Position );
        setParameterInteger( filterCoOccurrenceMatrix, 'xAnalyse', rdCoocurenceX.ItemIndex );
        setParameterInteger( filterCoOccurrenceMatrix, 'yAnalyse', rdCoocurenceY.ItemIndex );
        setParameterFloat( filterCoOccurrenceMatrix, 'scale',  sbCoOccurenceScale.Position );
        setParameterBoolean( filterCoOccurrenceMatrix, 'Shift45', chkCoocurenceShift45.Checked);
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filterCoOccurrenceMatrix, @roi );
        end else begin
          unsetRegionOfInterest( filterCoOccurrenceMatrix );
        end;
        if (shpViewerToolROI.Visible) then begin
          x1 := round(shpViewerToolROI.Left*255/ViewerImageOut.width);
          if x1<0 then x1 :=0;
          x2 := round((shpViewerToolROI.Left+shpViewerToolROI.width)*255/ViewerImageOut.width);
          if x2>255 then x2 := 255;
          y1 := round(shpViewerToolROI.Top*255/ViewerImageOut.height);
          if y1 < 0 then y1 := 0;
          y2 := round((shpViewerToolROI.Top+shpViewerToolROI.height)*255/ViewerImageOut.height);
          if y2 > 255 then y2 := 255;
          setParameterInteger( filterCoOccurrenceMatrix, 'coMinX', x1);
          setParameterInteger( filterCoOccurrenceMatrix, 'coMaxX', x2);
          setParameterInteger( filterCoOccurrenceMatrix, 'coMinY', y1);
          setParameterInteger( filterCoOccurrenceMatrix, 'coMaxY', y2);
        end else begin
          setParameterInteger( filterCoOccurrenceMatrix, 'coMinX', 0);
          setParameterInteger( filterCoOccurrenceMatrix, 'coMaxX', 255);
          setParameterInteger( filterCoOccurrenceMatrix, 'coMinY', 0);
          setParameterInteger( filterCoOccurrenceMatrix, 'coMaxY', 255);
        end;
        run( filterCoOccurrenceMatrix );
        chrono.Stop;
        image1 := getOutputImage( filterCoOccurrenceMatrix, 'outImage' );
        imageOut := image.eraseOrCreateImageLike( imageOut, image1 );
        image.copyImageToImage( image1, imageOut );
        tmpSingle := getOutputFloat( filterCoOccurrenceMatrix, 'features_angularSecondMoment' );
        txtCoOccurrenceMatrixFeaturesAngularSecondMoment.Text := FloatToStrF(tmpSingle,ffFixed,10,10);
        tmpSingle := getOutputFloat( filterCoOccurrenceMatrix, 'features_energy' );
        txtCoOccurrenceMatrixFeaturesEnergy.Text := FloatToStrF(tmpSingle,ffFixed,10,10);
        tmpSingle := getOutputFloat( filterCoOccurrenceMatrix, 'features_entropy' );
        txtCoOccurrenceMatrixFeaturesEntropy.Text := FloatToStrF(tmpSingle,ffFixed,10,10);
        tmpSingle := getOutputFloat( filterCoOccurrenceMatrix, 'features_contrast' );
        txtCoOccurrenceMatrixFeaturesContrast.Text := FloatToStrF(tmpSingle,ffFixed,10,10);
        tmpSingle := getOutputFloat( filterCoOccurrenceMatrix, 'features_dissimilarity' );
        txtCoOccurrenceMatrixFeaturesDissimilarity.Text := FloatToStrF(tmpSingle,ffFixed,10,10);
        tmpSingle := getOutputFloat( filterCoOccurrenceMatrix, 'features_inverseDifferenceMoment' );
        txtCoOccurrenceMatrixFeaturesInversedifferencemoment.Text := FloatToStrF(tmpSingle,ffFixed,10,10);
        tmpSingle := getOutputFloat( filterCoOccurrenceMatrix, 'features_mean_i' );
        txtCoOccurrenceMatrixFeaturesMeanI.Text := FloatToStrF(tmpSingle,ffFixed,10,10);
        tmpSingle := getOutputFloat( filterCoOccurrenceMatrix, 'features_mean_j' );
        txtCoOccurrenceMatrixFeaturesMeanJ.Text := FloatToStrF(tmpSingle,ffFixed,10,10);
        tmpSingle := getOutputFloat( filterCoOccurrenceMatrix, 'features_variance_i' );
        txtCoOccurrenceMatrixFeaturesVarianceI.Text := FloatToStrF(tmpSingle,ffFixed,10,10);
        tmpSingle := getOutputFloat( filterCoOccurrenceMatrix, 'features_variance_j' );
        txtCoOccurrenceMatrixFeaturesVarianceJ.Text := FloatToStrF(tmpSingle,ffFixed,10,10);
        tmpSingle := getOutputFloat( filterCoOccurrenceMatrix, 'features_correlation' );
        txtCoOccurrenceMatrixFeaturesCorrelation.Text := FloatToStrF(tmpSingle,ffFixed,10,10);
    end else
    if panelActif=pImageLoader then begin
        chrono.Start;
        setParameterString(filterImageLoader,'filesName',txtImageLoaderFiles.Text);
        run(filterImageLoader);
        chrono.Stop;
        lstImageLoaderViewImage.Items.Clear;
        images := getOutputImages(filterImageLoader,'outImages');
        if (images<>nil) and (Length(images^)>0) then begin
          for tmpI:=0 to Length(images^)-1 do begin
            lstImageLoaderViewImage.Items.Add('image '+IntToStr(tmpI)+' ('+IntToStr(images^[tmpI].Width)+'*'+IntToStr(images^[tmpI].Height)+')');
          end;
        end;
    end else
    if panelActif=pImageSaver then begin
        chrono.Start;
        setParameterString(filterImageSaver,'fileName',txtImageSaverFilename.Text);
        if rgImageSaverImage.ItemIndex=0 then setParameterImage(filterImageSaver,'inImage',imageIn)
        else if rgImageSaverImage.ItemIndex=1 then setParameterImage(filterImageSaver,'inImage',image1)
        else setParameterImage(filterImageSaver,'inImage',image2);
        run(filterImageSaver);
        chrono.Stop;
    end else
    if panelActif=pFiltersPlugin_Resonator then begin
        imageOut:=image.eraseOrCreateImageLike(imageOut,imageIn);
        image1:=imageOut;
        chrono.Start;
        setParameterImage(filtersPlugin_Resonator,'inImage',imageIn);
        setParameterImage(filtersPlugin_Resonator,'outImage',imageOut);
        setParameterFloat(filtersPlugin_Resonator, 'omega', scrOmega.Position/1000);
        if chkUseROI.Checked=true then begin
          setRegionOfInterest(filtersPlugin_Resonator,@roi);
        end else begin
          unsetRegionOfInterest(filtersPlugin_Resonator);
        end;
        run(filtersPlugin_Resonator);
        chrono.Stop;
    end ;

    if panelActif=pFiltersPlugin_TestDelphi then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterInteger( filtersPlugin_TestDelphi, 'testIntegerParameter', StrToInt64(txtPluginSampleParameterInteger.Text) );
        setParameterFloat( filtersPlugin_TestDelphi, 'testFloatParameter', StrToFloat(txtPluginSampleParameterFloat.Text) );
        setParameterBoolean( filtersPlugin_TestDelphi, 'testBooleanParameter', chkPluginSampleParameterBoolean.Checked );
        setParameterString( filtersPlugin_TestDelphi, 'testStringParameter', txtPluginSampleParameterString.Text );
        setParameterImage( filtersPlugin_TestDelphi, 'testImageParameter', imageIn );
        SetLength( tmpImages, 2 );
        tmpImages[0] := imageIn;
        tmpImages[1] := imageIn;
        setParameterImages( filtersPlugin_TestDelphi, 'testImagesParameter', @tmpImages );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filtersPlugin_TestDelphi, @roi );
        end else begin
          unsetRegionOfInterest( filtersPlugin_TestDelphi );
        end;
        run( filtersPlugin_TestDelphi );
        chrono.Stop;
        // get output [testIntegerOutput]
        txtPluginSampleOutputInteger.Text := IntToStr( getOutputInteger( filtersPlugin_TestDelphi, 'testIntegerOutput' ) );
        // get output [testFloatOutput]
        txtPluginSampleOutputFloat.Text := FloatToStrF( getOutputFloat( filtersPlugin_TestDelphi, 'testFloatOutput' ), ffFixed,4,3 );
        // get output image [testImageOutput]
        image1 := getOutputImage( filtersPlugin_TestDelphi, 'testImageOutput' );
        imageOut := image.eraseOrCreateImageLike( imageOut, image1 );
        image.copyImageToImage( image1, imageOut );
        // get output images [testImagesOutput]
        images := getOutputImages( filtersPlugin_TestDelphi, 'testImagesOutput' );
        image2 := images^[cbPluginSampleOutputImages.ItemIndex];
        imageOut2:=image.eraseOrCreateImageLike( imageOut2, image2 );
        image.copyImageToImage( image2, imageOut2 );
        // get output pointers [testArrayPointersOutput]
        pointers := getOutputArrayPointers( filtersPlugin_TestDelphi, 'testArrayPointersOutput' );
        // we know that it is pointers on C string
        txtPluginOutputArrayPointers.Lines.Clear();
        for tmpI:=0 to Length(pointers^)-1 do begin
          tmpStr := StrPas( pointers^[tmpI] );
          txtPluginOutputArrayPointers.Lines.Add( tmpStr );
        end;
        txtPluginOutputArrayPointers.SelStart := 0;
        SendMessage(txtPluginOutputArrayPointers.handle, EM_SCROLLCARET,0,0);
    end else
    if panelActif=pFiltersPlugin_TestC then begin
        preprocessMask(); // for imageMask
        imageOut := image.eraseOrCreateImageLike( imageOut, imageIn );
        image1 := imageOut;
        chrono.Start;
        setParameterInteger( filtersPlugin_TestC, 'testIntegerParameter', StrToInt64(txtPluginTestC_ParameterInteger.Text) );
        setParameterFloat( filtersPlugin_TestC, 'testFloatParameter', StrToFloat(txtPluginTestC_ParameterFloat.Text) );
        setParameterBoolean( filtersPlugin_TestC, 'testBooleanParameter', chkPluginTestC_ParameterBoolean.Checked );
        setParameterString( filtersPlugin_TestC, 'testStringParameter', txtPluginTestC_ParameterString.Text );
        setParameterImage( filtersPlugin_TestC, 'testImageParameter', imageIn );
        SetLength( tmpImages, 2 );
        tmpImages[0] := imageIn;
        tmpImages[1] := imageIn;
        setParameterImages( filtersPlugin_TestC, 'testImagesParameter', @tmpImages );
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filtersPlugin_TestC, @roi );
        end else begin
          unsetRegionOfInterest( filtersPlugin_TestC );
        end;
        run( filtersPlugin_TestC );
        chrono.Stop;
        // get output [testIntegerOutput]
        txtPluginTestC_OutputInteger.Text := IntToStr( getOutputInteger( filtersPlugin_TestC, 'testIntegerOutput' ) );
        // get output [testFloatOutput]
        txtPluginTestC_OutputFloat.Text := FloatToStrF( getOutputFloat( filtersPlugin_TestC, 'testFloatOutput' ), ffFixed,4,3 );
        // get output image [testImageOutput]
        image1 := getOutputImage( filtersPlugin_TestC, 'testImageOutput' );
        imageOut := image.eraseOrCreateImageLike( imageOut, image1 );
        image.copyImageToImage( image1, imageOut );
        // get output images [testImagesOutput]
        images := getOutputImages( filtersPlugin_TestC, 'testImagesOutput' );
        image2 := images^[cbPluginTestC_OutputImages.ItemIndex];
        imageOut2:=image.eraseOrCreateImageLike( imageOut2, image2 );
        image.copyImageToImage( image2, imageOut2 );
        // get output pointers [testArrayPointersOutput]
        pointers := getOutputArrayPointers( filtersPlugin_TestC, 'testArrayPointersOutput' );
        // we know that it is pointers on C string
        txtPluginTestC_OutputArrayPointers.Lines.Clear();
        for tmpI:=0 to Length(pointers^)-1 do begin
          tmpStr := StrPas( pointers^[tmpI] );
          txtPluginTestC_OutputArrayPointers.Lines.Add( tmpStr );
        end;
        txtPluginTestC_OutputArrayPointers.SelStart := 0;
        SendMessage(txtPluginTestC_OutputArrayPointers.handle, EM_SCROLLCARET,0,0);
    end else
    if panelActif=pFiltersPlugin_Video then begin
        preprocessMask(); // for imageMask
        chrono.Start;
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filtersPlugin_Video, @roi );
        end else begin
          unsetRegionOfInterest( filtersPlugin_Video );
        end;
        setParameterBoolean( filtersPlugin_Video, 'showViewer', chkPluginVideoShowViewer.Checked );
        setParameterString( filtersPlugin_Video, 'fileName', txtPluginVideoFileName.Text );
        if _runCommand<>'' then begin
          StrPCopy( tmpStrC, _runCommand );
          runCommand( filtersPlugin_Video, tmpStrC );
          _runCommand := '';
        end else begin
          run( filtersPlugin_Video );
        end;
        chrono.Stop;
        image1 := getOutputImage( filtersPlugin_Video, 'outImage' );
        if image1<>nil then begin
          imageOut := image.eraseOrCreateImageLike( imageOut, image1 );
          image.copyImageToImage( image1, imageOut );
        end;
    end else
    if panelActif=pFiltersPlugin_WebCam then begin
        preprocessMask(); // for imageMask
        chrono.Start;
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filtersPlugin_WebCam, @roi );
        end else begin
          unsetRegionOfInterest( filtersPlugin_WebCam );
        end;
        setParameterBoolean( filtersPlugin_WebCam, 'showViewer', chkPluginWebCamShowViewer.Checked );
        if txtPluginWebCamDeviceIndex.Text<>'' then begin
          setParameterInteger( filtersPlugin_WebCam, 'deviceIndex', StrToInt(txtPluginWebCamDeviceIndex.Text) );
        end;
        if txtPluginWebCamFormatIndex.Text<>'' then begin
          setParameterInteger( filtersPlugin_WebCam, 'formatIndex', StrToInt(txtPluginWebCamFormatIndex.Text) );
        end;
        if _runCommand<>'' then begin
          StrPCopy( tmpStrC, _runCommand );
          runCommand( filtersPlugin_WebCam, tmpStrC );
          _runCommand := '';
        end else begin
          run( filtersPlugin_WebCam );
        end;
        chrono.Stop;
        // get devices list
        pointers := getOutputArrayPointers( filtersPlugin_WebCam, 'devices' );
        // we know that it is pointers on C string
        lbPluginWebCamDevices.Clear();
        for tmpI:=0 to Length(pointers^)-1 do begin
          tmpStr := StrPas( pointers^[tmpI] );
          lbPluginWebCamDevices.Items.Add( tmpStr );
        end;
        // get format list
        pointers := getOutputArrayPointers( filtersPlugin_WebCam, 'deviceFormats' );
        // we know that it is pointers on C string
        lbPluginWebCamDeviceFormats.Clear();
        for tmpI:=0 to Length(pointers^)-1 do begin
          tmpStr := StrPas( pointers^[tmpI] );
          lbPluginWebCamDeviceFormats.Items.Add( tmpStr );
        end;
        // get captured image
        image1 := getOutputImage( filtersPlugin_WebCam, 'outImage' );
        if image1<>nil then begin
          imageOut := image.eraseOrCreateImageLike( imageOut, image1 );
          image.copyImageToImage( image1, imageOut );
        end;
    end else
    if panelActif=pFiltersPlugin_Viewer then begin
        preprocessMask(); // for imageMask
        chrono.Start;
        if chkUseROI.Checked=true then begin
          setRegionOfInterest( filtersPlugin_Viewer, @roi );
        end else begin
          unsetRegionOfInterest( filtersPlugin_Viewer );
        end;
        setParameterBoolean( filtersPlugin_Viewer, 'showViewer', chkPluginViewerShowViewer.Checked );
        setParameterImage( filtersPlugin_Viewer, 'inImage', imageOut );
        run( filtersPlugin_Viewer );
        chrono.Stop;
    end;
    if panelActif=pFiltersPlugin_SnapShot then begin
        chrono.Start;
        if txtPluginSnapShotWindowTitle.Text<>'' then begin
          setParameterString( filtersPlugin_SnapShot, 'window_title', txtPluginSnapShotWindowTitle.Text );
        end;
        if txtPluginSnapShotWindowHandle.Text<>'' then begin
          setParameterInteger( filtersPlugin_SnapShot, 'window_handle', StrToInt(txtPluginSnapShotWindowHandle.Text) );
        end else begin
          setParameterInteger( filtersPlugin_SnapShot, 'window_handle', 0 );
        end;
        if _runCommand<>'' then begin
          StrPCopy( tmpStrC, _runCommand );
          runCommand( filtersPlugin_SnapShot, tmpStrC );
          _runCommand := '';
        end else begin
          run( filtersPlugin_SnapShot );
        end;
        chrono.Stop;
        // get devices list
        pointers := getOutputArrayPointers( filtersPlugin_SnapShot, 'windows_title' );
        if pointers<>nil then begin
          // we know that it is pointers on C string
          lbPluginSnapShotWindowsTitle.Clear();
          for tmpI:=0 to Length(pointers^)-1 do begin
            tmpStr := StrPas( pointers^[tmpI] );
            lbPluginSnapShotWindowsTitle.Items.Add( tmpStr );
          end;
        end;
        // get outImage
        image1 := getOutputImage( filtersPlugin_SnapShot, 'outImage' );
        if image1<>nil then begin
          imageOut := image.eraseOrCreateImageLike( imageOut, image1 );
          image.copyImageToImage( image1, imageOut );
        end;
    end;
    timePerRun := timePerRun + chrono.getTime();
  end;

  timePerRun := timePerRun div count;
  txtProcessTime.Text := IntToStr(timePerRun);
  chrono.Free();

  imageIOVideo.showImage( imageOut, ViewerImageOut );
  imageIOVideo.showImage( imageOut2, ViewerImageOut2 );
  processViewerTool();
  testing := false;
 end;
end;

procedure TMainForm.preprocessSimulateAngle( img : PBitmap32; angle : Single );
var
  tmpPointer : Pointer;
  tmpImg : PBitmap32;
begin
  image.freeImage(imageSimulateAngle);
  setParameterImage(fRotationForSimulateAngle,'inImage',img);
  setParameterImage(fRotationForSimulateAngle,'outImageMonitoring',nil);
  setParameterBoolean(fRotationForSimulateAngle,'monitoring',false);
  setParameterFloat(fRotationForSimulateAngle,'angle', angle);
  setParameterInteger(fRotationForSimulateAngle,'interpolationMode', 2);
  setParameterString(fRotationForSimulateAngle,'missingPixelColorMode','BLACK');
  setParameterBoolean(fRotationForSimulateAngle,'autoAdjustSize',true);
  run(fRotationForSimulateAngle);
  tmpImg:=getOutputImage(fRotationForSimulateAngle,'outImage');
  imageSimulateAngle:=image.createImageFromImage(tmpImg);
end;

procedure TMainForm.preprocessBlob( img : PBitmap32 );
var
  tmpPointer : Pointer;
begin
  image.freeImage( imageBlob );
  imageBlob := image.createImageLike( imageSimulateAngle );
  setParameterImage( fBlobExplorerForBlob, 'inImage', imageSimulateAngle );
  setParameterImage( fBlobExplorerForBlob, 'outImage', imageBlob );
  setParameterInteger( fBlobExplorerForBlob, 'intensityBackground', sbBlobExplorerIntensityBackground.Position );
  setParameterInteger( fBlobExplorerForBlob, 'intensityPrecision', sbBlobExplorerIntensityPrecision.Position );
  setParameterString( fBlobExplorerForBlob, 'enableBlobArea', cbBlobExplorerEnableBlobArea.Text );
  setParameterInteger( fBlobExplorerForBlob, 'blobAreaMin', StrToInt(txtBlobExplorerAreaMin.Text) );
  setParameterInteger( fBlobExplorerForBlob, 'blobAreaMax', StrToInt(txtBlobExplorerAreaMax.Text) );
  setParameterBoolean( fBlobExplorerForBlob, 'contour', chkBlobExplorerContour.Checked );
  setParameterBoolean( fBlobExplorerForBlob, 'criticalPoints', True );
  setParameterInteger( fBlobExplorerForBlob, 'contourCriticalPointsAppoximationAccuracy', sbBlobExplorerCriticalPointsAppoximationAccuracy.Position );
  setParameterString( fBlobExplorerForBlob, 'approximationMethod', cbBlobExplorerApproximationMethod.Text );
  setParameterBoolean( fBlobExplorerForBlob, 'blobSurfaceInfo', True );
  setParameterBoolean( fBlobExplorerForBlob, 'monitoring', False );
  run( fBlobExplorerForBlob );
end;

procedure TMainForm.preprocessStackAnalyser;
var
  i : Integer;
begin
  // imagesInStackAnalyser
  if Length( imagesInStackAnalyser )=0 then begin
    SetLength( imagesInStackAnalyser, 10 );
    for i:=0 to Length(imagesInStackAnalyser)-1 do begin
      imagesInStackAnalyser[i] := image.createImageLike( imageIn );
      setParameterImage( filterBlur, 'inImage', imageIn );
      setParameterImage( filterBlur, 'outImage', imagesInStackAnalyser[i] );
      setParameterInteger( filterBlur, 'mode', 0 );
      setParameterInteger( filterBlur, 'radius', i*25 );
      unsetRegionOfInterest( filterBlur );
      run( filterBlur );
    end;
    sbStackAnalyserInImages.Max := Length( imagesInStackAnalyser )-1;
  end;
  // imageMask
  preprocessMask;
end;

procedure TMainForm.preprocessMask;
begin
  if imageMask=nil then begin
    if chkMask.Checked=True then begin
      imageMask := fmask.createMask( imageIn.Width, imageIn.Height, fmask.maskDisk );
    end;
  end;
end;

procedure TMainForm.cbConstantAddOverflowingModeChange(Sender: TObject);
begin
  pCutterTiles.Visible:=False;
  if cbCutterType.Text='TILES' then begin
    pCutterTiles.Visible:=True;
    pCutterTiles.Align:=alBottom;
  end;
  Test;
end;

procedure TMainForm.sbConstantAddChange(Sender: TObject);
begin
  txtConstantAddValue.Text:=IntToStr(sbConstantAdd.Position);
  Test;
end;

procedure TMainForm.lstConvTypeClick(Sender: TObject);
begin
  if lstConvType.ItemIndex <> -1 Then Begin
    Test;
  End ;
end;

procedure TMainForm.sbThresholdBinaryLowerChange(Sender: TObject);
begin
  txtThresholdBinaryLowerValue.Text:=IntToStr(sbThresholdBinaryLower.Position);
  if sbThresholdBinaryUpper.Position < sbThresholdBinaryLower.Position Then
    sbThresholdBinaryUpper.Position := sbThresholdBinaryLower.Position ;
  Test;
end;

procedure TMainForm.sbThresholdBinaryUpperChange(Sender: TObject);
begin
  txtThresholdBinaryUpperValue.Text := IntToStr(sbThresholdBinaryUpper.Position);
  if sbThresholdBinaryLower.Position > sbThresholdBinaryUpper.Position Then
    sbThresholdBinaryLower.Position := sbThresholdBinaryUpper.Position ;
  Test;
end;

procedure TMainForm.sbExplorerXChange(Sender: TObject);
begin
  setLineXY(lineX,MulDiv(sbExplorerX.Position,ViewerImageIn.Width,imageIn.Width),lineX.Top,lineX.Width,LineX.Height);
  setLineXY(lineY,LineY.Left,MulDiv(sbExplorerY.Position,ViewerImageIn.Height,imageIn.Height),LineY.Width,LineY.Height);
  poi.X := sbExplorerX.Position;
  poi.Y := sbExplorerY.Position;
  txtExplorerX.Text := IntToStr( Round(poi.X) );
  txtExplorerY.Text := IntToStr( Round(poi.Y) );
  Test;
end;

procedure TMainForm.splMidleMoved(Sender: TObject);
begin
  cmdCopyImageOut.Top := splMidle.Top-2 ;
  cmdCopyImageOut2.Top := cmdCopyImageOut.Top ;
  cmdCopyImageOut1ToImageOut2.Top := splMidle.Top + pnlBottomCenter.Height div 2;
  setLineXY(lineX,lineX.Left,0,lineX.Width,ViewerImageIn.Height);
  setLineXY(lineY,0,LineY.Top,ViewerImageIn.Width,LineY.Height);
end;

procedure TMainForm.pcTestChange(Sender: TObject);
begin
  if panelActif=pExplorer then begin
    lineX.Visible:=True;
    lineY.Visible:=True;
  end else begin
    lineX.Visible:=False;
    lineY.Visible:=False;
  end;
end;

procedure TMainForm.sbSobelChange(Sender: TObject);
begin
  txtSobelBlurIteration.Text := IntToStr(sbSobelBlurIteration.Position);
  txtSobelGain.Text := IntToStr(sbSobelGain.Position);
  txtSobelThresholdLower.Text := IntToStr(sbSobelThresholdLower.Position);
  txtSobelThresholdUpper.Text := IntToStr(sbSobelThresholdUpper.Position);
  Test;
end;

procedure TMainForm.sbContrastExplorerPrecisionChange(Sender: TObject);
begin
  txtContrastExplorerPrecision.Text:=IntToStr(sbContrastExplorerPrecision.Position);
  Test;
end;

procedure TMainForm.sbMorphologySE_sizeChange(Sender: TObject);
begin
  txtMorphologySE_size.Text:=IntToStr(sbMorphologySE_size.Position);
  updateMorphologySE();
  Test;
end;

procedure TMainForm.cbMorphologyTypeChange(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbMorphologyIterationChange(Sender: TObject);
begin
  txtMorphologyIteration.Text:=IntToStr(sbMorphologyIteration.Position);
  Test;
end;

procedure TMainForm.sbPercentStandardDeviationChange(Sender: TObject);
begin
  txtPercentStandardDeviation.Text:=IntToStr(sbPercentStandardDeviation.Position);
  txtPercentLocalDeviation.Text:=IntToStr(sbPercentLocalDeviation.Position);
  Test;
end;

procedure TMainForm.shpROIMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbLeft then begin
    mouseDownX := X ;
    mouseDownY := Y ;
    moveROI:=not moveROI;
  end else begin
    resizeROI:=not resizeROI;
  end;
end;

procedure TMainForm.shpROIMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if moveROI=true then begin
    setROI(shpROI.Left+X-mouseDownX,shpROI.Top+Y-mouseDownY,shpROI.Width,shpROI.Height);
  end else if resizeROI=true then begin
    setROI(shpROI.Left,shpROI.Top,X,Y);
  end;
end;
procedure TMainForm.shpROIMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    moveROI := false ;
end;

procedure TMainForm.ViewerImageInMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  selectedPoint.x:=MulDiv(x,imageIn.Width,ViewerImageIn.Width);
  selectedPoint.y:=MulDiv(y,imageIn.Height,ViewerImageIn.Height);
  if panelActif=pExplorer then begin
    sbExplorerX.Position := Floor(selectedPoint.x);
    sbExplorerY.Position := Floor(selectedPoint.y);
  end else
  if panelActif=pRotation then begin
    sbRotationCenterX.position := Floor(selectedPoint.x);
    sbRotationCenterY.position := Floor(selectedPoint.y);
  end else begin
    setLineXY(lineX,x,LineX.Top,LineX.Width,LineX.Height);
    setLineXY(lineY,LineY.Left,y,LineY.Width,LineY.Height);
  end;
  Test;
end;

procedure TMainForm.ViewerImageInMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if moveROI=true then begin
    setROI(X,Y,shpROI.Width,shpROI.Height);
  end else Begin
    if resizeROI=true then begin
      setROI(shpROI.Left,shpROI.Top,X-shpROI.Left,Y-shpROI.Top);
    end else Begin
     // to do
    End ;
  end;

end;

procedure TMainForm.ViewerImageInMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbLeft then begin
    moveROI:=false;
  end else begin
    resizeROI:=false;
  end;
end;

procedure TMainForm.setROI(X,Y,W,H:Integer);
begin
  shpROI.Left:=X;
  shpROI.Top:=Y;
  shpROI.Width:=W;
  shpROI.Height:=H;
  shpROI.Refresh;
  roi.Left:=MulDiv(X,imageIn.Width,ViewerImageIn.Width);
  roi.Top:=MulDiv(Y,imageIn.Height,ViewerImageIn.Height);

  roi.Right:=roi.Left+MulDiv(shpROI.Width,imageIn.Width,ViewerImageIn.Width);;
  roi.Bottom:=roi.Top+MulDiv(shpROI.Height,imageIn.Height,ViewerImageIn.Height);
  lblROI.Caption:='(x='+IntToStr(roi.Left)+',y='+IntToStr(roi.Top)+',w='+IntToStr(roi.Right-roi.Left)+',h='+IntToStr(roi.Bottom-roi.Top)+')';

  shpROIout.Left := MulDiv(roi.left, ViewerImageOut.Width, imageIn.Width) ;
  shpROIout.Top := MulDiv(roi.top, ViewerImageOut.Height, imageIn.height) ;

  shpROIout.Width := round((roi.Right-roi.Left)*ViewerImageOut.Width/imageIn.Width) ;
  shpROIout.height := round((roi.Bottom-roi.Top)*ViewerImageOut.Height/ imageIn.Height) ;
  Test;
end;

procedure TMainForm.lbFiltersClassicClick(Sender: TObject);
begin
  changeFilter(lbFiltersClassic);
end;

procedure TMainForm.lbFiltersOtherClick(Sender: TObject);
begin
  changeFilter(lbFiltersOther);
end;

procedure TMainForm.lbFiltersPluginsClick(Sender: TObject);
begin
  changeFilter(lbFiltersPlugins);
end;

procedure TMainForm.changeFilter(lb: TListBox);
var
  f : String;
  tmpI : Integer;
begin
  LineX.Visible:=false;
  LineY.Visible:=false;
  if lb.ItemIndex>=0 then begin
    f:=lb.Items[lb.ItemIndex];
    if panelActif<>nil then begin
      panelActif.Visible:=false;
    end;
    if f='ArithmeticAdd' then panelActif:=pAdd
    else if f='ArithmeticConstantAdd' then panelActif:=pConstantAdd
    else if f='ArithmeticSubstract' then panelActif:=pSubstract
    else if f='BlobBalance' then panelActif:=pBlobBalance
    else if f='BlobExplorer' then panelActif:=pBlobExplorer
    else if f='BlobGrouping' then panelActif:=pBlobGrouping
    else if f='BlobRepositioning' then panelActif:=pBlobRepositioning
    else if f='BlobRepositioning2' then panelActif:=pBlobRepositioning2
    else if f='Blur' then panelActif:=pBlur
    else if f='CellOnOff' then panelActif:=pCellOnOff
    else if f='CoOccurrenceMatrix' then panelActif:=pCoOccurrenceMatrix
    else if f='Copy' then panelActif:=pCopy
    else if f='ContrastExplorer' then panelActif:=pContrastExplorer
    else if f='Convolutions' then panelActif:=pConvolutions
    else if f='DistancesMap' then panelActif:=pDistancesMap
    else if f='Envelope' then panelActif:=pEnvelope
    else if f='Explorer' then panelActif:=pExplorer
    else if f='GranularityExplorer' then panelActif:=pGranularityExplorer
    else if f='Invert' then panelActif:=pInvert
    else if f='Resize' then panelActif := pResize
    else if f='LocalDeviation' then panelActif:=pLocalDeviation
    else if f='NonMaximaSuppression' then panelActif:=pNonMaximaSuppression
    else if f='Morphology' then panelActif:=pMorphology
    else if f='Histogram' then panelActif:=pHistogram
    else if f='HistogramContrast' then panelActif:=pHistogramContrast
    else if f='Pyramid' then panelActif:=pPyramid
    else if f='Normalize' then panelActif:=pPyramid
    else if f='StackMasher' then panelActif:=pPyramid
    else if f='StackProcessor' then panelActif:=pPyramid
    else if f='StandardDeviation' then panelActif:=pStandardDeviation
    else if f='Sobel' then panelActif:=pSobel
    else if f='surface inspection 1' then panelActif:=pApplication1
    else if f='SUSAN' then panelActif:=pSUSAN
    else if f='surface inspection 2' then panelActif:=pApplication2
    else if f='SPV' then panelActif:=pSPV
    else if f='ThresholdBinary' then panelActif:=pThresholdBinary
    else if f='Wavelets' then panelActif:=pWavelets
    else if f='Waves' then panelActif:=pWaves
    else if f='Cutter' then panelActif:=pCutter
    else if f='Canny' then panelActif:=pCanny
    else if f='Compare' then panelActif:=pCompare
    else if f='Contour' then panelActif:=pContour
    else if f='Log' then panelActif:=pLog
    else if f='LogPolar' then panelActif:=pLogPolar
    else if f='HoughTransform' then panelActif:=pHoughTransform
    else if f='Adjust' then panelActif:=pAdjust
    else if f='Means' then panelActif:=pMeans
    else if f='Median' then panelActif:=pMedian
    else if f='Rotation' then panelActif:=pRotation
    else if f='Integration' then panelActif:=pIntegration
    else if f='VectorHistogram' then panelActif:=pVectorHistogram
    else if f='Correlation' then panelActif:=pCorrelation
    else if f='GradientAnisotropicDiffusion' then panelActif:=pGradientAnisotropicDiffusion
    else if f='RescaleIntensity' then panelActif:=pRescaleIntensity
    else if f='Sigmoid' then panelActif:=pSigmoid
    else if f='SmoothBilateral' then panelActif:=pBilateral
    else if f='ImageCreator' then panelActif:=pImageCreator
    else if f='ImageInfo' then panelActif:=pImageInfo
    else if f='ImageLoader' then panelActif:=pImageLoader
    else if f='ImageSaver' then panelActif:=pImageSaver
    else if f='ProjectionLine' then panelActif:=pProjectionLine
    else if f='StackAnalyser' then panelActif:=pStackAnalyser
    else if f='RGB' then panelActif:=pRGB
    else if f='StackCreator' then panelActif:=pStackCreator
    else if f='FiltersPlugin_Resonator' then panelActif:=pFiltersPlugin_Resonator
    else if f='FiltersPlugin_TestDelphi' then panelActif:=pFiltersPlugin_TestDelphi
    else if f='FiltersPlugin_TestC' then panelActif:=pFiltersPlugin_TestC
    else if f='FiltersPlugin_Video' then panelActif:=pFiltersPlugin_Video
    else if f='FiltersPlugin_WebCam' then panelActif:=pFiltersPlugin_WebCam
    else if f='FiltersPlugin_Viewer' then panelActif:=pFiltersPlugin_Viewer
    else if f='FiltersPlugin_SnapShot' then panelActif:=pFiltersPlugin_SnapShot;
    if (f='Explorer') or (f='Rotation') or (f='Correlation') then begin
      LineX.Visible:=true;
      LineY.Visible:=true;
    end ;
    if panelActif<>nil then begin
      panelActif.Align:=alClient;
      panelActif.Visible:=true;
    end;
  end;
  if MemoHelp.Visible=True then begin
    sbHelpClick(Self);
    sbHelpClick(Self);
  end;
end;

procedure TMainForm.FormResize(Sender: TObject);
begin
  setROI(shpROI.Left,shpROI.Top,shpROI.Width,shpROI.Height);
end;

procedure TMainForm.cmdProcessClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.chkUseROIClick(Sender: TObject);
begin
  shpROI.Visible := chkUseROI.Checked;
  chkStandardDeviationShowOnlyROI.Enabled := chkUseROI.Checked;
  if chkUseROI.Checked=False then begin
    chkStandardDeviationShowOnlyROI.Checked := False;
    Test;
  end else begin
    setROI(
      ViewerImageIn.Width div 2, ViewerImageIn.Height div 2,
      ViewerImageIn.Width div 4, ViewerImageIn.Height div 4
    );
  end;
end;

procedure TMainForm.cbHistogramNormalizeChange(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbHistogramPrecisionChange(Sender: TObject);
begin
  txtHistogramPrecision.Text:=IntToStr(sbHistogramPrecision.Position);
  Test;
end;

procedure TMainForm.cbFilterTypeChange(Sender: TObject);
begin
  lbFiltersClassic.Visible := false;
  lbFiltersPlugins.Visible := false;
  lbFiltersOther.Visible := false;
  lbApplications.Visible := false;
  case cbFilterType.ItemIndex of
  0: begin
     lbFiltersClassic.Visible := true;
     lbFiltersClassic.Align := alClient;
     lbFiltersClassicClick(Self);
     end;
  1: begin
     lbFiltersPlugins.Visible := true;
     lbFiltersPlugins.Align := alClient;
     lbFiltersPluginsClick(Self);
     end;
  2: begin
     lbFiltersOther.Visible := true;
     lbFiltersOther.Align := alClient;
     lbFiltersOtherClick(Self);
     end;
  else
     begin
     if cbFilterType.Text='applications' then begin
       lbApplications.Visible := true;
       lbApplications.Align := alClient;
       lbApplicationsClick(Self);
     end;
     end;
  end;
end;

procedure TMainForm.sbBlurRadiusChange(Sender: TObject);
begin
  txtBlurRadius.Text := IntToStr( sbBlurRadius.Position );
  Test;
end;

procedure TMainForm.splTopMoved(Sender: TObject);
begin
  setLineXY(lineY,LineY.Left,LineY.Top,ViewerImageIn.Width,LineY.Height);
end;

procedure TMainForm.sbHistogramContrastRectangleWidthChange(
  Sender: TObject);
begin
  txtHistogramContrastRectangleWidth.Text:=IntToStr(sbHistogramContrastRectangleWidth.Position);
  Test;
end;

procedure TMainForm.sbHistogramContrastRectangleHeightChange(
  Sender: TObject);
begin
  txtHistogramContrastRectangleHeight.Text:=IntToStr(sbHistogramContrastRectangleHeight.Position);
  Test;
end;

procedure TMainForm.sbHistogramContrastPrecisionChange(Sender: TObject);
begin
  txtHistogramContrastPrecision.Text:=IntToStr(sbHistogramContrastPrecision.Position);
  Test;
end;

procedure TMainForm.sbPyramidChange(Sender: TObject);
var
  images : PArrayOfPBitmap32 ;
begin
  images := getOutputImages(filterStackProcessor,'outImages');
  if (images<>nil) and (length(images^) > sbPyramid.position) then begin
    image1 := images^[sbPyramid.position];
    if image1 <> nil Then Begin
      imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
      image.copyImageToImage(image1,imageOut);
      imageIOVideo.showImage(image1, ViewerImageOut);
    end;
  end else Begin
    Test();
  end;
end;

procedure TMainForm.cbHistogramContrastModeChange(Sender: TObject);
begin
  if cbHistogramContrastMode.Text='SHOW_DETAILS' then begin
    chkUseROI.State:=cbChecked;
  end;
  Test();
end;

procedure TMainForm.sbHistogramContrastGridSpacingWidthChange(
  Sender: TObject);
begin
  txtHistogramContrastGridSpacingWidth.Text:=IntToStr(sbHistogramContrastGridSpacingWidth.Position);
  Test();
end;

procedure TMainForm.sbHistogramContrastGridSpacingHeightChange(
  Sender: TObject);
begin
  txtHistogramContrastGridSpacingHeight.Text:=IntToStr(sbHistogramContrastGridSpacingHeight.Position);
  Test();
end;

procedure TMainForm.btnWebCamLiveClick(Sender: TObject);
begin
  if btnWebCamLive.Caption='live' then begin
    btnWebCamLive.Caption := 'stop';
    cbWebCamDevice.Enabled := False;
    cbWebCamFormat.Enabled := False;
    setParameterBoolean( filtersPlugin_WebCam2, 'showViewer', True );
    setParameterInteger( filtersPlugin_WebCam2, 'formatIndex', cbWebCamFormat.ItemIndex );
    runCommand( filtersPlugin_WebCam2, 'DEVICE_OPEN' );
  end else begin
    btnWebCamLive.Caption := 'live';
    cbWebCamDevice.Enabled := True;
    cbWebCamFormat.Enabled := True;
    setParameterBoolean( filtersPlugin_WebCam2, 'showViewer', False );
    runCommand( filtersPlugin_WebCam2, 'DEVICE_CLOSE' );
  end;
end;

procedure TMainForm.cbWebCamDeviceChange(Sender: TObject);
var
  deviceIndex : Integer;
  tmpI : integer;
  pointers : PArrayOfPointers;
  tmpStr : String;
begin
  deviceIndex := cbWebCamDevice.ItemIndex;
  if deviceIndex>=0 then begin
    setParameterInteger( filtersPlugin_WebCam2, 'deviceIndex', deviceIndex );
    runCommand( filtersPlugin_WebCam2, 'READ_DEVICE_FORMAT' );
    // get format list
    pointers := getOutputArrayPointers( filtersPlugin_WebCam2, 'deviceFormats' );
    // we know that it is pointers on C string
    cbWebCamFormat.Clear();
    for tmpI:=0 to Length(pointers^)-1 do begin
      tmpStr := StrPas( pointers^[tmpI] );
      cbWebCamFormat.Items.Add( tmpStr );
    end;
    cbWebCamFormat.Enabled := True;
  end;
end;

procedure TMainForm.cbWebCamFormatChange(Sender: TObject);
begin
  btnWebCamLive.Enabled := True;
  setParameterBoolean( filtersPlugin_WebCam2, 'showViewer', True );
end;

procedure TMainForm.chkVideoAutoCaptureRunClick(Sender: TObject);
begin
  TimerAutoProcess.Enabled := chkVideoAutoCaptureRun.Checked;
end;

procedure TMainForm.chkWebCamAutoCaptureRunClick(Sender: TObject);
begin
  TimerAutoProcess.Enabled := chkWebCamAutoCaptureRun.Checked;
end;

procedure TMainForm.sbGranularityExplorerPrecisionChange(Sender: TObject);
begin
  txtGranularityExplorerPrecision.Text:=IntToStr(sbGranularityExplorerPrecision.Position);
  Test();
end;

procedure TMainForm.cbStandardDeviationOutputColorChange(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.sbHistogramContrastBlurChange(Sender: TObject);
begin
  txtHistogramContrastBlur.Text:=IntToStr(sbHistogramContrastBlur.Position);
  Test();
end;

procedure TMainForm.sbGranularityExplorerSensibilityChange(
  Sender: TObject);
begin
  txtGranularityExplorerSensibility.Text:=IntToStr(sbGranularityExplorerSensibility.Position);
  Test();
end;

procedure TMainForm.lstPyramidFilterClick(Sender: TObject);
begin
  Test();
End;

procedure TMainForm.cmdCopyImageOut1ToImageOut2Click(Sender: TObject);
begin
  if image1<>nil then begin
    image.freeImage(imageOut2);
    imageOut2:=image.createImageFromImage(image1);
    image2:=imageOut2;
    imageIOVideo.showImage(image2,ViewerImageOut2);
  end;
end;

procedure TMainForm.sbBlobExplorerChange(Sender: TObject);
begin
  if sbBlobExplorerAreaMax.Position<sbBlobExplorerAreaMin.Position then sbBlobExplorerAreaMax.Position:=sbBlobExplorerAreaMin.Position;
  txtBlobExplorerAreaMin.Text:=IntToStr(Sqr(sbBlobExplorerAreaMin.Position));
  txtBlobExplorerAreaMax.Text:=IntToStr(Sqr(sbBlobExplorerAreaMax.Position));
  Test;
end;

procedure TMainForm.cbBlobExplorerEnableBlobSizeChange(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.sbPyramidNormalisationChange(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.lbApplicationsClick(Sender: TObject);
begin
  changeFilter(lbApplications);
end;

procedure TMainForm.sbApplication1DefectAreaMinChange(Sender: TObject);
begin
  txtApplication1DefectAreaMin.Text:=IntToStr(sbApplication1DefectAreaMin.Position);
  Test();
end;

procedure TMainForm.sbApplication2DefectAreaMinChange(Sender: TObject);
begin
  txtApplication2DefectAreaMin.Text:=IntToStr(sbApplication2DefectAreaMin.Position);
  Test();
end;

procedure TMainForm.sbApplication1MinMaxNumberOfDefectsChange(
  Sender: TObject);
begin
  if sbApplication1MaxNumberOfDefectsForNG.Position<sbApplication1MinNumberOfDefectsForOK.Position then begin
    sbApplication1MaxNumberOfDefectsForNG.Position:=sbApplication1MinNumberOfDefectsForOK.Position;
  end;
  txtApplication1MinNumberOfDefectsForOK.Text:=IntToStr(sbApplication1MinNumberOfDefectsForOK.Position);
  txtApplication1MaxNumberOfDefectsForNG.Text:=IntToStr(sbApplication1MaxNumberOfDefectsForNG.Position);
  Test();
end;

procedure TMainForm.cbSobelModeFastChange(Sender: TObject);
begin
  if cbSobelModeFast.Text='TRUE' then begin
    chkSobelAngleCalculation.Enabled := False;
    chkSobelAngleCalculation.Checked := False;
  end else begin
    chkSobelAngleCalculation.Enabled := True;
  end;
  Test();
end;

procedure TMainForm.sbSUSANprecisionChange(Sender: TObject);
begin
  txtSUSANprecision.Text:=IntToStr(sbSUSANprecision.Position);
  Test();
end;

procedure TMainForm.sbSUSANpixelBrightnessDifferenceThresholdChange(
  Sender: TObject);
begin
  txtSUSANpixelBrightnessDifferenceThreshold.Text:=IntToStr(sbSUSANpixelBrightnessDifferenceThreshold.Position);
  Test();
end;

procedure TMainForm.cbSUSANmodeChange(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.sbSUSANpixelCentroidDifferenceThresholdChange(
  Sender: TObject);
begin
  txtSUSANpixelCentroidDifferenceThreshold.Text:=IntToStr(sbSUSANpixelCentroidDifferenceThreshold.Position);
  Test();
end;

procedure TMainForm.sbSPVScanLineIncrementChange(Sender: TObject);
begin
  txtSPVBackground.Text:=IntToStr(sbSPVBackground.Position);
  txtSPVScanLineIncrement.Text:=IntToStr(sbSPVScanLineIncrement.Position);
  txtSPVmaximalTrackingStep.Text:=IntToStr(sbSPVmaximalTrackingStep.Position);
  txtSPVmaximalTrackingCycles.Text:=IntToStr(sbSPVmaximalTrackingCycles.Position);
  txtSPVpolygonalApproximationEpsilone.Text:=IntToStr(sbSPVpolygonalApproximationEpsilone.Position);
  Test();
end;

procedure TMainForm.cbSPVbackgroundColorChange(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.lbFiltersClassicDblClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.sbLocalDeviationSizeChange(Sender: TObject);
begin
  txtLocalDeviationSize.Text:=IntToStr(sbLocalDeviationSize.Position);
  Test();
end;

procedure TMainForm.chkShowRoiClick(Sender: TObject);
begin
  shpROIout.Visible := chkShowRoi.Checked ;
end;

procedure TMainForm.sbBlobExplorerIntensityBackgroundChange(
  Sender: TObject);
begin
  txtBlobExplorerIntensityBackground.Text:=IntToStr(sbBlobExplorerIntensityBackground.Position);
  txtBlobExplorerIntensityPrecision.Text:=IntToStr(sbBlobExplorerIntensityPrecision.Position);
  Test();
end;

procedure TMainForm.ViewerImageOut2Click(Sender: TObject);
begin
  cmdCopyImageOut2Click(Self);
end;

procedure TMainForm.sbDistanceMapScaleChange(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.chkDistanceMapPreInvertClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.TimerAutoProcessTimer(Sender: TObject);
begin
  try
    case PageControlSource.TabIndex of
    0 : // Image
      begin
        Test();
      end;
    1 :  // Video
      begin
        btnVideoCaptureClick( Self );
      end;
    2 :  // WebCam
      begin
        btnWebCamCaptureClick( Self );
      end;
    end;
  except
    chkVideoAutoCaptureRun.Checked := False;
    chkWebCamAutoCaptureRun.Checked := False;
  end;
end;

procedure TMainForm.rdgThresholdClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.cbNonMaximaSuppressionOutputColorChange(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.lbFiltersOtherDblClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.lbFiltersPluginsDblClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.lbApplicationsDblClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.lbFiltersOpencvDblClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.sbCannyThresholdChange(Sender: TObject);
begin
  txtCannyThreshold1.Text:=IntToStr(sbCannyThreshold1.Position);
  txtCannyThreshold2.Text:=IntToStr(sbCannyThreshold2.Position);
  Test();
end;

procedure TMainForm.sbContourThresholdChange(Sender: TObject);
begin
  txtContourThreshold.Text:=IntToStr(sbContourThreshold.Position);
  txtContourApproximationaccuracy.Text:=IntToStr(sbContourApproximationaccuracy.Position);
  Test();
end;

procedure TMainForm.chkContourFillClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.cmdLoadVideoClick(Sender: TObject);
Var
  fileName : String ;
begin
  if dlgOpenFilm.Execute then Begin
    fileName := dlgOpenFilm.FileName ;
    setParameterBoolean( filtersPlugin_Video2, 'showViewer', True );
    setParameterString( filtersPlugin_Video2, 'fileName', fileName );
    runCommand( filtersPlugin_Video2, 'LOAD' );
  end;
end;

procedure TMainForm.cmdPauseClick(Sender: TObject);
begin
  runCommand( filtersPlugin_Video2, 'PAUSE' );
  _videoPlaying := False;
end;

procedure TMainForm.cmdStopClick(Sender: TObject);
begin
  runCommand( filtersPlugin_Video2, 'STOP' );
  _videoPlaying := False;
end;

procedure TMainForm.cmdPlayClick(Sender: TObject);
begin
  runCommand( filtersPlugin_Video2, 'PLAY' );
  _videoPlaying := True;
end;

procedure TMainForm.chkBlobExplorerCriticalPointsClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.sbBlobExplorerCriticalPointsAppoximationAccuracyChange(
  Sender: TObject);
begin
  txtBlobExplorerCriticalPointsAppoximationAccuracy.Text:=IntToStr(sbBlobExplorerCriticalPointsAppoximationAccuracy.Position);
  Test();
end;

procedure TMainForm.shpViewerToolROIMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbLeft then begin
    mouseDownX := X ;
    mouseDownY := Y ;
    moveViewerToolROI:=not moveViewerToolROI;
  end else begin
    resizeViewerToolROI:=not resizeViewerToolROI;
  end;
end;

procedure TMainForm.shpViewerToolROIMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if moveViewerToolROI=true then begin
    setViewerToolROI(shpViewerToolROI.Left+X-mouseDownX,shpViewerToolROI.Top+Y-mouseDownY,shpViewerToolROI.Width,shpViewerToolROI.Height);
    if panelActif=pCoOccurrenceMatrix then begin
      Test;
    end;
  end else if resizeViewerToolROI=true then begin
    setViewerToolROI(shpViewerToolROI.Left,shpViewerToolROI.Top,X,Y);
    if panelActif=pCoOccurrenceMatrix then begin
      Test;
    end;
  end;
end;

procedure TMainForm.ViewerImageOutMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if moveViewerToolROI=true then begin
    setViewerToolROI(X,Y,shpViewerToolROI.Width,shpViewerToolROI.Height);
  end else Begin
    if resizeViewerToolROI=true then begin
      setViewerToolROI(shpViewerToolROI.Left,shpViewerToolROI.Top,X-shpViewerToolROI.Left,Y-shpViewerToolROI.Top);
      if panelActif=pCoOccurrenceMatrix then begin
        Test;
      end;
    end else Begin
     // to do
    End ;
  end;
  if rbgViewerTools.ItemIndex=5 then begin
    processViewerToolPixelinfo( X, Y );
  end;
end;

procedure TMainForm.processViewerToolPixelinfo( mouseX, mouseY : Integer );
var
  imgX, imgY : Integer;
  tmpImageIn : PBitmap32;
  H, S, L : Single;
begin
  tmpImageIn := image1;
  if tmpImageIn=nil then begin
    tmpImageIn := imageIn;
  end;
  imgX := Floor( (mouseX * tmpImageIn.Width)  / ViewerImageOut.Width );
  imgY := Floor( (mouseY * tmpImageIn.Height) / ViewerImageOut.Height );
  txtViewerToolText1.Text := format('X=%d Y=%d', [imgX,imgY]);
  txtViewerToolText2.Text := image.getPixelAsString( tmpImageIn, imgX, imgY );
  image.RGBtoHSL( image.getPixel( tmpImageIn, imgX, imgY ), H, S, L );
  txtViewerToolText3.Text := format('Hue=%d, Saturation=%d, Luminosity=%d', [floor(H*255),floor(S*255),floor(L*255)]);
end;


procedure TMainForm.ViewerImageOutMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbLeft then begin
    moveViewerToolROI:=false;
  end else begin
    resizeViewerToolROI:=false;
  end;
end;

procedure TMainForm.setViewerToolROI(X,Y,W,H:Integer);
begin
  shpViewerToolROI.Left := X;
  shpViewerToolROI.Top := Y;
  shpViewerToolROI.Width := W;
  shpViewerToolROI.Height := H;
  shpViewerToolROI.Refresh;
  processViewerTool();
end;

procedure TMainForm.processViewerTool();
var
  tmpImageIn : PBitmap32;
  X,Y,W,H:Integer;
  samplingScaleLength : Single;
  tmpImage : PBitmap32;
  images : PArrayOfPBitmap32;
begin
  tmpImageIn:=image1;
  if tmpImageIn=nil then begin
    tmpImageIn:=imageIn;
  end;
  X := shpViewerToolROI.Left;
  Y := shpViewerToolROI.Top;
  W := shpViewerToolROI.Width;
  H := shpViewerToolROI.Height;
  roiViewerTool.Left:=MulDiv(X,tmpImageIn.Width,ViewerImageOut.Width);
  roiViewerTool.Top:=MulDiv(Y,tmpImageIn.Height,ViewerImageOut.Height);
  roiViewerTool.Right:=roiViewerTool.Left+MulDiv(W,tmpImageIn.Width,ViewerImageOut.Width);
  roiViewerTool.Bottom:=roiViewerTool.Top+MulDiv(H,tmpImageIn.Height,ViewerImageOut.Height);
  // if viewer tool is 'magnifying' or '3D'
  if (rbgViewerTools.ItemIndex=1)  or (rbgViewerTools.ItemIndex=2) then begin
    setParameterImage(filterViewerToolCopy,'inImage',tmpImageIn);
    setRegionOfInterest(filterViewerToolCopy,@roiViewerTool);
    run(filterViewerToolCopy);
    tmpImage := getOutputImage(filterViewerToolCopy,'outImage');
    viewertoolImageOut:=image.eraseOrCreateImageLike(viewertoolImageOut,tmpImage);
    image.copyImageToImage(tmpImage,viewertoolImageOut);
    if (rbgViewerTools.ItemIndex=1) then begin
      // if viewer tool is 'magnifying'
      imageIOVideo.showImage(viewertoolImageOut,ViewerToolImage);
    end else  if (rbgViewerTools.ItemIndex=2) then begin
      // if viewer tool is '3D'
      samplingScaleLength:=((viewertoolImageOut.Width)/10)/2;
      HeightField1.XSamplingScale.Min:=-samplingScaleLength;
      HeightField1.XSamplingScale.Max:=samplingScaleLength;
      samplingScaleLength:=((viewertoolImageOut.Height)/10)/2;
      HeightField1.YSamplingScale.Min:=-samplingScaleLength;
      HeightField1.YSamplingScale.Max:=samplingScaleLength;
    end;
  end else
  // if viewer tool is 'Explorer'
  if (rbgViewerTools.ItemIndex=3)  or (rbgViewerTools.ItemIndex=4) then begin
    setParameterImage( filterViewerToolCopy, 'inImage', tmpImageIn );
    setRegionOfInterest( filterViewerToolCopy, @roiViewerTool );
    run( filterViewerToolCopy );
    tmpImage := getOutputImage( filterViewerToolCopy, 'outImage' );
    setParameterImage( filterViewerToolExplorer, 'inImage', tmpImage );
    setParameterInteger( filterViewerToolExplorer, 'X', tmpImage.Width div 2 );
    setParameterInteger( filterViewerToolExplorer, 'Y', tmpImage.Height div 2 );
    setParameterInteger( filterViewerToolExplorer, 'precision', 1 );
    run( filterViewerToolExplorer );
    images := getOutputImages( filterViewerToolExplorer, 'outImages' );
    if rbgViewerTools.ItemIndex=3 then tmpImage := images^[0] else tmpImage := images^[1];
    viewertoolImageOut := image.eraseOrCreateImageLike( viewertoolImageOut, tmpImage );
    image.copyImageToImage( tmpImage, viewertoolImageOut );
    imageIOVideo.showImage( viewertoolImageOut, ViewerToolImage );
  end;
end;

procedure TMainForm.rbgViewerToolsClick(Sender: TObject);
begin
  pnlViewerTools.Left := ViewerImageOut2.Left;
  pnlViewerTools.Top := ViewerImageOut2.Top;
  pnlViewerTools.Width := ViewerImageOut2.Width;
  pnlViewerTools.Height := ViewerImageOut2.Height;
  txtViewerToolText1.Visible := False;
  txtViewerToolText2.Visible := False;
  txtViewerToolText3.Visible := False;
  shpViewerToolROI.Visible :=false;
  pnlViewerTools.Visible := false;
  ViewerToolImage.Visible := false;
  ViewerToolGLScene.Visible := false;
  case rbgViewerTools.ItemIndex of
  0: begin
     end;
  1,3,4: begin
       shpViewerToolROI.Visible := true;
       pnlViewerTools.Visible := true;
       ViewerToolGLScene.Visible := false;
       ViewerToolImage.Align := alClient;
       ViewerToolImage.Visible := true;
       processViewerTool();
     end;
  2: begin
       shpViewerToolROI.Visible := true;
       pnlViewerTools.Visible := true;
       processViewerTool();
       ViewerToolGLScene.Align := alClient;
       ViewerToolGLScene.Visible := true;
     end;
  5: begin
       pnlViewerTools.Visible := true;
       txtViewerToolText1.Visible := True;
       txtViewerToolText2.Visible := True;
       txtViewerToolText3.Visible := True;
     end;
  end;
end;

procedure TMainForm.HeightField1GetHeight(const x, y: Single;
  var z: Single; var color: TVector4f; var texPoint: TTexPoint);
var
  tmpX : Extended;
  image_x, image_y : Word;
  pixelColor : TColor32;
  pixelIntensity : Integer;
begin
  tmpX := (HeightField1.XSamplingScale.Max+HeightField1.XSamplingScale.Min-0.05) - x; // to inverse the view
  image_x := (Round(tmpX*10)+viewertoolImageOut.Width div 2);
  //image_x := Round(x*10)+viewertoolImageOut.Width div 2;
  image_y := Round(y*10)+viewertoolImageOut.Height div 2;
  pixelColor := image.getValidPixel( viewertoolImageOut, image_x, image_y );
  pixelIntensity := Intensity(pixelColor);
  z := pixelIntensity/256;
end;

procedure TMainForm.ViewerToolGLSceneMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   viewertoolGlscene_mx:=x;
   viewertoolGlscene_my:=y;
   cameraDownX := ViewerToolGLScene.camera.position.x ;
   cameraDownY := ViewerToolGLScene.camera.position.y ;
   cameraDownZ := ViewerToolGLScene.camera.position.z ;
   cameraDownRollAngle :=  ViewerToolGLScene.camera.TargetObject.RollAngle ;
end;

procedure TMainForm.ViewerToolGLSceneMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
var angle : Single ;
begin
  if ssLeft in Shift then begin
    GLCamera1.MoveAroundTarget(viewertoolGlscene_my-y, viewertoolGlscene_mx-x);
    viewertoolGlscene_mx:=x;
    viewertoolGlscene_my:=y;
  end;
  if ssRight in Shift then begin
    angle := (x-viewertoolGlscene_mx)/2 ;
    ViewerToolGLScene.camera.TargetObject.RollAngle:=cameraDownRollAngle + angle;
  end;
end;

procedure TMainForm.shpViewerToolROIMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  moveViewerToolROI:=false ;
end;

procedure TMainForm.sbLogpolarMagnitudeChange(Sender: TObject);
begin
  txtLogpolarMagnitude.Text:=IntToStr(sbLogpolarMagnitude.Position);
  Test;
end;

procedure TMainForm.chkLogpolarReinversetransformationClick(
  Sender: TObject);
begin
  Test;
end;

procedure TMainForm.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: Types.TPoint; var Handled: Boolean);
  Var scale : Single ;
begin
  scale := 1.03 ;
  ViewerToolGLScene.camera.position.x := ViewerToolGLScene.camera.position.x * scale ;
  ViewerToolGLScene.camera.position.y := ViewerToolGLScene.camera.position.y * scale ;
  ViewerToolGLScene.camera.position.z := ViewerToolGLScene.camera.position.z * scale ;
end;

procedure TMainForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: Types.TPoint; var Handled: Boolean);
  Var scale : Single ;
begin
  scale := 0.97 ;
  ViewerToolGLScene.camera.position.x := ViewerToolGLScene.camera.position.x * scale ;
  ViewerToolGLScene.camera.position.y := ViewerToolGLScene.camera.position.y * scale ;
  ViewerToolGLScene.camera.position.z := ViewerToolGLScene.camera.position.z * scale ;
end;

procedure TMainForm.sbCutterRectWidthChange(Sender: TObject);
begin
  txtCutterRectWidth.Text:=IntToStr(sbCutterRectWidth.Position);
  Test;
end;

procedure TMainForm.sbCutterRectHeightChange(Sender: TObject);
begin
  txtCutterRectHeight.Text:=IntToStr(sbCutterRectHeight.Position);
  Test;
end;

procedure TMainForm.chkCutterMonitoringClick(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbCutterOutImagesChange(Sender: TObject);
var
  images : PArrayOfPBitmap32 ;
begin
  images := getOutputImages(filterCutter,'outImages');
  if (images<>nil) and (Length(images^) > sbCutterOutImages.position) then Begin
    image1 := images^[sbCutterOutImages.position];
    if image1 <> nil Then Begin
      txtCutterOutimageIndex.Text:=IntToStr(sbCutterOutImages.position+1)+'/'+IntToStr(sbCutterOutImages.Max+1);
      imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
      image.copyImageToImage(image1,imageOut);
      imageIOVideo.showImage(image1, ViewerImageOut);
    end ;
  end else begin
    sbCutterOutImages.position:=0;
    Test;
  end;
end;

procedure TMainForm.sbConstrastChange(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbBrightnessChange(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbMedianChange(Sender: TObject);
begin
  txtMedian.Text:=IntToStr(sbMedian.Position);
  Test;
end;

procedure TMainForm.chkWaveletsInverseClick(Sender: TObject);
begin
  Test ;
end;

procedure TMainForm.cbSubstractModeChange(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.cbCutterTypeChange(Sender: TObject);
begin
  pCutterTiles.Visible:=False;
  pCutterBlob.Visible:=False;
  if cbCutterType.Text='TILES' then begin
    pCutterTiles.Visible:=True;
    pCutterTiles.Align:=alBottom;
  end else
  if cbCutterType.Text='BLOB' then begin
    pCutterBlob.Visible:=True;
    pCutterBlob.Align:=alBottom;
  end;
  Test;
end;

procedure TMainForm.sbCutterBlobBackgroundChange(Sender: TObject);
begin
  txtCutterBlobBackground.Text:=IntToStr(sbCutterBlobBackground.Position);
  Test;
end;

procedure TMainForm.sbCutterBlobAreaChange(Sender: TObject);
begin
  if sbCutterBlobAreaMax.Position<sbCutterBlobAreaMin.Position then sbCutterBlobAreaMax.Position:=sbCutterBlobAreaMin.Position;
  txtCutterBlobAreaMin.Text:=IntToStr(Sqr(sbCutterBlobAreaMin.Position));
  txtCutterBlobAreaMax.Text:=IntToStr(Sqr(sbCutterBlobAreaMax.Position));
  Test;
end;

procedure TMainForm.sbRotationAngleChange(Sender: TObject);
begin
  txtRotationAngle.Text := FloatToStrF(sbRotationAngle.Position/10,ffFixed,4,1);
  txtRotationAngle.Refresh ;
  Test ;
end;

procedure TMainForm.sbRotationCenterXChange(Sender: TObject);
begin
  setLineXY(lineX,MulDiv(sbRotationCenterX.Position,ViewerImageIn.Width,imageIn.Width),lineX.Top,lineX.Width,LineX.Height);
  setLineXY(lineY,LineY.Left,MulDiv(sbRotationCenterY.Position,ViewerImageIn.Height,imageIn.Height),LineY.Width,LineY.Height);
  Test ;
end;

procedure TMainForm.rdgRotationInterpolationClick(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbCutterMarginChange(Sender: TObject);
begin
  txtCutterMargin.Text:=IntToStr(sbCutterMargin.Position);
  Test;
end;

procedure TMainForm.cbRotationMissingpixelcolormodeChange(Sender: TObject);
begin
 Test;
end;

procedure TMainForm.chkRotationMonitoringClick(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbIntegrationScaleChange(Sender: TObject);
begin
  Test
end;

procedure TMainForm.sbIntegrationOffsetChange(Sender: TObject);
begin
  Test ;
end;

procedure TMainForm.rdgBlurModeClick(Sender: TObject);
begin
  Test ;
end;

procedure TMainForm.sbBlobRepositioningBlobNumeroChange(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbBlobRepositioningSimulateAngleChange(
  Sender: TObject);
begin
  txtBlobRepositioningSimulateAngle.Text := FloatToStrF(sbBlobRepositioningSimulateAngle.Position/10,ffFixed,4,1);
  txtBlobRepositioning2SimulateAngle.Text := FloatToStrF(sbBlobRepositioning2SimulateAngle.Position/10,ffFixed,4,1);
  Test;
end;

procedure TMainForm.cbBlobRepositioningMonitoringViewChange(
  Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbBlobRepositioningSmoothChange(Sender: TObject);
begin
  Test ;
end;

procedure TMainForm.cmdBlobRepositioningLearnClick(Sender: TObject);
begin
  blobRepositioningLearnedAngle:=StrToFloat(txtBlobRepositioningSimulateAngle.Text);
  runCommand(filterBlobRepositioning,'learn');
  Test;
end;

procedure TMainForm.sbVectorHistogramSmoothChange(Sender: TObject);
begin
  txtVectorHistogramSmooth.Text:=IntToStr(sbVectorHistogramSmooth.Position);
  Test;
end;

procedure TMainForm.sbVectorHistogramBlobNumeroChange(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbBlobRepositioningMarginChange(Sender: TObject);
begin
  txtBlobRepositioningMargin.Text:=IntToStr(sbBlobRepositioningMargin.Position);
  txtBlobRepositioning2Margin.Text:=IntToStr(sbBlobRepositioning2Margin.Position);
  Test;
end;

procedure TMainForm.chkCutterBlobUseblobrepositioningClick(
  Sender: TObject);
begin
  Test;
end;

procedure TMainForm.cbVectorHistogramAngleprecisionChange(Sender: TObject);
begin
  Test;
end;

{
  pCutterTiles.Visible:=False;
  pCutterBlob.Visible:=False;
  if cbCutterType.Text='TILES' then begin
    pCutterTiles.Visible:=True;
    pCutterTiles.Align:=alBottom;
  end else
  if cbCutterType.Text='BLOB' then begin
    pCutterBlob.Visible:=True;
    pCutterBlob.Align:=alBottom;
  end;
  Test;
}

procedure TMainForm.chkBlobRepositioningMonitoringClick(Sender: TObject);
begin
  lblBlobRepositioningMonitoringView.Visible:=chkBlobRepositioningMonitoring.Checked;
  cbBlobRepositioningMonitoringView.Visible:=chkBlobRepositioningMonitoring.Checked;
  Test;
end;

procedure TMainForm.cbBlobRepositioningMethodChange(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.cbBlobRepositioningVectorhistogramAngleprecisionChange(
  Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbResizeScaleChange(Sender: TObject);
begin
  txtResizeScale.Text := IntToStr(sbResizeScale.Position) + ' %';
  Test ;
end;

procedure TMainForm.cbResizeModeChange(Sender: TObject);
begin
  test ;
end;

procedure TMainForm.cmdBlobRepositioningAutomatictestClick(
  Sender: TObject);
var
  iangle, iangleFrom, iangleTo, iangleInc : Integer;
  angle{, calculatedAngle} : Single;
  error, errorTotal, averageError : Single;
  maxError : Single;
  count : Integer;
  formatSettings : TFormatSettings;
begin
 if cmdBlobRepositioningAutomatictestStop.Visible=false then begin
  formatSettings.DecimalSeparator:='.';
  iangleFrom:=Floor(StrToFloat(txtBlobRepositioningAutomatictestAngleFrom.Text,formatSettings)*10);
  iangleTo:=Floor(StrToFloat(txtBlobRepositioningAutomatictestAngleTo.Text,formatSettings)*10);
  iangleInc:=Floor(StrToFloat(txtBlobRepositioningAutomatictestAngleInc.Text,formatSettings)*10);
  if iangleInc<=iangleInc then iangleInc:=1;
  iangle:=iangleFrom;
  errorTotal:=0;
  count:=1;
  maxError:=-MaxSingle;
  pbBlobRepositioningAutomatictest.Min:=iangleFrom;
  pbBlobRepositioningAutomatictest.Max:=iangleTo;
  pbBlobRepositioningAutomatictest.Visible:=true;
  cmdBlobRepositioningAutomatictestStop.Visible:=true;
  repeat
    angle:=iangle/10;
    txtBlobRepositioningAutomatictestAngle.Text:=FloatToStr(angle);
    sbBlobRepositioningSimulateAngle.Position:=iangle;
    Application.ProcessMessages;
    pbBlobRepositioningAutomatictest.Position:=iangle;
    //calculatedAngle:=-StrToFloat(txtBlobRepositioningComputedAngle.Text);
    error:=Abs(StrToFloat(txtBlobRepositioningError.Text));
    errorTotal:=errorTotal+error;
    averageError:=errorTotal/count;
    txtBlobRepositioningAutomatictestAverageError.Text:=FloatToStr(averageError);
    maxError:=Max(error,maxError);
    txtBlobRepositioningAutomatictestMaxError.Text:=FloatToStr(maxError);
    Inc(count);
    Inc(iangle,iangleInc);
  until (iangle>iangleTo) or (bAutotestStop=true);
  pbBlobRepositioningAutomatictest.Visible:=false;
  cmdBlobRepositioningAutomatictestStop.Visible:=false;
  bAutotestStop:=false;
 end;
end;

procedure TMainForm.cmdBlobRepositioning2AutomatictestClick(
  Sender: TObject);
var
  iangle, iangleFrom, iangleTo, iangleInc : Integer;
  angle{, calculatedAngle} : Single;
  error, errorTotal, averageError : Single;
  maxError : Single;
  count : Integer;
  formatSettings : TFormatSettings;
begin
 if cmdBlobRepositioning2AutomatictestStop.Visible=false then begin
  formatSettings.DecimalSeparator:='.';
  iangleFrom:=Floor(StrToFloat(txtBlobRepositioning2AutomatictestAngleFrom.Text,formatSettings)*10);
  iangleTo:=Floor(StrToFloat(txtBlobRepositioning2AutomatictestAngleTo.Text,formatSettings)*10);
  iangleInc:=Floor(StrToFloat(txtBlobRepositioning2AutomatictestAngleInc.Text,formatSettings)*10);
  if iangleInc<=iangleInc then iangleInc:=1;
  iangle:=iangleFrom;
  errorTotal:=0;
  count:=1;
  maxError:=-MaxSingle;
  pbBlobRepositioning2Automatictest.Min:=iangleFrom;
  pbBlobRepositioning2Automatictest.Max:=iangleTo;
  pbBlobRepositioning2Automatictest.Visible:=true;
  cmdBlobRepositioning2AutomatictestStop.Visible:=true;
  repeat
    angle:=iangle/10;
    txtBlobRepositioning2AutomatictestAngle.Text:=FloatToStr(angle);
    sbBlobRepositioning2SimulateAngle.Position:=iangle;
    Application.ProcessMessages;
    pbBlobRepositioning2Automatictest.Position:=iangle;
    //calculatedAngle:=-StrToFloat(txtBlobRepositioning2ComputedAngle.Text);
    error:=Abs(StrToFloat(txtBlobRepositioning2Error.Text));
    errorTotal:=errorTotal+error;
    averageError:=errorTotal/count;
    txtBlobRepositioning2AutomatictestAverageError.Text:=FloatToStr(averageError);
    maxError:=Max(error,maxError);
    txtBlobRepositioning2AutomatictestMaxError.Text:=FloatToStr(maxError);
    Inc(count);
    Inc(iangle,iangleInc);
  until (iangle>iangleTo) or (bAutotestStop=true);
  pbBlobRepositioning2Automatictest.Visible:=false;
  cmdBlobRepositioning2AutomatictestStop.Visible:=false;
  bAutotestStop:=false;
 end;
end;

procedure TMainForm.cmdBlobRepositioningAutomatictestStopClick(
  Sender: TObject);
begin
  bAutotestStop:=true;
end;

procedure TMainForm.sbGradientAnisotropicDiffusionConductanceChange(
  Sender: TObject);
begin
  txtGradientAnisotropicDiffusionConductance.Text := FloatToStr(sbGradientAnisotropicDiffusionConductance.Position/10);
  txtGradientAnisotropicDiffusionIteration.Text := FloatToStr(sbGradientAnisotropicDiffusionIteration.Position);
  Test;
end;

procedure TMainForm.sbRescaleIntensityChange(Sender: TObject);
begin
  if sbRescaleIntensityMinimum.Position>sbRescaleIntensityMaximum.Position then begin
    sbRescaleIntensityMinimum.Position:=sbRescaleIntensityMaximum.Position;
  end else begin
    txtRescaleIntensityMinimum.Text:=IntToStr(sbRescaleIntensityMinimum.Position);
    txtRescaleIntensityMaximum.Text:=IntToStr(sbRescaleIntensityMaximum.Position);
    Test;
  end;
end;

procedure TMainForm.cmdWavesStepClick(Sender: TObject);
begin
  isWavesSimpleRun := true ;
  Test ;
  isWavesSimpleRun := false ;
end;
procedure TMainForm.cbGradientAnisotropicDiffusionMethodChange(
  Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbSigmoidMinimumChange(Sender: TObject);
begin
  txtSigmoidMinimum.Text:=IntToStr(sbSigmoidMinimum.Position);
  txtSigmoidMaximum.Text:=IntToStr(sbSigmoidMaximum.Position);
  txtSigmoidAlpha.Text:=FloatToStr(sbSigmoidAlpha.Position/10);
  txtSigmoidBeta.Text:=IntToStr(sbSigmoidBeta.Position);
  Test;
end;

procedure TMainForm.sbBilateralDomainsigmaChange(Sender: TObject);
begin
  txtBilateralDomainsigma.Text := FloatToStr(sbBilateralDomainsigma.Position/10);
  txtBilateralRangesigma.Text := FloatToStr(sbBilateralRangesigma.Position/10);
  Test;
end;


procedure TMainForm.ApplicationEventsIdle(Sender: TObject;
  var Done: Boolean);
begin
  if (chkWavesContinue.Checked) and (panelActif=pWaves) then Begin
    isWavesSimpleRun := true ;
    Test ;
    isWavesSimpleRun := false ;
  end ;
end;

procedure TMainForm.sbCorrelationRangeMinChange(Sender: TObject);
begin
  if sbCorrelationRangeMin.Position>sbCorrelationRangeMax.Position then begin
    sbCorrelationRangeMin.Position:=sbCorrelationRangeMax.Position;
  end else begin
    txtCorrelationRangeMin.Text:=IntToStr(sbCorrelationRangeMin.Position);
    txtCorrelationRangeMax.Text:=IntToStr(sbCorrelationRangeMax.Position);
    Test;
  end;
end;

procedure TMainForm.chkCorrelationMonitoringClick(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.cbHistogramFeatureChange(Sender: TObject);
begin
  Test
end;

procedure TMainForm.cmdImageLoaderLoadClick(Sender: TObject);
begin
  Test;
  if lstImageLoaderViewImage.Items.Count>0 then begin
    lstImageLoaderViewImage.Selected[0] := True;
    lstImageLoaderViewImageClick( Self );
  end;
end;

procedure TMainForm.cmdImageLoaderOpenClick(Sender: TObject);
var
  i : Integer;
  filesname : String;
begin
  if dlgImageLoaderOpen.Execute then Begin
    filesname := '';
    for i:=0 to dlgImageLoaderOpen.Files.Count-1 do begin
        if i>0 then filesname:=filesname+';';
        filesname := filesname + dlgImageLoaderOpen.Files.Strings[i];
    end;
    txtImageLoaderFiles.Text := filesname;
  end;
end;

procedure TMainForm.lstImageLoaderViewImageClick(Sender: TObject);
var
  images : PArrayOfPBitmap32 ;
begin
  images := getOutputImages(filterImageLoader,'outImages');
  if (images<>nil) and (Length(images^) > lstImageLoaderViewImage.ItemIndex) then Begin
    image1 := images^[lstImageLoaderViewImage.ItemIndex];
    if image1 <> nil Then Begin
      imageOut:=image.eraseOrCreateImageLike(imageOut,image1);
      image.copyImageToImage(image1,imageOut);
      imageIOVideo.showImage(image1, ViewerImageOut);
    end;
  end else Begin
    Test;
  End;
end;

procedure TMainForm.cmdImageSaverSaveClick(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.cmdImageSaverSelectClick(Sender: TObject);
begin
  if dlgImageSaverSelect.Execute then begin
    txtImageSaverFilename.Text := dlgImageSaverSelect.FileName ;
  end;
end;

procedure TMainForm.sbProjectionLinePreprocessingBlobIndexChange(
  Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbProjectionLineSmoothChange(Sender: TObject);
begin
  txtProjectionLineSmooth.Text:=IntToStr(sbProjectionLineSmooth.Position);
  Test;
end;

procedure TMainForm.sbProjectionLinePreprocessingSimulateAngleChange(
  Sender: TObject);
begin
  txtProjectionLinePreprocessingSimulateAngle.Text := FloatToStrF(sbProjectionLinePreprocessingSimulateAngle.Position/10,ffFixed,4,1);
  Test;
end;

procedure TMainForm.rgProjectionLineInputClick(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbVectorHistogramPreprocessingAngleChange(
  Sender: TObject);
begin
  txtVectorHistogramPreprocessingAngle.Text := FloatToStrF(sbVectorHistogramPreprocessingAngle.Position/10,ffFixed,4,1);
  Test;
end;

procedure TMainForm.sbBlobBalancePreprocessingAngleChange(Sender: TObject);
begin
  txtBlobBalancePreprocessingAngle.Text := FloatToStrF(sbBlobBalancePreprocessingAngle.Position/10,ffFixed,4,1);
  Test;
end;

procedure TMainForm.sbBlobBalancePreprocessingBlobIndexChange(
  Sender: TObject);
begin
  Test;
end;

procedure TMainForm.chkBlobBalanceMonitoringClick(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.cmdBlobBalanceSetAngleToZeroClick(Sender: TObject);
begin
  runCommand(filterBlobBalance,'setAngleToZero');
  Test;
end;

procedure TMainForm.txtBlobRepositioningBlobThresholdChange(
  Sender: TObject);
begin
  txtBlobRepositioningBlobThreshold.Text:=IntToStr(sbBlobRepositioningBlobThreshold.Position);
  Test;
end;

procedure TMainForm.sbBlobRepositioningBlobChange(
  Sender: TObject);
begin
  txtBlobRepositioningBlobThreshold.Text:=IntToStr(sbBlobRepositioningBlobThreshold.Position);
  txtBlobRepositioningBlobAreaMin.Text:=IntToStr(Sqr(sbBlobRepositioningBlobAreaMin.Position));
  txtBlobRepositioningBlobAreaMax.Text:=IntToStr(Sqr(sbBlobRepositioningBlobAreaMax.Position));
  txtBlobRepositioning2BlobThreshold.Text:=IntToStr(sbBlobRepositioning2BlobThreshold.Position);
  txtBlobRepositioning2BlobAreaMin.Text:=IntToStr(Sqr(sbBlobRepositioning2BlobAreaMin.Position));
  txtBlobRepositioning2BlobAreaMax.Text:=IntToStr(Sqr(sbBlobRepositioning2BlobAreaMax.Position));
  Test;
end;

procedure TMainForm.cmdBlobRepositioning2LearnClick(Sender: TObject);
begin
  blobRepositioning2LearnedAngle:=StrToFloat(txtBlobRepositioning2SimulateAngle.Text);
  runCommand(filterBlobRepositioning2,'learn');
  Test;
end;

function TMainForm.calculAngleError(angleCurrent,angleOnLearn,computedAngle:Single) : Single;
begin
  Result:=(angleCurrent-angleOnLearn)+computedAngle;
  if Result>180 then Result:=Result-360;
  if Result<-180 then Result:=Result+360;
end;

procedure TMainForm.sbHelpClick(Sender: TObject);
var
  f : String;
begin
  with MemoHelp do begin
   if Visible=False then begin
    Visible := True;
    Align := alClient;
    with Lines do begin
      Clear();
      Add('(right click mouse to close this help)');
      Add('');
      if lbFiltersClassic.ItemIndex<0 then begin
        Add('This is a small help to show you main functions of each filters');
        Add(' - first thing to do : choose a filter in the list');
        Add(' - then you will obtain help for this filter');
        Add(' - at any time you can show/hide help of a filter by right clicking on it');
        Add('');
        Add('User interface informations :');
        Add(' - you can execute a filter by double clicking on it');
        Add(' - you can copy imageOut 1 or 2 into imageIn by double clicking on it');
        Add(' - you can see filter''s execution time in milliseconds');
        Add(' - with some filter you can use ROI (Region Of Interest)');
        Add(' - you can use the magnifying or the 3D viewer tool on imageOut 1');
        Add(' - you can use a filter in real time with your camera');
        Add('   (button [live], mode [auto process])');
        Add('');
        Add('''FiltersTest'' use the open source image processing library ''Filters''.');
        Add('');
        Add('  see the web site :    http://filters.sourceforge.net');
      end else begin
        if (lbFiltersPlugins.Visible=True) and (lbFiltersPlugins.ItemIndex>=0) then f := lbFiltersPlugins.Items[lbFiltersPlugins.ItemIndex]
        else f := lbFiltersClassic.Items[lbFiltersClassic.ItemIndex];
        if f='ArithmeticAdd' then begin
          Add('filter [ArithmeticAdd]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - execute filter [Adjust] with :');
          Add('   - [contrast] to the max');
          Add('   - [brightness] to the min');
          Add(' - return to this filter [ArithmeticAdd] and execute it');
          Add('-> the output is on imageOut2 : it''s the sum of imageIn and imageOut1');
        end else if f='ArithmeticConstantAdd' then begin
          Add('filter [ArithmeticConstantAdd]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - change [constant]');
          Add(' - set [overflowingMode] to [WRAP_AROUND_ZERO]');
          Add(' - change [constant]');
          Add('-> the output is on imageOut1');
        end else if f='ArithmeticSubstract' then begin
          Add('filter [ArithmeticSubstract]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - execute filter [blur]');
          Add(' - return to this filter [ArithmeticSubstract] and execute it');
          Add('-> the output is on imageOut2 : you can see the change provide by the blur filter');
          Add(' - set [mode] to [SUBSTRACT]');
          Add('-> the output is on imageOut2 : you have a quite nice contour');
        end else if f='Compare' then begin
          Add('filter [Compare]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - execute filter [Blur], with [radius] = 200');
          Add(' - return to this filter [Compare] and execute it');
          Add('-> the output is on imageOut2 : you can see the Minimal intensity between both original and blured Lenna');
          Add(' - set [mode] to [MAX]');
          Add('-> the output is on imageOut2 : you can see the Maximal intensity between both original and blured Lenna');
        end else if f='BlobBalance' then begin
          Add('filter [BlobBalance]');
          Add('');
          Add('Example :');
          Add(' - open image [blob2.tif]');
          Add(' - execute filter [blobExplorer] with :');
          Add('   - [background] to 100');
          Add(' - return to this filter [blobBalance] and execute it');
          Add('-> the monitoring output is on imageOut1 : you can see the left and right gravity center');
          Add('-> the output is the angle of the line who crosses both gravity center / horizontal');
          Add(' - change [filter rotation angle] to simulate a rotation');
        end else if f='BlobExplorer' then begin
          Add('filter [BlobExplorer]');
          Add('');
          Add('Example 1 :');
          Add(' - open image [blob1.bmp]');
          Add(' - execute');
          Add('-> the output is on imageOut1 : you can see all extracted blobs (one color for each)');
          Add(' - set [area min] to 100');
          Add('-> the output is blobs of pixels area >= 100');
          Add('Example 2 :');
          Add(' - open image [circuit.bmp]');
          Add(' - execute filter [contrastExplorer]');
          Add(' - click on imageOut1 to copy it to imageIn');
          Add(' - return to this filter [blobExplorer] and execute it');
          Add(' - change [area min] and [area max]');
          Add('Example 3 :');
          Add(' - open image [blob2.tif]');
          Add(' - set [background] to 100');
          Add(' - check [calcul blob surface info]');
          Add('-> the output is the extracted blob with the surrounding rectangle in blue and the center of gravity in red');
          Add(' - check [critical points]');
          Add('-> the output shown the pixels of blob''s contour');
          Add(' - change [approximation accuracy] to change the contours pixels precision');
        end else if f='BlobGrouping' then begin
          Add('filter [BlobGrouping]');
          Add('');
          Add('Example :');
          Add(' - open image [blob1.bmp]');
          Add(' - execute filter [blobExplorer]');
          Add('-> the output is on imageOut1 : you can see all extracted blobs (one color for each)');
          Add(' - execute filter [blobGrouping]');
          Add('-> the output is on imageOut1 : all blobs of the same averaged intensity are grouped together, regardless of the pixel connectivity');
          Add('     (in this simple example, all blobs are grouped in one white blob)');
        end else if f='BlobRepositioning' then begin
          Add('filter [BlobRepositioning]');
          Add('');
          Add('Example :');
          Add(' - open image [blob2.tif]');
          Add(' - on tab [parameters], set [blob background threshold] to 100');
          Add(' - click [learn]');
          Add(' - on tab [preprocessing], change [filter rotation angle]');
          Add('-> the output is on imageOut1 : you can see the extracted blob, in always the same learned position');
        end else if f='BlobRepositioning2' then begin
          Add('filter [BlobRepositioning2]');
          Add('');
          Add('Example :');
          Add(' - open image [blob2.tif]');
          Add(' - on tab [parameters], set [blob background threshold] to 100');
          Add(' - click [learn]');
          Add(' - on tab [preprocessing], change [filter rotation angle]');
          Add('-> the output is on imageOut1 : you can see the extracted blob, in always the exactly same learned position');
        end else if f='Blur' then begin
          Add('filter [Blur]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - click on the viewer tools [magnify] (to the right of imageOut2)');
          Add(' - left click on the magnify rectangle and move it near the eyes of lenna');
          Add(' - right click on the magnify rectangle to increase it, to have the entire face of lenna');
          Add(' - set [blur] to 0');
          Add('-> the output is on imageOut1 : you can see the original image');
          Add(' - change [blur]');
          Add('-> the output is on imageOut1 : you can see the blurred image');
          Add(' - click type [fast anisotropic]');
          Add(' - change [blur]');
          Add('-> the output is on imageOut1 : you can see the blurred image but with details preserved');
        end else if f='CellOnOff' then begin
          Add('filter [CellOnOff]');
          Add('');
        end else if f='Copy' then begin
          Add('filter [Copy]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - execute');
          Add('-> the output is on imageOut1 : you can see a copy of the original image');
          Add(' - check [use ROI] (Region Of Interest)');
          Add(' - left click on the ROI rectangle and move it near the eyes of lenna');
          Add(' - right click on the ROI rectangle to increase it, to have the entire face of lenna');
          Add('-> the output is on imageOut1 : you can see a copy of your ROI');
        end else if f='ContrastExplorer' then begin
          Add('filter [ContrastExplorer]');
          Add('');
          Add('Example 1 :');
          Add(' - open image [circuit.bmp]');
          Add(' - execute');
          Add('-> the output is on imageOut1 : you can see all local pixel difference');
          Add('Example 2 :');
          Add(' - open image [mire.jpg]');
          Add(' - execute');
          Add(' - change [precision]');
        end else if f='Convolutions' then begin
          Add('filter [Convolutions]');
          Add('');
          Add('Example :');
          Add(' - open image [mire.jpg]');
          Add(' - execute');
          Add(' - click on a matrix');
          Add('-> the output is on imageOut1 : you can see the matrix convolution applied on original image');
        end else if f='CoOccurrenceMatrix' then begin
          Add('filter [CoOccurrenceMatrix]');
          Add('');
          Add('Example :');
          Add(' - open image [blob2.tif]');
          Add('-> the output is on imageOut1 : you can see the co-occurence matrix (column is the occurence of the same value of pixel_1 and pixel_2, with value is according to the analyse choosen, and horizontal/vertical distance is the distance between this two pixel)');
          Add('     the value choosen for the X analyse is the column of the matrix');
          Add('     the value choosen for the Y analyse is the row of the matrix');
          Add('Example 2 :');
          Add(' - do example 1');
          Add(' - change [scale] to the maximum [350]');
          Add(' - click on [ROI on result]');
          Add(' - right click on the ROI on result, and enlarge it');
          Add('-> on imageOut2 you can see a segmentation of the white object');
        end else if f='DistancesMap' then begin
          Add('filter [DistanceMap]');
          Add('');
          Add('Example :');
          Add(' - open image [dcirc.bmp]');
          Add(' - execute');
          Add(' - change [post processing]');
          Add('-> the output is on imageOut1 : you can see the distance map');
        end else if f='Envelope' then begin
          Add('filter [Envelope]');
          Add('');
          Add('Example :');
          Add(' - open image [blob1.bmp]');
          Add(' - click on [outputs ENVELOPE_MIN]');
          Add('-> the output is on imageOut1 : you can see the minimal intensity envelope');
          Add(' - click on [outputs ENVELOPE_MAX]');
          Add('-> you can see the maximal intensity envelope');
          Add('(you can use the viewer tool [Explorer X/Y] to see more precisely the advantage of this filter)');
        end else if f='Explorer' then begin
          Add('filter [Explorer]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - click on imageIn on the eye of lenna');
          Add(' - the output imageOut1 show the horizontal pixels values');
          Add(' - the output imageOut2 show the vertical pixels values');
        end else if f='GranularityExplorer' then begin
          Add('filter [GranularityExplorer]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - set [precision] to 2');
          Add(' - set [sensibility] to max');
          Add('-> the output is on imageOut1 : you can see the high granularity zone of the image');
        end else if f='Invert' then begin
          Add('filter [Invert]');
          Add('');
          Add('Example :');
          Add(' - open image [dcirc.bmp]');
          Add(' - execute');
          Add('-> the output is on imageOut1 : you can see the inverted image');
        end else if f='Resize' then begin
          Add('filter [Resize]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - set [scale factor] to 30%');
          Add(' - set [mode] to [fast blur]');
        end else if f='LocalDeviation' then begin
          Add('filter [LocalDeviation]');
          Add('');
        end else if f='NonMaximaSuppression' then begin
          Add('filter [NonMaximaSuppression]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - execute filter [sobel]');
          Add(' - click on imageOut1 to copy it to imageIn');
          Add(' - return to this filter [NonMaximaSuppression]');
          Add(' - set [output color] to [UNCHANGED]');
          Add(' - change [precision]');
          Add('-> the output is on imageOut1 : you can see some interesting pixels');
        end else if f='Morphology' then begin
          Add('filter [Morphology]');
          Add('');
          Add('Example :');
          Add(' - open image [blox.bmp]');
          Add(' - set [iteration] to 3');
          Add(' - change [type]');
          Add('-> the output is on imageOut1 : you can see some  morphological operations');
        end else if f='Histogram' then begin
          Add('filter [Histogram]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - execute');
          Add(' - change [precision]');
          Add('-> the output is on imageOut1 : you can see the global pixel histogram of the image');
          Add(' - check [use ROI] (Region Of Interest)');
          Add(' - left click on the ROI rectangle and move it');
          Add('-> the output is on imageOut1 : you can see the local pixel histogram of the ROI');
        end else if f='HistogramContrast' then begin
          Add('filter [HistogramContrast]');
          Add('');
        end else if (f='Pyramid') or (f='Normalize') or (f='StackMasher') or (f='StackProcessor') then begin
          Add('filter [Pyramid], [Normalize], [StackMasher], [StackProcessor]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - change [pyramid] image to show');
          Add(' - click on filter [Susan]');
          Add(' - change [pyramid] image to show');
          Add(' - click on filter [Blur]');
          Add(' - check [normalize]');
          Add(' - set [pyramid] image to show to first image');
          Add(' - change [use one pyramid output image as reference]');
          Add(' - check [merge all images in one]');
          Add(' - change [use one pyramid output image as reference]');
        end else if f='StandardDeviation' then begin
          Add('filter [StandardDeviation]');
          Add('');
          Add('Example :');
          Add(' - open image [blob2.tif]');
          Add(' - set [threshold] to 90');
          Add(' - set [output color] to UNCHANGED');
          Add(' - try with [use ROI]');
        end else if f='Sobel' then begin
          Add('filter [Sobel]');
          Add('');
          Add('Example :');
          Add(' - open image [suzan.jpg]');
          Add(' - execute');
        end else if f='SUSAN' then begin
          Add('filter [SUSAN]');
          Add('');
          Add('Example :');
          Add(' - open image [suzan.jpg]');
          Add(' - change [mode]');
        end else if f='SPV' then begin
          Add('filter [SparsePixelVectorization]');
          Add('');
          Add('Example 1 :');
          Add(' - open image [line1.bmp]');
          Add(' - set [polygonal approximation] to [1]');
          Add(' - set [show vector width] to [true]');
          Add(' - set [scan line increment] to [7]');
          Add(' - set [monitoring] to [polygonal approximation]');
          Add(' - change [polygonal approximation]');
          Add('Example 2 :');
          Add(' - open image [suzan.jpg]');
          Add(' - execute filter [sobel]');
          Add('   - click on imageOut1 to copy it to imageIn');
          Add(' - return to this filter [SPV] and execute it');
        end else if f='ThresholdBinary' then begin
          Add('filter [ThresholdBinary]');
          Add('');
          Add('Example :');
          Add(' - open image [blob2.tif]');
          Add(' - set [lower] to 0');
          Add(' - set [upper] to 100');
          Add(' - click [Low Black]');
          Add(' - click [Middle Black]');
          Add(' - click [High White]');
        end else if f='Wavelets' then begin
          Add('filter [Wavelets]');
          Add('');
        end else if f='Waves' then begin
          Add('filter [Waves]');
          Add('');
        end else if f='Cutter' then begin
          Add('filter [Cutter]');
          Add('');
          Add('Example :');
          Add(' - open image [suzan.jpg]');
          Add(' - execute');
          Add(' - change [out images]');
          Add('-> the output is on imageOut1 : you can see all extracted images with method [TILES]');
          Add(' - change [rect height] and [rect width]');
          Add('-> the output monitoring is on imageOut2 : you can see rectangles used to cut original image');
          Add(' - set [type] to [BLOB]');
          Add(' - change [out images]');
          Add('-> the output is on imageOut1 : you can see all extracted blob''s image with method [BLOB]');
          Add(' - set [margin] to 50');
          Add(' - check and uncheck [clean]');
          Add('-> the output is on imageOut1 : you can see only blob''s pixel or the original corresponding image');
        end else if f='Canny' then begin
          Add('filter [Canny]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - change [threshold 1]');
        end else if f='Contour' then begin
          Add('filter [Contour]');
          Add('');
          Add('Example :');
          Add(' - open image [blob2.tif]');
          Add(' - set [threshold] to 100');
          Add('-> the output is on imageOut1 : you can see the extracted contour');
          Add(' - check [critical points]');
          Add(' - change [approximation accuracy]');
          Add('-> the output is on imageOut1 : you can see pixelsin red of the extracted contour');
        end else if f='LogPolar' then begin
          Add('filter [LogPolar]');
          Add('');
          Add('Example :');
          Add(' - open image [suzan.jpg]');
          Add(' - check [use ROI] (Region Of Interest)');
          Add(' - check [show ROI]');
          Add(' - left click on the ROI rectangle and move it');
          Add('-> the output is on imageOut1 : you can see precise image near the ROI');
        end else if f='Adjust' then begin
          Add('filter [Adjust]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - set [contrast] to the max');
          Add(' - set [brightness] to the max');
          Add('-> the output is on imageOut1');
        end else if f='ImageInfo' then begin
          Add('filter [ImageInfo]');
          Add(' - click button [process]');
          Add('-> the output is the [min] and [max] value : you can see that this image don''t use intensity less than 10.');
          Add('Example :');
          Add(' - open image [microbubbles.tif]');
        end else if f='Median' then begin
          Add('filter [Median]');
          Add('');
          Add('Example :');
          Add(' - open image [blob2.tif]');
          Add(' - change [precision]');
          Add('-> the monitoring output is on imageOut1 : you can see the image with only median pixel');
        end else if f='Means' then begin
          Add('filter [Means]');
          Add('');
          Add('Example :');
          Add(' - open image [blob2.tif]');
          Add(' - change [precision]');
          Add('-> the output is on imageOut1 : each pixel is the mean of it''s neighbors');
        end else if f='Log' then begin
          Add('filter [Log]');
          Add('');
          Add('Example :');
          Add(' - open image [texture.jpg]');
          Add(' - click button [process]');
          Add('-> the output is on imageOut1 : dark pixel are now more visible');
        end else if f='Rotation' then begin
          Add('filter [Rotation]');
          Add('');
          Add('Example 1 :');
          Add(' - open image [blob2.tif]');
          Add(' - click on imageIn in the center of the first left hole of the object');
          Add(' - check [monitoring]');
          Add(' - uncheck [auto adjust size]');
          Add(' - change [angle]');
          Add('-> the output is on imageOut1 : you can see the rotated image centered on the hole');
          Add('Example 2 :');
          Add(' - open image [circle1.bmp]');
          Add(' - set [interpolation] to [nearest neighbor]');
          Add(' - set [angle] to 5°');
          Add(' - check [auto adjust size]');
          Add(' - execute');
          Add(' - click on imageOut1 to copy it to imageIn');
          Add(' - execute');
          Add(' - click on imageOut1 to copy it to imageIn');
          Add(' - ...');
          Add(' - now reopen image [circle1.bmp]');
          Add(' - set [interpolation] to [linear]');
          Add(' - execute');
          Add(' - click on imageOut1 to copy it to imageIn');
          Add(' - execute');
          Add(' - click on imageOut1 to copy it to imageIn');
          Add(' - ...');
          Add('-> you see the difference ?');
        end else if f='Integration' then begin
          Add('filter [Integration]');
          Add('');
        end else if f='VectorHistogram' then begin
          Add('filter [VectorHistogram]');
          Add('');
          Add('Example :');
          Add(' - open image [blob2.tif]');
          Add(' - execute filter [blobExplorer] with :');
          Add('   - [background] to 100');
          Add(' - return to this filter [VectorHistogram] and execute it');
          Add('-> the monitoring output is on imageOut1 : you can see the vector histogram of the blob''s contour segments');
          Add(' - change [filter rotation angle] to simulate a rotation');
        end else if f='Correlation' then begin
          Add('filter [Correlation]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - execute filter [blobExplorer] with :');
          Add('   - check [use ROI] (Region Of Interest)');
          Add('   - left click on the ROI rectangle and move it near the eyes of lenna');
          Add(' - return to this filter [Correlation]');
          Add('-> now we have 2 images : imageIn=[full lenna] and imageOut1=[an eye of lenna]');
          Add(' - uncheck [use ROI]');
          Add(' - click on different position in imageIn to set different center of both image');
          Add('-> the output monitoring is on imageOut2 : you can see both images');
          Add('-> the output is the value [normalized correlation] : if you reposition exactly the eye, you will obtain a full correlation (=1)');
        end else if f='GradientAnisotropicDiffusion' then begin
          Add('filter [GradientAnisotropicDiffusion]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - click on the viewer tools [magnify] (to the right of imageOut2)');
          Add(' - left click on the magnify rectangle and move it near the eyes of lenna');
          Add(' - right click on the magnify rectangle to increase it, to have the entire face of lenna');
          Add(' - set [conductance] to 0');
          Add('-> the output is on imageOut1 : you can see the original image');
          Add(' - change [conductance]');
          Add('-> the output is on imageOut1 : you can see the blurred image with method [fats blur anisotropic]');
          Add(' - set [method] to [standard in grey level]');
          Add('-> the output is on imageOut1 : you can see the blurred image with the standard anisotropic method');
        end else if f='RescaleIntensity' then begin
          Add('filter [RescaleIntensity]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - set [intensity minimum] to 0');
          Add(' - set [intensity maximum] to 10');
          Add(' - click on imageOut1 to copy it to imageIn');
          Add(' - set [intensity maximum] to 255');
        end else if f='Sigmoid' then begin
          Add('filter [Sigmoid]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - set [intensity minimum] to 0');
          Add(' - set [intensity maximum] to 255');
          Add(' - set [beta] to 120');
          Add(' - change [alpha]');
        end else if f='SmoothBilateral' then begin
          Add('filter [SmoothBilateral]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - set [domain sigma] to 3');
        end else if f='ImageCreator' then begin
          Add('filter [ImageCreator]');
          Add('');
          Add('Example :');
          Add(' - enter in [command] this string : [createMask( 10, 10, ''maskCross'' ) ]');
          Add('-> the output is on imageOut1 : you can see the created image');
        end else if f='ImageLoader' then begin
          Add('filter [ImageLoader]');
          Add('');
          Add('Example :');
          Add(' - click [select], then choose all images files, and click [ok]');
          Add(' - click [load]');
          Add(' - change [view]');
          Add('-> the output is on imageOut1 : you can see the loaded image');
        end else if f='ImageSaver' then begin
          Add('filter [ImageSaver]');
          Add('');
          Add('Example :');
          Add(' - open image [lenna.jpg]');
          Add(' - execute filter [resize] with :');
          Add('   - set [scale factor] to 50%');
          Add(' - return to this filter [imageSaver]');
          Add(' - set [Image] to [out 1]');
          Add(' - click [select], then enter a file name, and click [ok]');
          Add(' - click [save]');
          Add('-> the output is in the file : you can open it to verify');
        end else if f='ProjectionLine' then begin
          Add('filter [ProjectionLine]');
          Add('');
          Add('Example :');
          Add(' - open image [blob2.tif]');
          Add(' - execute filter [blobExplorer] with :');
          Add('   - set [background] to 100');
          Add(' - return to this filter [ProjectionLine]');
          Add(' - set [input is] to [segment]');
          Add(' - set [smooth] to [50]');
          Add(' - change [filter rotation angle]');
          Add('-> the output is on imageOut1 : you can see the vertical projection of the blob''s pixel segemts');
        end else if f='StackAnalyser' then begin
          Add('filter [StackAnalyser]');
          Add('');
          Add('Example :');
          Add(' - to test this filter we create a stack of images with the inImage blured');
          Add('-> you can see this stack in outImage2');
          Add(' - click on [analyse AVERAGE]');
          Add('-> the output is on imageOut1 : you can see the average of all images in the stack');
        end else if f='StackCreator' then begin
          Add('filter [StackCreater]');
          Add('');
          Add('Example :');
          Add(' - select filter [stackCreator]');
          Add(' - at the right of the button [live], choose your camera (you need a camera or a webcam for this demo)');
          Add(' - click on button [live] ');
          Add(' - check mode [auto process] to on');
          Add('-> at each process execution, a image is captured and pushed in the stack');
          Add('-> the monitoring output is on imageOut1 : you can see the one image that is in the stack');
          Add('-> you can see a delay between the image captured by your camera and the image seen in imageOut');
        end else if f='HoughTransform' then begin
          Add('filter [HoughTransform]');
          Add('');
          Add('Example :');
          Add(' - open image [sphere.bmp]');
          Add('-> the monitoring output is on imageOut1 : you can see that lines are perfectly square !');
        end else if f='RGB' then begin
          Add('filter [RGB]');
          Add('');
          Add('Example :');
          Add(' - open image [mire.JPG]');
          Add(' - change [constant R] to -255');
          Add('-> the output is on imageOut1 : you can see the image without the red channel');
        end else if f='FiltersPlugin_TestDelphi' then begin
          Add('filter [FiltersPlugin_TestDelphi]');
          Add('');
          Add('It''s a filter, written in language Delphi, to test the Filters Plugin API, and it do nothing more...');
          Add('-> the output are on imageOut1 and imageOut2');
        end else if f='FiltersPlugin_TestC' then begin
          Add('filter [FiltersPlugin_TestC]');
          Add('');
          Add('It''s a filter, written in language C/C++, to test the Filters Plugin API, and it do nothing more...');
          Add('-> the output are on imageOut1 and imageOut2');
        end else if f='FiltersPlugin_Video' then begin
          Add('filter [FiltersPlugin_Video]');
          Add('');
          Add('Example :');
          Add(' - click [select...], and choose the video [OK_320_1.avi]');
          Add(' - click on the checkbox [show viewer]');
          Add(' - click [LOAD]');
          Add(' - click [PLAY]');
          Add('-> you can see the playing video in the window');
          Add('-> to load and process a filter on a video, then open the video with the help of the tool [Video] of FiltersTest menu (it you FiltersPlugin_Video internaly)');
        end else if f='FiltersPlugin_Viewer' then begin
          Add('filter [FiltersPlugin_Viewer]');
          Add('');
          Add('Example :');
          Add(' - click on the checkbox [show viewer]');
          Add('-> you can see the image imageOut1 in the window');
        end else if f='FiltersPlugin_SnapShot' then begin
          Add('filter [FiltersPlugin_SnapShot]');
          Add('');
          Add('Example :');
          Add('-> you can see snapshot of Windows desk');
        end else if f='FiltersPlugin_WebCam' then begin
          Add('filter [FiltersPlugin_WebCam]');
          Add('');
          Add('Example :');
          Add(' - click [read devices]');
          Add(' - choose your camera');
          Add(' - click [read formats of device]');
          Add(' - choose a format');
          Add(' - click on the checkbox [open/close device (...)]');
          Add(' - click on the checkbox [show viewer]');
          Add('-> you can see the images from your camera');
          Add('-> to process a filter on images from a camera, you have to prefer tool [WebCam] of FiltersTest menu (it you FiltersPlugin_WebCam internaly)');
        end;
      end;
    end;
   end else begin
    Visible := False;
   end;
  end;
end;

procedure TMainForm.MemoHelpMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbRight then begin
    MemoHelp.Visible:=False;
  end;
end;

procedure TMainForm.chkPyramidSmasherClick(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.lbFiltersClassicMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbRight then begin
    sbHelpClick(Self);
  end;
end;

procedure TMainForm.lstMorphologyTypeClick(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbBlobGroupingIntensityPrecisionChange(
  Sender: TObject);
begin
  txtBlobGroupingIntensityPrecision.Text:=IntToStr(sbBlobGroupingIntensityPrecision.Position);
  Test;
end;

procedure TMainForm.chkStandardDeviationShowOnlyROIClick(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbExplorerPrecisionChange(Sender: TObject);
begin
  txtExplorerPrecision.Text:=IntToStr(sbExplorerPrecision.Position);
  Test;
end;

procedure TMainForm.chkBlobRepositioning2BackgroundColorClick(
  Sender: TObject);
begin
  Test;
end;

procedure TMainForm.txtImageCreatorCommandKeyPress(Sender: TObject;
  var Key: Char);
begin
  if Key=#13 then Test;
end;

procedure TMainForm.initPanelImageCreator;
var
  cstr, cstr2 :  array[0..1024] of char;
  parametersCount, p : Integer;
begin
  txtImageCreatorHelp.Lines.Clear;
  parametersCount := getParametersCount( filterImageCreator );
  for p:=0 to parametersCount-1 do begin
    getParameterName( filterImageCreator, p, cstr );
    getParameterHelp( filterImageCreator, p, cstr2 );
    txtImageCreatorHelp.Lines.Add( '[' + StrPas( cstr ) + '] > ' +StrPas( cstr2 ) );
  end;
end;

procedure TMainForm.rgrpMorphoSEClick(Sender: TObject);
begin
  updateMorphologySE();
  Test;
end;

procedure TMainForm.updateMorphologySE;
var
  SE_size : Integer;
  r, c : Integer;
  value : TColor32;
begin
  SE_size := sbMorphologySE_size.Position;
  case rgrpMorphoSE.ItemIndex of
    0 : // custom
    begin
      if SE_size<>morphoSE.Width then begin
        morphoSE := image.createImage( SE_size, SE_size );
      end;
    end;
    1 : // disk
    begin
      image.freeImage( morphoSE );
      morphoSE := fmask.createMask( SE_size, SE_size, maskDisk );
    end;
    2 : // filled
    begin
      image.freeImage( morphoSE );
      morphoSE := fmask.createMask( SE_size, SE_size, maskFilled );
    end;
    3 : // cross
    begin
      image.freeImage( morphoSE );
      morphoSE := fmask.createMask( SE_size, SE_size, maskCross );
    end;
    4 : // empty
    begin
      morphoSE := image.createImage( SE_size, SE_size );
    end;
  end;
  gridMorphologySE.ColCount := SE_size;
  gridMorphologySE.RowCount := SE_size;
  for r:=0 to SE_size-1 do begin
    for c:=0 to SE_size-1 do begin
      gridMorphologySE.Cells[c,r] := '';
      value := image.getPixel( morphoSE, c, r );
      if value<>0 then begin
        gridMorphologySE.Cells[c,r] := 'X';
      end;
    end;
  end;
end;

procedure TMainForm.gridMorphologySEMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  col, row: Longint;
  value : TColor32;
begin
  gridMorphologySE.MouseToCell(X, Y, col, row);
  if Button=mbLeft then value := clWhite32 else value := 0;
  image.setPixel( morphoSE, col, row, value );
  updateMorphologySE();
  Test;
end;

procedure TMainForm.gridMorphologySEMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
var
  col, row: Longint;
  value : TColor32;
begin
  if (ssLeft in Shift) or (ssRight in Shift)	then begin
    gridMorphologySE.MouseToCell(X, Y, col, row);
    if ssLeft in Shift then value := clWhite32 else value := 0;
    image.setPixel( morphoSE, col, row, value );
    updateMorphologySE();
    Test;
  end;
end;

procedure TMainForm.cbContrastExplorerModeChange(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.sbCooccurenceHorSizeChange(Sender: TObject);
begin
  txtHorCoSize.Text:=IntToStr(sbCooccurenceHorSize.Position);
  txtVerCoSize.Text:=IntToStr(sbCooccurenceVerSize.Position);
  txtCoocurrenceScale.Text := IntToStr(sbCoOccurenceScale.Position);
  Test;
end;

procedure TMainForm.cbCopyOutputColorChange(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.rdCoocurenceClick(Sender: TObject);
begin
  Test ;
end;

procedure TMainForm.chkSobelAngleCalculationClick(Sender: TObject);
begin
  Test;
end;

procedure TMainForm.chkCoocurenceResultROIClik(Sender: TObject);
begin
  shpViewerToolROI.Visible := chkCoocurenceResultROI.Checked ;
  Test ;
end;

procedure TMainForm.sbNonMaximaSuppressionGainChange(Sender: TObject);
begin
  txtNonMaximaSuppressionGain.Text := IntToStr( sbNonMaximaSuppressionGain.Position );
  Test();
end;

procedure TMainForm.chkSusanAngleCalculationClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.sbSusanGainChange(Sender: TObject);
begin
  txtSusanGain.Text := IntToStr(sbSusanGain.Position);
  Test();
end;

procedure TMainForm.ViewerImageOutDblClick(Sender: TObject);
begin
  cmdCopyImageOutClick(Self);
end;

procedure TMainForm.chkCoocurenceShift45Click(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.sbGranularityExplorerDifferenceThresholdChange(
  Sender: TObject);
begin
  txtGranularityExplorerDifferenceThreshold.Text := IntToStr( sbGranularityExplorerDifferenceThreshold.Position );
  Test();
end;

procedure TMainForm.lstStackAnalyserAnalyseClick(Sender: TObject);
var
  images : PArrayOfPBitmap32 ;
begin
  images := getOutputImages( filterStackAnalyser, 'outImages' );
  if (images<>nil) and (length(images^) > lstStackAnalyserAnalyse.ItemIndex) and (lstStackAnalyserAnalyse.ItemIndex<>-1) then begin
    image1 := images^[lstStackAnalyserAnalyse.ItemIndex];
    if image1 <> nil Then Begin
      imageOut := image.eraseOrCreateImageLike( imageOut, image1 );
      image.copyImageToImage( image1, imageOut );
      imageIOVideo.showImage( image1, ViewerImageOut );
    end;
  end else begin
    Test();
  end;
end;

procedure TMainForm.sbStackAnalyserInImagesChange(Sender: TObject);
begin
  if length(imagesInStackAnalyser)=0 then begin
    preprocessStackAnalyser();
  end;
  image2 := imagesInStackAnalyser[sbStackAnalyserInImages.position];
  if image2 <> nil Then Begin
    imageOut2 := image.eraseOrCreateImageLike( imageOut2, image2 );
    image.copyImageToImage( image2, imageOut2 );
    imageIOVideo.showImage( image2, ViewerImageOut2 );
  end;
end;

procedure TMainForm.chkMaskClick(Sender: TObject);
begin
  if chkMask.Checked=False then begin
    image.freeImage( imageMask );
  end;
  Test();
end;

procedure TMainForm.sbStackCreatorImageIndexChange(Sender: TObject);
var
  images : PArrayOfPBitmap32;
begin
  txtStackCreatorImageIndex.Text := IntToStr( sbStackCreatorImageIndex.Position );
  txtStackCreatorStackSize.Text := IntToStr( sbStackCreatorStackSize.Position );
  images := getOutputImages( filterStackCreator, 'outImages' );
  if (images<>nil) and (Length(images^)>0) then begin
    sbStackCreatorImageIndex.Max := Length(images^)-1 ;
    image1 := images^[sbStackCreatorImageIndex.position];
    imageOut := image.eraseOrCreateImageLike(imageOut,image1);
    image.copyImageToImage( image1, imageOut );
    imageIOVideo.showImage(imageOut,ViewerImageOut);
  end;
end;

procedure TMainForm.chkStackCreatorDemoStackAnalyserClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.lstEnvelopeOutputsClick(Sender: TObject);
var
  images : PArrayOfPBitmap32 ;
begin
  images := getOutputImages( filterEnvelope, 'outImages' );
  if (images<>nil) and (length(images^) > lstEnvelopeOutputs.ItemIndex) and (lstEnvelopeOutputs.ItemIndex<>-1) then begin
    image1 := images^[lstEnvelopeOutputs.ItemIndex];
    if image1 <> nil Then Begin
      imageOut := image.eraseOrCreateImageLike( imageOut, image1 );
      image.copyImageToImage( image1, imageOut );
      imageIOVideo.showImage( image1, ViewerImageOut );
    end;
    processViewerTool();
  end else begin
    Test();
  end;
end;

procedure TMainForm.sbEnvelopeSmoothChange(Sender: TObject);
begin
  txtEnvelopeSmooth.Text := IntToStr( sbEnvelopeSmooth.Position );
  Test();
end;

procedure TMainForm.sbMeansPrecisionChange(Sender: TObject);
begin
  txtMeansPrecision.Text := IntToStr( sbMeansPrecision.Position );
  Test();
end;

procedure TMainForm.cbAddModeChange(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.chkAdjustAutoClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.sbLogIntensityMaxChange(Sender: TObject);
begin
  txtLogIntensityMax.Text := IntToStr(sbLogIntensityMax.Position);
  Test();
end;

procedure TMainForm.sbRGBConstantRChange(Sender: TObject);
begin
  txtRGBConstantR.Text:=IntToStr(sbRGBConstantR.Position);
  txtRGBConstantG.Text:=IntToStr(sbRGBConstantG.Position);
  txtRGBConstantB.Text:=IntToStr(sbRGBConstantB.Position);
  Test();
end;

procedure TMainForm.chkBlobExplorerIntensityInvertClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.sbHoughTransformThresholdChange(Sender: TObject);
begin
  txtHoughTransformThreshold.Text:=IntToStr(sbHoughTransformThreshold.Position);
  Test();
end;

procedure TMainForm.cbHoughTransformPreprocessorChange(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.cbBlobExplorerImageToShowChange(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.cbPluginSampleOutputImagesChange(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.txtPluginSampleParameterIntegerChange(Sender: TObject);
begin
  if txtPluginSampleParameterInteger.Text='' then txtPluginSampleParameterInteger.Text:='0';
  if txtPluginSampleParameterFloat.Text='' then txtPluginSampleParameterFloat.Text:='0.0';
  if txtPluginTestC_ParameterInteger.Text='' then txtPluginTestC_ParameterInteger.Text:='0';
  if txtPluginTestC_ParameterFloat.Text='' then txtPluginTestC_ParameterFloat.Text:='0.0';
  Test();
end;

procedure TMainForm.chkPluginSampleParameterBooleanClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.txtImageCreatorHelpDblClick(Sender: TObject);
begin
  txtImageCreatorCommand.Text := txtImageCreatorHelp.SelText ;
  Test;
end;

procedure TMainForm.chkPluginVideoShowViewerClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.cmdPluginVideoFileNameClick(Sender: TObject);
begin
  if dlgPluginVideoOpen.Execute then Begin
    txtPluginVideoFileName.Text := dlgPluginVideoOpen.FileName;
  end;
end;

procedure TMainForm.lstPluginVideoCommandClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.cmdPluginVideoLoadClick(Sender: TObject);
begin
  _runCommand := 'LOAD';
  Test();
end;

procedure TMainForm.cmdPluginVideoPlayClick(Sender: TObject);
begin
  _runCommand := 'PLAY';
  Test();
end;

procedure TMainForm.cmdPluginVideoStopClick(Sender: TObject);
begin
  _runCommand := 'STOP';
  Test();
end;

procedure TMainForm.cmdPluginVideoPauseClick(Sender: TObject);
begin
  _runCommand := 'PAUSE';
  Test();
end;

procedure TMainForm.btnPluginWebCamGetDevicesClick(Sender: TObject);
begin
  _runCommand := 'READ_DEVICES';
  Test();
end;

procedure TMainForm.lbPluginWebCamDevicesClick(Sender: TObject);
begin
  txtPluginWebCamDeviceIndex.Text := IntToStr( lbPluginWebCamDevices.ItemIndex );
end;

procedure TMainForm.btnPluginWebCamGetFormatsClick(Sender: TObject);
begin
  _runCommand := 'READ_DEVICE_FORMAT';
  Test();
end;

procedure TMainForm.lbPluginWebCamDevicesDblClick(Sender: TObject);
begin
  _runCommand := 'READ_DEVICE_FORMAT';
  Test();
end;

procedure TMainForm.chkPluginWebCamDeviceOpenCloseClick(Sender: TObject);
begin
  _runCommand := 'DEVICE_CLOSE';
  if chkPluginWebCamDeviceOpenClose.Checked=true then _runCommand := 'DEVICE_OPEN';
  Test();
end;

procedure TMainForm.lbPluginWebCamDeviceFormatsClick(Sender: TObject);
begin
  txtPluginWebCamFormatIndex.Text := IntToStr( lbPluginWebCamDeviceFormats.ItemIndex );
end;

procedure TMainForm.lbPluginWebCamDeviceFormatsDblClick(Sender: TObject);
begin
  chkPluginWebCamDeviceOpenClose.Checked := False;
  chkPluginWebCamDeviceOpenClose.Checked := True;
end;

procedure TMainForm.chkPluginViewerShowViewerClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.chkBlobExplorerContourClick(Sender: TObject);
begin
  Test();
end;

procedure TMainForm.btnPluginSnapShotGetWindowsTitleClick(Sender: TObject);
begin
  _runCommand := 'GET_WINDOWS_TITLE';
  Test();
end;

procedure TMainForm.lbPluginSnapShotWindowsTitleDblClick(Sender: TObject);
begin
  txtPluginSnapShotWindowTitle.Text := lbPluginSnapShotWindowsTitle.Items[lbPluginSnapShotWindowsTitle.ItemIndex];
  txtPluginSnapShotWindowHandle.Text := '';
  Test();
end;

procedure TMainForm.lbPluginSnapShotWindowsTitleClick(Sender: TObject);
begin
  txtPluginSnapShotWindowTitle.Text := lbPluginSnapShotWindowsTitle.Items[lbPluginSnapShotWindowsTitle.ItemIndex];
  txtPluginSnapShotWindowHandle.Text := '';
end;

procedure TMainForm.btnPluginSnapShotApplicationClick(Sender: TObject);
var
  SEInfo: TShellExecuteInfo;
  ExitCode: DWORD;
  ExecuteFile, ParamString, StartInString: string;
begin
  ExecuteFile:=txtPluginSnapShotApplication.Text;
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do begin
   fMask := SEE_MASK_NOCLOSEPROCESS;
   Wnd := Application.Handle;
   lpFile := PChar(ExecuteFile);
   nShow := SW_SHOWNORMAL;
  end;
  ShellExecuteEx(@SEInfo);
end;

end.
Advertisement