C#-OPENCVSHARP多目标追踪-传统算法

在学习C#中的opencvsharp操作过程中,了解到通过传统算法便可实现在视频中得简易版多目标追踪,网上所发表的文章中使用Nuget程序包较为老旧,同时代码操作较为复杂,由此发表该文章,如有问题,请及时反馈;

1.Nuget程序包选择

此次,所选的Nuget程序包如下图所示,为保证opencv在C#中正常运行,在安装opencvsharp4同时也要安装opencvsharp4-runtime.win
在这里插入图片描述

2.命名空间引入

为满足多个目标跟踪,在此代码中通过List满足;

using System;
using OpenCvSharp;
using Rect = OpenCvSharp.Rect;
using OpenCvSharp.Tracking;
using System.Collections.Generic;

3.详细代码及介绍

static void Main(string[] args)
        {
            //1.期间参数定义
            string videoPath = @"xxxx";
            		//视频路径
            var capture = new VideoCapture(videoPath);
            		//视频捕获
            var trackers = new List<TrackerKCF>();
            		//KCF算法追踪器列表
            var rois = new List<Rect>();
            		//手动选择矩形框列表
            var frame = new Mat();
            		//视频中捕获到得原始图像
            var image= new Mat();
            		//绘制追踪矩形和正常显示得图像
            var tkImg = new Mat();
            		//显示多个目标追踪得图像
            string nm_winname = "norm video";
            		//正常显示窗口名称
            string tk_winname = "track video";
            		//追踪效果显示窗口名称
            while (true)
            {
                capture.Read(frame);
                //获取视频每一帧
                if (frame.Empty())
                    break;
                    //获取得帧为空时,停止循环
                frame.CopyTo(image);
                var tracker = TrackerKCF.Create();
                //定义新的KCF追踪器
                Cv2.NamedWindow(nm_winname, WindowFlags.AutoSize);
                //创建正常显示窗口,以保证后期roi区域得框选
                Cv2.ImShow(nm_winname, image);
                var k = Cv2.WaitKey(200);
                //当追踪器列表为空时,意味着没有框选感兴趣区,因此不需更新追踪器
                if (trackers.Count != 0)
                //当追踪器列表不为空时
                {
                    Cv2.NamedWindow(tk_winname, WindowFlags.AutoSize);
                    //创建追踪显示得窗口
                    int tk_len = trackers.Count; 
                    frame.CopyTo(tkImg);
                    //将当前帧给到追踪图像中
                    //并对追踪器列表中的每个追踪器进行更新,同时更新兴趣区矩形并将其绘制出来
                    for (int i = 0; i < tk_len; i++)
                    {
                        Rect boundingRect = rois[i];
                        trackers[i].Update(frame, ref boundingRect);
                        rois[i] = boundingRect;
                        Cv2.Rectangle(tkImg, boundingRect, new Scalar(0, 255, 0));
                    }
                    //显示追踪结果
                    Cv2.ImShow(tk_winname, tkImg);
                }

                if (k == 32 )
                //按下空格键时,代表开始在常规图像窗口中框选兴趣区
                {
                    Rect rect = Cv2.SelectROI(nm_winname, image);
                    if (rect.Width > 0 && rect.Height > 0)
                    {
                    //当框选兴趣区合理时,兴趣区列表添加该兴趣区
                    //同时对该兴趣区得追踪器进行初始化
                    //并将其添加到追踪器列表中
                    //来实现在下一帧图像中显示出所追踪得区域
                        rois.Add(rect);
                        tracker.Init(frame, rect);
                        trackers.Add(tracker);
                    }

                }
                else if (k == 27)
                {
                    break;
                }
            }
        }

4.多目标追踪效果显示

①框选第一个对象及追踪效果显示
框选对象1追踪对象1效果
②框选第二个对象及1、2目标追踪显示
框选对象2追踪对象1&2效果
③框选第三个对象及1、2、3目标追踪显示框选兴趣区3追踪1&2&3对象效果

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