寻找示例代码以了解如何实现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;
}
我知道几乎没有逻辑缺陷,但我仍然无法在不同的尝试中获得任何结果。
谢谢!
事实证明,这很简单。
首先在您想要的类型中定义一个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);
最后注意:如果有人知道如何提高性能或多线程这种方法,请发表评论。
祝你今天愉快!