//public void Test(Mat src)
        //{
        //    // для более быстрого лоступа к пикселям используем индексатор
        //    var indexer = src.GetGenericIndexer<Vec3b>();


        //    int offset_h = B;
        //    int offset_w = A;

        //    for (int i = offset_h; i < src.Size().Height - 1 - offset_h; i+=15)
        //    {
        //        for (int j = offset_w; j < src.Size().Width - 1 - offset_w; j+=15)
        //        {
        //            var histogram = CalcHistogramForArea(i, j, 15, 15, indexer);
        //            histogram.Print();
        //        }
        //        Console.WriteLine();
        //    }
        //    Console.WriteLine("ready");
        //}

        /// <summary>
        /// Подсчет гистограммы област
        /// </summary>
        /// <param name="x">начальная точка x</param>
        /// <param name="y">начальная точка y</param>
        /// <param name="h">высота зоны</param>
        /// <param name="w">ширина зоны</param>
        /// <returns></returns>
        public RGBHistogramm <uint> CalcHistogramForArea(int x, int y, int h, int w, Mat.Indexer <Vec3b> indexer)
        {
            var rgbHistogramm = new RGBHistogramm <uint>(uniform_patterns_extend);

            for (int i = x; i < x + h; i++)
            {
                if (i < A)
                {
                    continue;
                }
                if (i >= x + h - A)
                {
                    continue;
                }
                for (int j = y; j < y + w; j++)
                {
                    if (j < B)
                    {
                        continue;
                    }
                    if (j >= y + w - B)
                    {
                        continue;
                    }
                    rgbHistogramm.R.Add(BinaryCodeToValue(CalcPixelLBPCode(i, j, indexer, 'R')));
                    rgbHistogramm.G.Add(BinaryCodeToValue(CalcPixelLBPCode(i, j, indexer, 'G')));
                    rgbHistogramm.B.Add(BinaryCodeToValue(CalcPixelLBPCode(i, j, indexer, 'B')));
                }
            }
            return(rgbHistogramm);
        }
Beispiel #2
0
 protected int direction;  // 0 up, 1 right, 2 down, 3 left
 public TurkmiteBase(Mat image)
 {
     Image     = image;
     x         = image.Cols / 2;
     y         = image.Rows / 2;
     direction = 0;
     indexer   = image.GetGenericIndexer <Vec3b>();
 }
Beispiel #3
0
        static void RunExperimenets(List <ImageArea> areas, Mat.Indexer <Vec3b> indexer, int exp_num = 1)
        {
            Param A_     = DBConnector.GetParam("Больший радиус"),
                  B_     = DBConnector.GetParam("Меньший радиус"),
                  count_ = DBConnector.GetParam("Количество точек");

            A_.Max     = 10;
            B_.Max     = 8;
            count_.Max = 16;

            int test_num = 1;

            foreach (var a in A_.AsEnumerable())
            {
                foreach (var b in B_.AsEnumerable())
                {
                    foreach (var c in count_.AsEnumerable())
                    {
                        Console.WriteLine($"test {test_num}/{A_.count * B_.count * count_.count}");
                        var exp = new Experement()
                        {
                            ExperimentNumber = exp_num, TestNubmer = test_num
                        };
                        DBConnector.CreateItem(exp);
                        DBConnector.CreateList(new List <ExperimentPlan>()
                        {
                            new ExperimentPlan()
                            {
                                ExperimentNumber = exp.ExperimentNumber, TestNubmer = exp.TestNubmer, CodeParameter = A_.Code, ValueParameter = a
                            },
                            new ExperimentPlan()
                            {
                                ExperimentNumber = exp.ExperimentNumber, TestNubmer = exp.TestNubmer, CodeParameter = B_.Code, ValueParameter = b
                            },
                            new ExperimentPlan()
                            {
                                ExperimentNumber = exp.ExperimentNumber, TestNubmer = exp.TestNubmer, CodeParameter = count_.Code, ValueParameter = c
                            },
                        });
                        var results = MakeExperemnt(a, b, c, areas, exp, indexer);
                        DBConnector.CreateList(results);
                        test_num++;
                    }
                }
            }
        }
