2016-05-17 8 views
0

Я разрабатываю систему точно так же, как мышь камеры или другую мышь управления лицом, я реализовал все функциональные возможности, указатель мыши также хорошо перемещается, но я хочу создать движение гладким, точно так же, как мышь управляет указателем. код я использую:Как управлять указателем мыши с движением головы с помощью emguCV C#?

 if (startButton == true) 
     { 
      try 
      { 
       cap = new Capture(); 
       pictureBox1.Image = cap.QueryFrame().ToImage<Bgr, Byte>().Bitmap; 
      } 
      catch (Exception exp) 
      { 
       MessageBox.Show("Error:" + exp); 
      } 
      _cascadeClassifier = new CascadeClassifier(Application.StartupPath + "/haarcascade_frontalface_default.xml"); 
      eye_cascadeClassifier = new CascadeClassifier(Application.StartupPath + "/haarcascade_eye.xml"); 

      timer1.Start(); 
     } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     using (var imageFrame = cap.QueryFrame().ToImage<Bgr, Byte>().Flip(FlipType.Horizontal)) 
     { 
      if (imageFrame != null) 
      { 
       var grayframe = imageFrame.Convert<Gray, byte>(); 

       var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.1, 10, Size.Empty); //the actual face detection happens here 

       foreach (var face in faces) 
       { 
        if(Configure.FaceBoxCheck==true) 
        imageFrame.Draw(face, new Bgr(Color.LightGreen), 2); //the detected face(s) is highlighted here using a box that is drawn around it/them 
        Int32 yCoordStartSearchEyes = face.Top + (face.Height * 3/11); 
        Point startingPointSearchEyes = new Point(face.X, yCoordStartSearchEyes); 
        Size searchEyesAreaSize = new Size(face.Width, (face.Height * 3/11)); 
        Rectangle possibleROI_eyes = new Rectangle(startingPointSearchEyes, searchEyesAreaSize); 

        int widthNav = (imageFrame.Width/11 * 3); 
        int heightNav = (imageFrame.Height/11 * 3); 
        Rectangle nav = new Rectangle(new Point(imageFrame.Width/2 - widthNav/2, imageFrame.Height/2 - heightNav/2), new Size(widthNav, heightNav)); 
        imageFrame.Draw(nav, new Bgr(Color.Lavender), 3); 
        Point cursor = new Point(face.X + searchEyesAreaSize.Width/2, yCoordStartSearchEyes + searchEyesAreaSize.Height/2); 
        grayframe.ROI = possibleROI_eyes; 
        var eyes = eye_cascadeClassifier.DetectMultiScale(grayframe, 2.15, 3, Size.Empty); 

        foreach (var eye in eyes) 
        { 
         //imageFrame.Draw(eye, new Bgr(Color.Red), 2); 
         if(Configure.EyeBoxCheck==true) 
         imageFrame.Draw(possibleROI_eyes, new Bgr(Color.DarkGreen), 2); 
         if (nav.Left < cursor.X && cursor.X < (nav.Left + nav.Width) && nav.Top < cursor.Y && cursor.Y < nav.Top + nav.Height) 
         { 
          LineSegment2D CursorDraw = new LineSegment2D(cursor, new Point(cursor.X, cursor.Y + 1)); 

          imageFrame.Draw(CursorDraw, new Bgr(Color.White), 3); 
          //we compute new cursor coordinate using a simple scale based on frame width and height 
          int xCoord = (imageFrame.Width * (cursor.X - nav.Left))/nav.Width; 
          int yCoord = (imageFrame.Height * (cursor.Y - nav.Top))/nav.Height; 
          //We set our new cursor position 
          Cursor.Position = new Point(xCoord * 2, yCoord *2); 
        } 
       } 
      } 
+0

Я не пробовал emgucv, но проблема заключается в том, что переход положения не является гладким. Я думаю, вы должны вычислить «Путь» между текущей позицией мыши и следующей рассчитанной позицией. Затем вам придется «вручную» перемещать мышь по этому пути. Я не знаю, имеет ли это смысл – Pikoh

ответ

0

Хорошо, я уверен, что есть много других более эффективных способов, но это быстрый & грязный способ перемещения позиции курсора в «Smooth» путь из точки а на точку b. Конечно, эту реализацию можно и нужно оптимизировать, используя другой поток вместо использования Application.DoEvents(), чтобы избежать блокировки потока пользовательского интерфейса, но я надеюсь, что это приведет вас к треку. Во-первых, как вы должны его использовать. Вместо того, чтобы:

Cursor.Position = new Point(xCoord * 2, yCoord *2); 

Вы должны сделать это:

MoveCursorSmooth(Cursor.Position, new Point(xCoord * 2, yCoord *2)); 

Теперь, реализация MoveCursorSmooth:

private void MoveCursorSmooth(Point a, Point b) 
    { 
     var step = 5; 
     var left = Math.Min(a.X, b.X); 
     var right = Math.Max(a.X, b.X); 
     int width = right - left; 

     var top = a.Y; 
     var bottom = b.Y; 
     int height = bottom - top; 

     if (width > height) 
     { 
      double slope = (double)height/(double)width; 
      if (a.X <= b.X) 
       for (int x = 1; x < width; ++x) 
       { 
        Cursor.Position = new Point((left + x), (a.Y + ((int)(slope * x + 0.5)))); 
        System.Threading.Thread.Sleep(step); 
        Application.DoEvents(); 
       } 
      else 
       for (int x = 1; x < width; ++x) // xOffset 
       { 
        Cursor.Position = new Point((right - x), (a.Y + ((int)(slope * x + 0.5)))); 
        System.Threading.Thread.Sleep(step); 
        Application.DoEvents(); 
       } 
     } 
     else 
     { 

      double slope = (double)width/(double)height; 
      if (a.X <= b.X) 
      { 
       for (int y = 1; y < height; ++y) 
       { 
        Cursor.Position = new Point((a.X + ((int)(slope * y + 0.5))), (top + y)); 
        System.Threading.Thread.Sleep(step); 
        Application.DoEvents(); 
       } 
      } 
      else 
      { 
       for (int y = 1; y < height; ++y) 
       { 
        Cursor.Position = new Point((b.X + ((int)(slope * y + 0.5))), (bottom - y)); 
        System.Threading.Thread.Sleep(step); 
        Application.DoEvents(); 
       } 
      } 
     } 
    } 

Этот метод основан на this answer

+0

этот код делает плавное движение, но изображение не работает, видео висит, я думаю, что есть ошибка в потоке, и когда я закрываю приложение приложения формы, и указатель мыши также совершает движения в определенных место, Движение PS также автоматическое не следует за движением головы. –

+0

Как я уже сказал, это всего лишь кое-что, чтобы попасть на трассу. Этот код должен быть в другом потоке, я не удивлен, что видео зависает. Что касается движения, не следующего движению головы, вы тот, который указывает точку назначения мыши, но вам, вероятно, следовало бы реализовать какой-то сигнал «Отменить», потому что, как только вы вызываете этот метод с пунктом назначения, мышь продолжайте движение, пока оно не достигнет цели. Это просто для того, чтобы вы попали на трассу, но, конечно же, вам нужно ее улучшить. – Pikoh

 Смежные вопросы

  • Нет связанных вопросов^_^