C#中的EmguCV Tracker实现

问题描述 投票:0回答:1

寻找示例代码以了解如何实现EmguCV跟踪器。我在这个写得不好的代码中尝试了一些东西:

class ObjectTracker
{
Emgu.CV.Tracking.TrackerCSRT tracker = new Emgu.CV.Tracking.TrackerCSRT();
bool isActive = false;
public bool trackerActive = false;
public void Track(Bitmap pic, Rectangle selection,out Rectangle bound)
{   
    Rectangle result = new Rectangle();
    Bitmap bitmap=pic; //This is your bitmap
    Emgu.CV.Image<Bgr, Byte> imageCV = new Emgu.CV.Image<Bgr, byte>(bitmap); //Image Class from Emgu.CV
    Emgu.CV.Mat mat = imageCV.Mat; //This is your Image converted to Mat

    if (tracker.Init(mat,selection))
    {
        while (tracker.Update(mat, out bound))
        {
           result = bound;
        }
    }
    bound = result;     
} 

我知道几乎没有逻辑缺陷,但我仍然无法在不同的尝试中获得任何结果。

谢谢!

c# .net image emgucv
1个回答
0
投票

事实证明,这很简单。

首先在您想要的类型中定义一个Tracker。

例:

Emgu.CV.Tracking.TrackerCSRT Tracker= new Emgu.CV.Tracking.TrackerCSRT();

然后在扫描选定区域(RoI)之前,您需要初始化跟踪器

例:

Tracker.Initimage, roi);

重要说明:图像必须是Emgu.CV.Mat,roi Drawing.Rectangle的类型。要将Bitmap转换为Mat,您可以使用以下方法:

例:

public Emgu.CV.Mat  toMat(Bitmap pic)
{
Bitmap bitmap=pic; 
Emgu.CV.Image<Bgr, Byte> imageCV = new Emgu.CV.Image<Bgr, byte>(bitmap); 
Emgu.CV.Mat mat = imageCV.Mat; 
return mat;
}

注意:此代码属于stackoverflow中的其他人,我忘记了源代码。感谢他/她。

最后使用以下语句将返回包含被跟踪对象的Rectangle。 Trick是对象不返回Rectangle作为方法输出,它通过out语句返回它。

tracker.Update(image, out roi);

最后注意:如果有人知道如何提高性能或多线程这种方法,请发表评论。

祝你今天愉快!

© www.soinside.com 2019 - 2024. All rights reserved.