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); // } //} }