Beispiel #4
0
        private static List <Point> FindAll(Mat image, Piece type)
        {
            Mat result = image.MatchTemplate(TEMPLATES[type], TemplateMatchModes.CCoeffNormed);

            Mat.Indexer <float> indexer = result.GetGenericIndexer <float>();
            List <Point>        points  = new List <Point>();

            for (int x = 0; x < result.Cols; x++)
            {
                for (int y = 0; y < result.Rows; y++)
                {
                    if (indexer[y, x] > .8625f)
                    {
                        points.Add(new Point(x, y));
                    }
                }
            }
            return(points);
        }
        /// <summary>
        /// Вычисление LBP кода для пикселя
        /// </summary>
        /// <param name="indexer">объект доступа к пикселям</param>
        /// <param name="x">позиция x</param>
        /// <param name="y">позиция y</param>
        /// <param name="positions">позиции точек, по которым считать LBP код</param>
        /// <returns></returns>
        private string CalcPixelLBPCode(int x, int y, Mat.Indexer <Vec3b> indexer, char color)
        {
            string result = "";
            byte   threshold;

            for (int i = 0; i < lbp_positions.GetLength(0); i++)
            {
                int  a = x + lbp_positions[i, 0], b = y + lbp_positions[i, 1];
                var  c = indexer[b, a];
                byte value;
                switch (color)
                {
                case 'R': value = c.Item0; threshold = indexer[y, x].Item0; break;

                case 'G': value = c.Item1; threshold = indexer[y, x].Item1; break;

                case 'B': value = c.Item2; threshold = indexer[y, x].Item2; break;

                default: throw new Exception($"a valid not color ({color})");
                }
                result += (value >= threshold) ? "1" : "0";
            }
            return(result);
        }
        void RunExperimenets(List <ImageArea> areas, Mat.Indexer <Vec3b> indexer, int exp_num = 1)
        {
            Param A = new Param()
            {
                Min  = (int)numericUpDownAFrom.Value,
                Max  = (int)numericUpDownATo.Value,
                Step = (int)numericUpDownAStep.Value,
                Code = "1"
            };

            Param B = new Param()
            {
                Min  = (int)numericUpDownBFrom.Value,
                Max  = (int)numericUpDownBTo.Value,
                Step = (int)numericUpDownBStep.Value,
                Code = "2"
            };

            Param PCount = new Param()
            {
                Min  = (int)numericUpDownPFrom.Value,
                Max  = (int)numericUpDownPTo.Value,
                Step = (int)numericUpDownPStep.Value,
                Code = "3"
            };

            this.labelExpNum.Invoke(new Action(() => { labelExpNum.Text = exp_num.ToString(); }));
            int test_num = 1;

            foreach (var a in A.AsEnumerable())
            {
                foreach (var b in B.AsEnumerable())
                {
                    foreach (var c in PCount.AsEnumerable())
                    {
                        this.labelCurrentIteration.Invoke(new Action(() => { labelCurrentIteration.Text = test_num.ToString(); }));
                        var exp = new Experement()
                        {
                            ExperimentNumber = exp_num, TestNubmer = test_num
                        };
                        DBConnector.CreateItem(exp);
                        DBConnector.CreateList(new List <ExperimentPlan>()
                        {
                            new ExperimentPlan()
                            {
                                ExperimentNumber = exp.ExperimentNumber, TestNubmer = exp.TestNubmer, CodeParameter = A.Code, ValueParameter = a
                            },
                            new ExperimentPlan()
                            {
                                ExperimentNumber = exp.ExperimentNumber, TestNubmer = exp.TestNubmer, CodeParameter = B.Code, ValueParameter = b
                            },
                            new ExperimentPlan()
                            {
                                ExperimentNumber = exp.ExperimentNumber, TestNubmer = exp.TestNubmer, CodeParameter = PCount.Code, ValueParameter = c
                            },
                        });
                        var results = ConsoleApp.Program.MakeExperemnt(a, b, c, areas, exp, indexer);
                        DBConnector.CreateList(results);
                        test_num++;
                    }
                }
            }
        }
Beispiel #7
0
        public static List <ExperimentResult> MakeExperemnt(int A, int B, int count, List <ImageArea> areas, Experement exp, Mat.Indexer <Vec3b> indexer)
        {
            Console.WriteLine($"{A} {B} {count}");
            var lbp = new LBPProcessor(A, B, count);

            List <Tuple <RGBHistogramm <uint>, ImageArea> > histogramm_list = new List <Tuple <RGBHistogramm <uint>, ImageArea> >();

            foreach (ImageArea row in areas)
            {
                histogramm_list.Add(new Tuple <RGBHistogramm <uint>, ImageArea>(lbp.CalcHistogramForArea(row.X1, row.Y1, row.h, row.w, indexer), row));
            }

            List <ExperimentResult> results = new List <ExperimentResult>();

            foreach (var histogram in histogramm_list)
            {
                var    hist      = histogram.Item1;
                var    area      = histogram.Item2;
                string defect    = area.IsDefect ? "-" : "";
                var    distanseR = hist.R.Distanse(histogramm_list[1].Item1.R);
                var    distanseG = hist.G.Distanse(histogramm_list[1].Item1.G);
                var    distanseB = hist.B.Distanse(histogramm_list[1].Item1.B);

                var summa = distanseR + distanseG + distanseB;
                results.Add(new ExperimentResult()
                {
                    ExperimentNumber = exp.ExperimentNumber, TestNubmer = exp.TestNubmer, IdArea = area.Id, DefectPower = summa
                });
                //Console.WriteLine($"{area.X1,3}, {area.Y1,3}: {summa,3} {defect,2} {threshold,2}");
            }
            return(results);
        }