//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); }
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>(); }
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++; } } } }
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++; } } } }
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); }