C#-OPENCVSHARP多目标追踪-传统算法
C#-opencvsharp传统算法KCF实现多目标追踪
·
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、2目标追踪显示
③框选第三个对象及1、2、3目标追踪显示
更多推荐
所有评论(0)