예제 #1
0
파일: Form1.cs 프로젝트: Micky-G/VideoTrace
        private void videoSourcePlayer1_NewFrame(object sender, ref Bitmap image)
        {
            Bitmap nowImg = AForge.Imaging.Image.Clone(image);

            nowImg = ImgOper.Grayscale(nowImg);

            // 做高斯模糊,取样和检测都会影响到
            nowImg = ImgOper.GaussianConvolution(nowImg, Parameter.GAUSSIAN_SIGMA, Parameter.GAUSSIAN_SIZE);

            // 将图像传递到取样窗口
            pri_bmp = AForge.Imaging.Image.Clone(nowImg);

            double   elapse = 0;
            DateTime dt     = DateTime.Now;

            pri_obj_regions = pri_tld.HogDetect(nowImg);
            elapse          = DateTime.Now.Subtract(dt).TotalMilliseconds;

            float[] vect = new float[3];   // 描述区域位移和缩放
            //nowImg.Save("Image\\VideoSave\\" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".jpg");
            ArrayList points = null;

            if (pri_optical.IPoints == null || pri_tracker_rect == Rectangle.Empty)
            {
                pri_optical.I = pri_optical.TransformBmpToLayerImg(nowImg);

                // 尚未确定跟踪对象,不需要PositiveExpert
                pri_tracker_rect = pri_tld.NegativeExpert(pri_obj_regions, pri_tracker_rect, nowImg);

                pri_optical.IPoints = new ArrayList();
                points = pri_optical.ChooseRectRandomPoints(pri_tracker_rect, Parameter.INITIAL_POINTS_NUMBER);
                foreach (PointF pt in points)
                {
                    pri_optical.IPoints.Add(new PointF(pt.X, pt.Y));
                }
            }
            else
            {
                if (pri_optical.J != null)
                {
                    pri_optical.I       = pri_optical.J;
                    pri_optical.IPoints = pri_optical.JPoints;
                }
                pri_optical.J = pri_optical.TransformBmpToLayerImg(nowImg);

                //pri_optical.JPoints = new ArrayList();
                // 跟踪时wx和wy设为3,或者更大
                dt   = DateTime.Now;
                vect = pri_optical.ComputerDisplacement(pri_optical.I, pri_optical.J, pri_optical.IPoints,
                                                        1, 3, 3, 20, 0.2f, ref pri_optical.IPoints, ref pri_optical.JPoints);
                elapse = DateTime.Now.Subtract(dt).TotalMilliseconds;

                if (vect != null)
                {
                    pri_tracker_rect.X      = pri_tracker_rect.X + vect[0];
                    pri_tracker_rect.Y      = pri_tracker_rect.Y + vect[1];
                    pri_tracker_rect.Width  = pri_tracker_rect.Width * vect[2];
                    pri_tracker_rect.Height = pri_tracker_rect.Height * vect[2];

                    if (pri_tracker_rect.X < 0)
                    {
                        pri_tracker_rect.Width = pri_tracker_rect.Width + pri_tracker_rect.X;
                        pri_tracker_rect.X     = 0;
                    }
                    else if (pri_tracker_rect.X + pri_tracker_rect.Width - 1 > nowImg.Width - 1)
                    {
                        pri_tracker_rect.Width = nowImg.Width - pri_tracker_rect.X;
                    }

                    if (pri_tracker_rect.Y < 0)
                    {
                        pri_tracker_rect.Height = pri_tracker_rect.Height + pri_tracker_rect.Y;
                        pri_tracker_rect.Y      = 0;
                    }
                    else if (pri_tracker_rect.Y + pri_tracker_rect.Height - 1 > nowImg.Height - 1)
                    {
                        pri_tracker_rect.Height = nowImg.Height - pri_tracker_rect.Y;
                    }
                }
                else
                {
                    pri_tracker_rect = Rectangle.Empty;
                }

                // 在跟踪框被NExpert产生的最可信对象替代前保存原始状态
                if (pri_tracker_rect != Rectangle.Empty)
                {
                    pri_obj_rect = new RectangleF(pri_tracker_rect.X, pri_tracker_rect.Y, pri_tracker_rect.Width, pri_tracker_rect.Height);
                }

                dt = DateTime.Now;
                // 有跟踪对象时,PositvieExpert与NegativeExpert都开始工作
                pri_tld.PositiveExpert(pri_obj_regions, pri_tracker_rect, nowImg);
                elapse = DateTime.Now.Subtract(dt).TotalMilliseconds;

                dt = DateTime.Now;
                pri_tracker_rect = pri_tld.NegativeExpert(pri_obj_regions, pri_tracker_rect, nowImg);
                elapse           = DateTime.Now.Subtract(dt).TotalMilliseconds;

                pri_optical.JPoints = new ArrayList();
                points = pri_optical.ChooseRectRandomPoints(pri_tracker_rect, Parameter.INITIAL_POINTS_NUMBER);
                // 如果pri_tracker_rect为空,则pri_optical.JPoints为空,那么下次跟踪的pri_optical.Ipoints也为空,无法继续跟踪
                foreach (PointF pt in points)
                {
                    pri_optical.JPoints.Add(new PointF(pt.X, pt.Y));
                }
            }

            Graphics g   = Graphics.FromImage(image);
            Pen      pen = new Pen(Color.Red);

            if (pri_tracker_rect != Rectangle.Empty)
            {
                g.DrawRectangle(pen, pri_tracker_rect.X, pri_tracker_rect.Y, pri_tracker_rect.Width, pri_tracker_rect.Height);

                FontFamily f       = new FontFamily("宋体");
                Font       font    = new System.Drawing.Font(f, 12);
                SolidBrush myBrush = new SolidBrush(Color.Blue);

                StringBuilder str = new StringBuilder();
                if (vect != null)
                {
                    str.AppendFormat("跟踪框相对位移:({0}, {1}),缩放:{2} \r\n" +
                                     "跟踪产生的Rectangle:({3}, {4}, {5}, {6}) \r\n" +
                                     "最可信的Rectangle:({7}, {8}, {9}, {10})", vect[0], vect[1], vect[2],
                                     pri_obj_rect.X, pri_obj_rect.Y, pri_obj_rect.Width, pri_obj_rect.Height,
                                     pri_tracker_rect.X, pri_tracker_rect.Y, pri_tracker_rect.Width, pri_tracker_rect.Height);
                }
                else
                {
                    str.AppendFormat("最可信的Rectangle:({0}, {1}, {2}, {3})", pri_tracker_rect.X, pri_tracker_rect.Y, pri_tracker_rect.Width, pri_tracker_rect.Height);
                }

                g.DrawString(str.ToString(), font, myBrush, 0, 0);
            }

            //if (pri_obj_regions != null && pri_obj_regions.Count > 0)
            //{
            //    foreach (Rectangle rect in pri_obj_regions)
            //    {
            //        g.DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height);
            //    }
            //}
        }