C++ 在计算了一帧上的SIFT或ORB后,如何实时跟踪视频中的对象?

C++ 在计算了一帧上的SIFT或ORB后,如何实时跟踪视频中的对象?,c++,opencv,tracking,object-detection,C++,Opencv,Tracking,Object Detection,基本上,我想检测一个对象,然后在视频中跟踪它(逐帧) 我可以在第一帧检测到它,例如ORB或SIFT。但是对于下一帧(或者说下一个XX帧),我希望避免再次计算所有关键点(ORB或SIFT)以再次检测它 考虑到我想在视频中实时跟踪它,我能做些什么?检测和跟踪视频中的对象是一个非常大的主题,具体方法高度取决于您的应用程序。没有神奇的子弹! 如果您达到了检测部分,您可以尝试通过meanshift on color(可能是HSV颜色空间)进行跟踪,如果您需要跟踪的对象是有色的,或尝试模板匹配,或。。你需要

基本上,我想检测一个对象,然后在视频中跟踪它(逐帧)

我可以在第一帧检测到它,例如ORB或SIFT。但是对于下一帧(或者说下一个XX帧),我希望避免再次计算所有关键点(ORB或SIFT)以再次检测它


考虑到我想在视频中实时跟踪它,我能做些什么?

检测和跟踪视频中的对象是一个非常大的主题,具体方法高度取决于您的应用程序。没有神奇的子弹!
如果您达到了检测部分,您可以尝试通过meanshift on color(可能是HSV颜色空间)进行跟踪,如果您需要跟踪的对象是有色的,或尝试模板匹配,或。。你需要更具体地说明你的需求

一个常见的选项是使用patchtracker。这意味着您只需在前一帧关键点周围8像素的区域中搜索关键点。您可以对关键点周围的区域执行
cv::matchTemplate()
,而不是使用SIFT

执行金字塔搜索有助于提高帧速率。首先以较低的比例搜索,如果找不到关键点,则将比例加倍


如果patchtracker失败,因为图像移动太快,您只需再次应用SIFT来重新初始化系统。我会用FAST而不是SIFT。您可以对标记使用SIFT,然后使用FAST实时检测关键点,生成SIFT描述符。

您可以使用OpticalFlow进行简单跟踪,以下是执行此操作的步骤

  • 使用harris角点检测器或SIFT特征检测器查找运动对象的角点

  • 将这些角点和上一张图像(在其中找到要跟踪的对象的角点)以及下一张图像赋予opticalflow函数,它将在下一张图像中计算同一对象的角点

  • 以下是链接:


    注意:如果要解决遮挡处理、多人跟踪等问题,光靠OpticalFlow无法解决问题。为此,需要使用卡尔曼滤波器或粒子滤波器…

    您可以使用TLD或CLM实现几乎完美的实时跟踪。一旦检测到感兴趣的对象,使用该边界框启动捕食者跟踪。 你可以在这里找到关于CMT的信息

    这里是TLD

    但是,由于您将对单应性进行估计,您可以投影面片,以便它们将被旋转和缩放。您将获得一个近似位置。另一种选择是使用卡尔曼滤波器,因此您将有一个预测单应性,但这不是必需的。前面的单应性将给出搜索路径的大致位置。@Jav_Rock+1,我使用SURF和SVM从实时视频中预测对象它在预测中效果很好,但当我预测一个移动对象时,它会检查并保存包含一个特定移动对象(如车辆)的每一帧。它需要大量内存,所以卡尔曼滤波器也可以用于它?因此,我只能保存一个特定对象的一帧,如果它在接下来的70个连续帧中保留。我希望,如果两个不同的车辆进入,并且它们在摄像机的眼睛中保留100个连续帧,那么我的系统只保存其中的两帧,谢谢我的想法相同,我有相同的问题,但是我在视频中使用SURF+SVM,但是我得到了同一对象的多帧,那么你最终使用哪种技术呢?你能分享吗