首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EmguCV中的目标跟踪

EmguCV中的目标跟踪
EN

Stack Overflow用户
提问于 2012-01-05 18:22:34
回答 2查看 18K关注 0票数 3

我正在构建一个应该跟踪未知对象的对象跟踪程序。用户必须在实况视频流中选择应该被跟踪的区域。我的项目类似于这个视频。

http://www.youtube.com/watch?v=G5GLIKIkd6E

我已经尝试了一种方法,但它不够健壮,跟踪器移动了很多。所以我又从头开始了。

有谁知道我如何想出视频中的那个方法?我是emgucv的新手,到目前为止,我真的不知道从哪里开始。

EN

回答 2

Stack Overflow用户

发布于 2012-01-06 18:40:37

视频建议模板匹配,由于速度的原因,我认为它更可能是一种FFT (快速傅立叶变换)方法,这在EMGU中实现起来相当容易,但要使其完美却很难。

模板匹配

首先,模板匹配法我做了一个方法,它将匹配你输入的图像中的对象,FFT只适用于单一光谱图像,对于颜色,你必须拆分光谱,并将结果矩阵相加在一起:

代码语言:javascript
复制
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;
}

大多数人忘记的事情是用零填充数组,类似于我们使用的模板大小,因为这对fft方法没有影响。我们填充矩阵,否则我们不能正确处理边缘周围的数据,我们可能会错过匹配项。

第二点,我不能强调这是多么重要的一点,那就是方法将在此刻返回一个匹配到对象的左上角。result_Matrix.MinMax查找对象最有可能匹配的位置。您需要尝试的内容有很多,所以如果有更多的问题,请在此处或EMGU进行咨询,我将在可能的时候提供帮助。我也会复制并粘贴这个解决方案。

视频中的方法

好吧,我会让你来编写大部分代码,因为我被困在了时间上,但实际上用户使用了颜料盒的click事件来查找图像中对象的set e.X和e.Y位置。模板的大小固定为100x100

代码语言:javascript
复制
Image<Gray, Byte> template_img = Main_Image.Copy(new Rectangle(x, y, 100, 100);

然后,他在考虑到运动的对象周围的原始图像上设置ROI。在我们的例子中,假设我们想要一个大约50像素的模板的缓冲区(ROI)。这将等同于初始ROI:

代码语言:javascript
复制
Main_Image.ROI = new Rectangle(x - 50, y - 50, 200, 200);

现在,由于处理图像的ROI,我们可以减慢处理速度,并再次显示原始图像,因此最好这样做:

代码语言:javascript
复制
using( Image<Gray, Byte> img_ROI = Main_Image.Copy(new Rectangle(x - 50, y - 50, 200, 200))
{
    Detect_object(img_ROI, template_img)
}

我们使用using语句,因为这会在我们完成操作时处理额外的图像数据,并释放资源。

现在,对于技巧,感兴趣区域实际上是由Detect_object的结果控制的,这就是为什么我们将位置作为全局变量。一旦我们成功地匹配了模板,我们的using语句将看起来更像这样:

代码语言:javascript
复制
using( Image<Gray, Byte> img_ROI = Main_Image.Copy(new Rectangle(Location.X - 50, Location.Y - 50, 200, 200)) 
{
    ...
}

这几乎是除了矩形的ROI和模板,大小和位置是绘制在图像上,如果你有问题,请让我知道,但代码应该很容易在那里,

干杯,

克里斯

票数 8
EN

Stack Overflow用户

发布于 2012-01-05 22:46:08

这段视频似乎使用了与加里·布拉德斯基描述的CAMSHIFT method相似的东西。Here是camshift演示应用程序的C++代码,我知道它不是C#,但希望它可以很容易地移植到EmguCV。Here是camshift算法核心的文档。

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8740869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档