public void ProcessFrame(object sender, EventArgs arg) { _capture.FlipHorizontal = true; // Переворачиваем изображение относительно оси У Mat imageMatrix = new Mat(); //Матрица, которую мы забираем из потока камеры _capture.Retrieve(imageMatrix, 0); Image<Bgr, byte> imageFrameBGR = imageMatrix.ToImage<Bgr, byte>(); Image<Gray, byte> imageFrameGray = RGBFilter(imageFrameBGR, red_color_min, red_color_max,//Фильтрация на пороговые значения цвета green_color_min, green_color_max, blue_color_min, blue_color_max); imageFrameGray = MassCenter(imageFrameGray); Display(imageMatrix, imageFrameGray); //<--------------------- отображение if (_isDetected) // Ищем движения { if (_count_frames == 0) //быдлокод потому что покадрово, нужно по времени { _firstSpeedCorrection = true; } if(_firstSpeedCorrection) { if(_count_frames!=0) { if (Math.Abs(x_coord[0] - center_x) >= 30 || Math.Abs(y_coord[0] - center_y) >= 30) { x_coord.Clear(); y_coord.Clear(); } else { _firstSpeedCorrection = false; x_begining = center_x; y_begining = center_y; } } } x_coord.Add(center_x); y_coord.Add(center_y); x_ending = center_x; y_ending = center_y; _count_frames++; } else { if (my_timer.ElapsedMilliseconds > 2000) // 2 секунды на корректировку изображения { my_timer.Reset(); if (_count_frames >= 5) { Line_func line = new Line_func(x_coord, y_coord); labelFunc.Text = line.coord_a_.ToString() + "X + " + line.coord_b_.ToString(); _correction = false; if (Math.Abs(x_ending - x_begining) > 200 && Math.Abs(line.coord_a_) < 1) { if (x_begining < 215) { labelType.Text = " Горизонтальная линия из левого края"; windowsChoose.nextSong();// след песня } else if (x_begining > 430) { labelType.Text = " Горизонтальная линия из правого края"; windowsChoose.prevSong(); } else { if (x_ending - x_begining > 0) { labelType.Text = " Горизонтальная линия из середины вправо"; windowsChoose.playSong(); } else if (x_ending - x_begining < 0) { labelType.Text = " Горизонтальная линия из середины влево"; windowsChoose.stopSong(); } } } else if (Math.Abs(y_ending - y_begining) > 250 && Math.Abs(line.coord_a_) > 1) { if (y_ending - y_begining > 0) { labelType.Text = " Вертикальная линия сверху вниз"; windowsChoose.voulumeDown(); } else if (y_ending - y_begining < 0) { labelType.Text = " Вертикальная линия снизу вверх"; windowsChoose.voulumeUp(); } } else labelType.Text = ""; } else { _correction = true; } if (!_correction) { labelDebagLog.Text = "(" + x_begining.ToString() + " ; " + y_begining.ToString() + ") - (" + x_ending + " ; " + y_ending + ")"; _count_frames = 0; listBoxCoordinatesX.Items.Clear(); listBoxCoordinatesY.Items.Clear(); foreach(Double num in x_coord) { listBoxCoordinatesX.Items.Add(" X:" + num.ToString()); } foreach (Double num in y_coord) { listBoxCoordinatesY.Items.Add(" Y:" + num.ToString()); } my_timer.Reset(); x_coord.Clear(); y_coord.Clear(); } } } }
private string moutionType(List<Double> x_c, List<Double> y_c) { string type = ""; Double x_beg = x_c[0]; Double y_beg = y_c[0]; Double x_end = x_c.Last(); Double y_end = y_c.Last(); Double x_max = x_c.Max(); Double y_max = y_c.Max(); Double x_min = x_c.Min(); Double y_min = y_c.Min(); if (my_timer.ElapsedMilliseconds > 1000) { my_timer.Reset(); if (_count_frames >= 20) // если он был в кадре не долго { //или не прошло время на корректировку //выключаем таймер _correction = false; //отключаем корректировку Line_func line = new Line_func(x_coord, y_coord); labelFunc.Text = line.coord_a_.ToString() + "X + " + line.coord_b_.ToString(); if (Math.Abs(x_end - x_beg) > 200 && Math.Abs(line.coord_a_) < 1) { if (x_beg < 215) type = " Горизонтальная линия из левого края"; else if (x_beg > 430) type = " Горизонтальная линия из правого края"; else { if (x_end - x_beg > 0) type = " Горизонтальная линия из середины вправо"; else if (x_end - x_beg < 0) type = " Горизонтальная линия из середины влево"; } } else if (Math.Abs(y_end - y_beg) > 350 && Math.Abs(line.coord_a_) > 1) { if (y_end - y_beg > 0) type = " Вертикальная линия сверху вниз"; else if (y_end - y_beg < 0) type = " Вертикальная линия снизу вверх"; } else type = ""; } else { _correction = true; } if (!_correction) { labelDebagLog.Text = "(" + x_beg.ToString() + " ; " + y_beg.ToString() + ") - (" + x_end + " ; " + y_end + ")"; _count_frames = 0; my_timer.Reset(); x_coord.Clear(); y_coord.Clear(); } } return type; }