我正在开发一个目标追踪程序,用于追踪未知物体。用户必须在实时视频流中选择要追踪的区域。我的项目与这个视频类似。
我已尝试一种方法,但它不够稳健,跟踪器移动很多。所以我要重新开始。请问有人知道如何实现视频中的方法吗?我是emgucv的新手,目前真的不知道从哪里重新开始。
首先是模板匹配方法,我制作了一个可以匹配图像中对象的方法。对于颜色图像,FFT只能用于单频谱图像,您需要将频谱分开并将结果矩阵相加。
Point Location;
private bool Detect_object(Image<Gray, Byte> Area_Image, Image<Gray, Byte> image_object)
{
bool success = false;
//Work out padding array size
Point dftSize = new Point(Area_Image.Width + (image_object.Width * 2), Area_Image.Height + (image_object.Height * 2));
//Pad the Array with zeros
using (Image<Gray, Byte> pad_array = new Image<Gray, Byte>(dftSize.X, dftSize.Y))
{
//copy centre
pad_array.ROI = new Rectangle(image_object.Width, image_object.Height, Area_Image.Width, Area_Image.Height);
CvInvoke.cvCopy(Area_Image, pad_array, IntPtr.Zero);
pad_array.ROI = (new Rectangle(0, 0, dftSize.X, dftSize.Y));
//Match Template
using (Image<Gray, float> result_Matrix = pad_array.MatchTemplate(image_object, TM_TYPE.CV_TM_CCOEFF_NORMED))
{
Point[] MAX_Loc, Min_Loc;
double[] min, max;
//Limit ROI to look for Match
result_Matrix.ROI = new Rectangle(image_object.Width, image_object.Height, Area_Image.Width - image_object.Width, Area_Image.Height - image_object.Height);
result_Matrix.MinMax(out min, out max, out Min_Loc, out MAX_Loc);
Location = new Point((MAX_Loc[0].X), (MAX_Loc[0].Y));
success = true;
Results =result_Matrix.Convert<Gray,Double>();
}
}
return success;
}
Image<Gray, Byte> template_img = Main_Image.Copy(new Rectangle(x, y, 100, 100);
然后,他在原始图像周围设置ROI,以考虑运动。在我们的情况下,假设我们想要一个50像素的模板缓冲区(ROI)。这将等同于初始ROI:
Main_Image.ROI = new Rectangle(x - 50, y - 50, 200, 200);
using( Image<Gray, Byte> img_ROI = Main_Image.Copy(new Rectangle(x - 50, y - 50, 200, 200))
{
Detect_object(img_ROI, template_img)
}
我们使用 using 语句,因为这样可以在我们完成操作后处理多余的图像数据并释放资源。
现在来介绍一下技巧,ROI 实际上由 Detect_object 的结果控制,这就是为什么我们将 Location 作为全局变量保存的原因。一旦成功匹配模板,我们的 using 语句看起来会更像:
using( Image<Gray, Byte> img_ROI = Main_Image.Copy(new Rectangle(Location.X - 50, Location.Y - 50, 200, 200))
{
...
}
除了ROI和模板的矩形大小和位置之外,这基本就是全部内容了。如果你对此有困难,请告诉我,但是代码应该已经准备就绪了。
谢谢,
Chris