public float CompareFeature(RecognitionSample other, TextureFeatures feature)
        {
            if (other.imageFile != imageFile)
            {
                return(0);
            }

            int fragmentsCount    = 0;
            int fragmentsMathches = 0;

            foreach (var result in other.sampleResults)
            {
                ++fragmentsCount;
                var mineResult = GetAnswer(result.Region);
                if (mineResult != null)
                {
                    if (mineResult.CompareAnswers(result, feature))
                    {
                        ++fragmentsMathches;
                    }
                }
            }

            return(fragmentsMathches / (float)fragmentsCount);
        }
        private void btnOpen_Click(object sender, EventArgs e)
        {
            if (openSample.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                sample = new RecognitionSample(TextureRecognition.Instance.Core);
                sample.LoadSample(openSample.FileName);
                pbSample.Image = sample.GetSampleImage();
            }

            lbTextureClasses.Items.Clear();
            var core = TextureRecognition.Instance.Core;
            for (int i = 0; i < core.TextureClassCount; ++i)
            {
                lbTextureClasses.Items.Add(core.GetTextureClass(i).Name);
            }
            lbTextureClasses.SelectedIndex = -1;
        }
        public float CompareFeature(RecognitionSample other, TextureFeatures feature)
        {
            if (other.imageFile != imageFile)
            {
                return 0;
            }

            int fragmentsCount = 0;
            int fragmentsMathches = 0;
            foreach (var result in other.sampleResults)
            {
                ++fragmentsCount;
                var mineResult = GetAnswer(result.Region);
                if (mineResult != null)
                {
                    if (mineResult.CompareAnswers(result, feature))
                    {
                        ++fragmentsMathches;
                    }
                }
            }

            return fragmentsMathches / (float)fragmentsCount;
        }
        private void tsmiOptions_Click(object sender, EventArgs e)
        {
            var result = RecognitionOptions.Instance.ShowDialog();
            Focus();

            if (result == System.Windows.Forms.DialogResult.OK)
            {
                coreC = coreD = coreF = null;
                SampleC = SampleD = SampleF = null;
                workImage = null;

                lbOutput.Items.Add("Настройки изменены");
                lbOutput.SelectedIndex = lbOutput.Items.Count - 1;
            }
        }
 private void SelectSample(string file)
 {
     sample = new RecognitionSample(recognition.Core);
       sample.LoadSample(file);
       this.BeginInvoke(new Action(InvokeSelectSample));
       SampleC = SampleD = SampleF = null;
 }
        private void RecognizeThread(object param)
        {
            var id = (int)param;

            RecognitionCore core = null;
            RecognitionSample currentSample = null;
            Bitmap currentImage = null;
            string pref = "";

            switch (id)
            {
                case 1:
                    pref = "    (Полная выборка)";
                    core = coreF;
                    currentSample = SampleF;
                    currentImage = workImage;
                    break;

                case 2:
                    pref = "    (Компактная выборка)";
                    core = coreC;
                    currentSample = SampleC;
                    currentImage = workImage;
                    break;

                case 3:
                    pref = "    (Разряженная выборка)";
                    core = coreD;
                    currentSample = SampleD;
                    currentImage = workImage;
                    break;
                default:
                    break;
            }

            if (core == null)
            {
                core = new RecognitionCore();
                for (int i = 0; i < recognition.Core.TextureClassCount; ++i)
                {
                    var their = recognition.Core.GetTextureClass(i);
                    core.AddTextureClass(their.Name, their.RegionColor);
                }

                for (int i = 0; i < core.TextureClassCount; ++i)
                {
                    var currentClass = core.GetTextureClass(i);

                    this.BeginInvoke(
                        new Action(delegate()
                        {
                            lbOutput.Items.Add("Начато обучение классу " + currentClass.Name);
                            lbOutput.SelectedIndex = lbOutput.Items.Count - 1;
                        }));

                    switch (id)
                    {
                        case 1:
                            currentClass.Teach(teachingSamples[i], GetImagesToTeach(teachingSamples[i]));
                            break;

                        case 2:
                            currentClass.TeachCompact(teachingSamples[i], GetImagesToTeach(teachingSamples[i]));
                            break;

                        case 3:
                            currentClass.TeachDischarged(teachingSamples[i], GetImagesToTeach(teachingSamples[i]));
                            break;

                        default:
                            currentClass.Teach(teachingSamples[i], GetImagesToTeach(teachingSamples[i]));
                            break;
                    }
                    while (currentClass.IsTeaching)
                    {
                        Thread.Sleep(200);
                    }

                    var result = this.BeginInvoke(
                        new Action(delegate()
                        {
                            var count = currentClass.KnownSamplesNumber(TextureFeatures.GLCM);
                            var part = count / (float)teachingSamples[i].Count;
                            lbOutput.Items.Add("    После обучения получено образцов GLCM: " +
                                count.ToString() + " (" + part.ToString() + ")");

                            count = currentClass.KnownSamplesNumber(TextureFeatures.LBP);
                            part = count / (float)teachingSamples[i].Count;
                            lbOutput.Items.Add("    После обучения получено образцов LBP: " +
                                count.ToString() + " (" + part.ToString() + ")");

                            lbOutput.SelectedIndex = lbOutput.Items.Count - 1;
                        }));
                    while (!result.IsCompleted)
                    {
                        Thread.Sleep(50);
                    }
                }
            }

            switch (id)
            {
                case 1:
                    coreF = core;
                    break;
                case 2:
                    coreC = core;
                    break;
                case 3:
                    coreD = core;
                    break;
                default:
                    break;
            }

            if (currentSample == null)
            {
                this.BeginInvoke(
                    new Action(delegate()
                    {
                        lbOutput.Items.Add("Начато распознавание тестового изображения");
                        lbOutput.SelectedIndex = lbOutput.Items.Count - 1;
                    }));

                currentSample = new RecognitionSample(core, sample.Path);
                currentSample.Recognize();
                currentImage = currentSample.GetSampleImage();
                switch (id)
                {
                    case 1:
                        SampleF = currentSample;
                        workImage = currentImage;
                        break;
                    case 2:
                        SampleC = currentSample;
                        workImage = currentImage;
                        break;
                    case 3:
                        SampleD = currentSample;
                        workImage = currentImage;
                        break;
                    default:
                        break;
                }
            }

            var iRes = this.BeginInvoke(
                new Action(delegate()
                {
                    lbOutput.Items.Add(currentSample.Path);
                    var result = sample.CompareFeature(currentSample, TextureFeatures.GLCM);
                    lbOutput.Items.Add(pref + " Соответствие GLCM = " + result.ToString());
                    result = sample.CompareFeature(currentSample, TextureFeatures.LBP);
                    lbOutput.Items.Add(pref + " Соответствие LBP = " + result.ToString());
                    lbOutput.SelectedIndex = lbOutput.Items.Count - 1;

                    pbWork.Image = currentImage;

                    msMenu.Enabled = true;
                    btnSelectSample.Enabled = true;
                    btnSelectSamples.Enabled = true;
                    cbTextureClass.Enabled = true;
                    btnCompact.Enabled = true;
                    btnDischarged.Enabled = true;
                    btnFull.Enabled = true;
                }));
            while (!iRes.IsCompleted)
            {
                Thread.Sleep(20);
            }

            complete = true;
        }
        private void btnSelectSamples_Click(object sender, EventArgs e)
        {
            if (openImages.ShowDialog() == System.Windows.Forms.DialogResult.OK)
              {
            var index = cbTextureClass.SelectedIndex;
            teachingSamples[index].Clear();
            teachingSamples[index].AddRange(openImages.FileNames);
            lbOutput.Items.Add("Добавлено " + teachingSamples[index].Count + " примеров в класс " +
                recognition.Core.GetTextureClass(index).Name);

            coreC = coreD = coreF = null;
            SampleC = SampleD = SampleF = null;
            workImage = null;
              }
        }