Beispiel #1
0
        static void Main(string[] args)
        {
            var capture = new VideoCapture(@"G:\videodata\char 5s.mp4");
            var win     = new Window("capture");
            var mat     = new Mat();
            var tracker = TrackerCSRT.Create();
            var bbox    = new Rect();
            var bboxes  = new Rect[] { };

            capture.Read(mat);

            bbox = Cv2.SelectROI("capture", mat);
            //bboxes = Cv2.SelectROIs("capture", mat);

            //for(int i = 0; i < bboxes.Length; i++)
            //{
            //    Console.WriteLine(bboxes[i]);
            //}

            //var mt = MultiTracker.Create();
            Console.WriteLine(bbox);

            var bbox2d = new Rect2d(bbox.X, bbox.Y, bbox.Width, bbox.Height);


            //rect2d to rect

            tracker.Init(mat, bbox2d);



            while (true)
            {
                capture.Read(mat);
                // 読み込めるフレームがなくなったら終了
                if (mat.Empty())
                {
                    break;
                }

                tracker.Update(mat, ref bbox2d);

                Cv2.Rectangle(mat, bbox2d.ToRect(), new Scalar(0, 255, 0));

                //for (int i = 0; i < bboxes.Length; i++)
                //{
                //    Cv2.Rectangle(mat, bbox2d.ToRect(), new Scalar(0, 255, 0));
                //}

                Console.WriteLine(bbox2d);

                win.ShowImage(mat);



                Cv2.WaitKey(33);
            }

            Console.ReadKey();
        }
        /// <summary>
        /// 获取图像
        /// </summary>
        public void Cap_Run(object o)
        {
            VideoCapture cap = new VideoCapture(Path);

            cap.Read(src);
            double timer = 0;
            double fps   = 0;

            while (true)
            {
                cal   = true;
                fps   = Cv2.GetTickFrequency() / (Cv2.GetTickCount() - timer);
                timer = Cv2.GetTickCount();
                cap.Read(src);                                          //读画面和参数
                bbox = new Rect2d(ptX, ptY, bboxSize, bboxSize);        //更新选择框
                if (Tracker != null && !Tracker.IsDisposed)             //在跟踪?
                {
                    trackStatus = Tracker.Update(src, ref tgt);         //更新跟踪参数
                    _tgt        = tgt.ToRect();                         //冗余但懒得改的转换
                    Cv2.Rectangle(src, _tgt, Scalar.Lime, 2);           //画跟踪框
                    Rect roiRect = tgt.ToRect();                        //roi
                    target.X = (int)(2 * tgt.X + tgt.Width) / 2;        //目标坐标
                    target.Y = (int)(2 * tgt.Y + tgt.Height) / 2;
                    tgtSize  = (int)tgt.Width;
                    try
                    {
                        Mat _roi = new Mat(src, roiRect);               //roi显示在小窗里,窗被我删了
                        _roi.CopyTo(roi);
                    }
                    catch
                    {
                    }
                }
                _bbox = bbox.ToRect();                                  //冗余但懒得改的转换
                Cv2.Rectangle(src, _bbox, Scalar.Red, 1);               //画选择框
                if (trackStatus)                                        //正在跟踪的画面指示
                {
                    Cv2.Line(src, target.X - tgtSize / 2, target.Y, target.X, target.Y + tgtSize / 2, Scalar.Lime, 2);
                    Cv2.Line(src, target.X, target.Y + tgtSize / 2, target.X + tgtSize / 2, target.Y, Scalar.Lime, 2);
                    Cv2.Line(src, target.X + tgtSize / 2, target.Y, target.X, target.Y - tgtSize / 2, Scalar.Lime, 2);
                    Cv2.Line(src, target.X, target.Y - tgtSize / 2, target.X - tgtSize / 2, target.Y, Scalar.Lime, 2);
                    Cv2.PutText(src, "X:" + target.X.ToString() + "|" + "Y:" + target.Y.ToString(), new OpenCvSharp.Point(tgt.X, tgt.Y - 5),
                                HersheyFonts.HersheyPlain, 3, Scalar.Lime, 3);
                }
                Cv2.PutText(src, "FPS:" + ((int)fps).ToString(), new OpenCvSharp.Point(1, videoH - 9), HersheyFonts.HersheyPlain, 2, Scalar.Black, 2);
                Cv2.PutText(src, "FPS:" + ((int)fps).ToString(), new OpenCvSharp.Point(0, videoH - 10), HersheyFonts.HersheyPlain, 2, Scalar.Lime, 2);

                PicBox_Video.Image = BitmapConverter.ToBitmap(src);
                cal = false;
                GC.Collect();
                //Cv2.WaitKey(50);
                if (MyRov.Mode.ControlMode == 2)
                {
                    if (target.X < 600)
                    {
                        TurnLeft();
                    }
                    if (target.X > 1000)
                    {
                        TurnRight();
                    }
                    if (target.Y < 400)
                    {
                        Up();
                    }
                    if (target.Y > 700)
                    {
                        Down();
                    }
                    if (target.X >= 600 && target.X <= 1000 && target.Y >= 400 && target.Y <= 700)
                    {
                        Advance();
                    }
                }
            }
            if (Isopen == 0)
            {
                this.th.Abort();
            }
        }