Using Optical Flow in EmguCV

Posted by Meko on Stack Overflow See other posts from Stack Overflow or by Meko
Published on 2010-05-31T16:22:37Z Indexed on 2010/05/31 16:22 UTC
Read the original article Hit count: 1644

Filed under:
|

HI. I am trying to create simple touch game using EmguCV.Should I use optical flow to determine for interaction between images on screen and with my hand ,if changes of points somewhere on screen more than 100 where the image, it means my hand is over image? But how can I track this new points? I can draw on screen here the previous points and new points but It shows on my head more points then my hand and I can not track my hands movements.

 void Optical_Flow_Worker(object sender, EventArgs e)
    {

        {

            Input_Capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_POS_FRAMES, ActualFrameNumber);


            ActualFrame = Input_Capture.QueryFrame();

            ActualGrayFrame = ActualFrame.Convert<Gray, Byte>();

            NextFrame = Input_Capture.QueryFrame();

            NextGrayFrame = NextFrame.Convert<Gray, Byte>();

            ActualFeature = ActualGrayFrame.GoodFeaturesToTrack(500, 0.01d, 0.01, 5);

            ActualGrayFrame.FindCornerSubPix(ActualFeature, new System.Drawing.Size(10, 10), new System.Drawing.Size(-1, -1), new MCvTermCriteria(20, 0.3d));

            OpticalFlow.PyrLK(ActualGrayFrame, NextGrayFrame, ActualFeature[0], new System.Drawing.Size(10, 10), 3, new MCvTermCriteria(20, 0.03d), out NextFeature, out Status, out TrackError);
            OpticalFlowFrame = new Image<Bgr, Byte>(ActualFrame.Width, ActualFrame.Height);
            OpticalFlowFrame = NextFrame.Copy();

            for (int i = 0; i < ActualFeature[0].Length; i++)

                DrawFlowVectors(i);

            ActualFrameNumber++;

            pictureBox1.Image = ActualFrame.Resize(320, 400).ToBitmap() ;

            pictureBox3.Image = OpticalFlowFrame.Resize(320, 400).ToBitmap();

        }

    }

    private void DrawFlowVectors(int i)
    {

        System.Drawing.Point p = new Point();
        System.Drawing.Point q = new Point();

        p.X = (int)ActualFeature[0][i].X;
        p.Y = (int)ActualFeature[0][i].Y;
        q.X = (int)NextFeature[i].X;
        q.Y = (int)NextFeature[i].Y;


        p.X = (int)(q.X + 6 * Math.Cos(angle + Math.PI / 4));
        p.Y = (int)(q.Y + 6 * Math.Sin(angle + Math.PI / 4));

        p.X = (int)(q.X + 6 * Math.Cos(angle - Math.PI / 4));
        p.Y = (int)(q.Y + 6 * Math.Sin(angle - Math.PI / 4));

            OpticalFlowFrame.Draw(new Rectangle(q.X,q.Y,1,1), new Bgr(Color.Red), 1);
            OpticalFlowFrame.Draw(new Rectangle(p.X, p.Y, 1, 1), new Bgr(Color.Blue), 1);

    }

© Stack Overflow or respective owner

Related posts about emgucv

Related posts about opticalflow