/// <summary>
        /// Load the classifier file
        /// </summary>
        /// <param name="loadFileName"></param>
        /// <returns></returns>
        public static StrongClassifier LoadClassifier(string loadFileName)
        {
            StreamReader  sr  = new StreamReader(loadFileName, System.Text.Encoding.Unicode);
            XmlReader     xr  = new XmlTextReader(sr);
            XmlSerializer ser = new XmlSerializer(typeof(StrongClassifier));

            StrongClassifier classifier = (StrongClassifier)ser.Deserialize(xr);

            xr.Close();
            return(classifier);
        }
        /// <summary>
        /// Calculate the LBP distance
        /// </summary>
        /// <param name="frontUIData"></param>
        public void LBPDistance(DataExchange frontUIData)
        {
            ParseConfig(frontUIData);

            List <Image>    listFilteredImage = new List <Image>();
            int             nEl = frontUIData.ElementCount;
            ExchangeElement exEl = null;
            Image           filteredImage = null;
            LBPFilter       lbpFilter = new LBPFilter(1, 8, true, true);
            int             i, j;

            for (i = 0; i < nEl; i++)
            {
                exEl          = frontUIData.GetElement(i);
                filteredImage = GetData(exEl, lbpFilter);
                listFilteredImage.Add(filteredImage);
            }

            SparseFilterExample  example;
            LBPIntegralHistogrom lbpHist1 = new LBPIntegralHistogrom();
            LBPIntegralHistogrom lbpHist2 = new LBPIntegralHistogrom();

            StrongClassifier  strongClassifier   = LoadClassifier(_classifierFileName);
            RectangularFilter rectangularFilters = LoadFilterSet(_rectangularFileName);

            List <int> listRectangularIndices = GetFilterIndex(strongClassifier);

            float[]  score    = new float[2];
            double[] expScore = new double[2];

            double[,] distanceMatrix = new double[nEl, nEl];

            for (i = 0; i < nEl; i++)
            {
                lbpHist1.Create(listFilteredImage[i], lbpFilter.m_nFilterRange + 1);
                for (j = 0; j < i; j++)
                {
                    lbpHist2.Create(listFilteredImage[j], lbpFilter.m_nFilterRange + 1);
                    example = CreateFilterResponses(lbpHist1, lbpHist2,
                                                    rectangularFilters, listRectangularIndices);
                    score[0] = score[1] = 0;
                    score    = strongClassifier.Vote(example, score, _stage);

                    expScore[0]          = Math.Exp(Convert.ToDouble(score[0]));
                    expScore[1]          = Math.Exp(Convert.ToDouble(score[1]));
                    distanceMatrix[i, j] = expScore[0] / (expScore[0] + expScore[1]) + 0.05;
                    distanceMatrix[j, i] = distanceMatrix[i, j];
                }
            }
            frontUIData.DistanceMatrix = distanceMatrix;
        }
        /// <summary>
        /// Get the list of rectangular filter ID
        /// </summary>
        /// <param name="strongClassifier"></param>
        /// <returns></returns>
        private List <int> GetFilterIndex(StrongClassifier strongClassifier)
        {
            List <int> listRectangleIndex = new List <int>();

            if (strongClassifier.Classifiers[0] is Feature)
            {
                foreach (Feature feature in strongClassifier.Classifiers)
                {
                    if (!listRectangleIndex.Contains(feature.Nfilter))
                    {
                        listRectangleIndex.Add(feature.Nfilter);
                    }
                }
            }
            else
            {
                if (strongClassifier.Classifiers[0] is DecisionTree)
                {
                    foreach (DecisionTree decisionTree in strongClassifier.Classifiers)
                    {
                        DecisionTree.SubTreeCollection treeNodeCollection = new DecisionTree.SubTreeCollection(decisionTree);
                        foreach (DecisionTree treenode in treeNodeCollection)
                        {
                            if (treenode.Decision != null)
                            {
                                if (!listRectangleIndex.Contains(treenode.Decision.Nfilter))
                                {
                                    listRectangleIndex.Add(treenode.Decision.Nfilter);
                                }
                            }
                        }
                    }
                }
            }
            return(listRectangleIndex);
        }