Exemplo n.º 1
0
        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();
                    }
                }
            }
        }
Exemplo n.º 2
0
        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;
        }