opencv视频跟踪「建议收藏」

什么是对象跟踪?简而言之,在视频的连续帧中定位对象称为跟踪。该定义听起来很直接,但在计算机视觉和机器学习中,跟踪是一个非常广泛的术语,涵盖概念上相似但技术上不同的想法。例如,通常在对象跟踪下研究以下所有不同但相关的想法密集光流:这些算法有助于估计视频帧中每个像素的运动矢量。 稀疏光流:这些算法,如Kanade-Lucas-Tomashi(KLT)特征跟踪器,跟踪图像中几个特征点的位置…

大家好,又见面了,我是你们的朋友全栈君。

什么是对象跟踪?

简而言之,在视频的连续帧中定位对象称为跟踪

该定义听起来很直接,但在计算机视觉和机器学习中,跟踪是一个非常广泛的术语,涵盖概念上相似但技术上不同的想法。例如,通常在对象跟踪下研究以下所有不同但相关的想法

  1. 密集光流:这些算法有助于估计视频帧中每个像素的运动矢量。
  2. 稀疏光流:这些算法,如Kanade-Lucas-Tomashi(KLT)特征跟踪器,跟踪图像中几个特征点的位置。
  3. 卡尔曼滤波:一种非常流行的信号处理算法,用于根据先前的运动信息预测运动物体的位置。该算法的早期应用之一是导弹制导!还提到这里,“是指导阿波罗11号登月舱的降落到月球车载计算机有一个卡尔曼滤波器”。
  4. Meanshift和Camshift:这些是用于定位密度函数的最大值的算法。它们也用于跟踪。
  5. 单个对象跟踪器:在此类跟踪器中,第一帧使用矩形标记,以指示我们要跟踪的对象的位置。然后使用跟踪算法在后续帧中跟踪对象。在大多数实际应用中,这些跟踪器与物体检测器结合使用。
  6. 多个对象跟踪查找算法:在我们有快速对象检测器的情况下,检测每个帧中的多个对象然后运行跟踪查找算法来识别一个帧中的哪个矩形对应于下一帧中的矩形是有意义的。

跟踪与检测

如果你曾经玩过OpenCV人脸检测,你知道它可以实时工作,你可以轻松地检测每一帧中的脸部。那么,为什么你需要首先进行跟踪?让我们探讨一下您可能想要跟踪视频中对象的不同原因,而不仅仅是重复检测。

  1. 跟踪比检测更快:通常跟踪算法比检测算法更快。原因很简单。当您跟踪在前一帧中检测到的对象时,您对该对象的外观了解很多。您还可以知道前一帧中的位置以及其运动的方向和速度。因此,在下一帧中,您可以使用所有这些信息来预测下一帧中对象的位置,并围绕对象的预期位置进行小搜索,以准确定位对象。一个好的跟踪算法将使用它对该对象的所有信息,而检测算法总是从头开始。因此,在设计有效系统时,通常每隔n 次运行一次物体检测在其间的n-1帧中采用跟踪算法的帧。为什么我们不直接检测第一帧中的对象并随后跟踪?确实,跟踪可以从它拥有的额外信息中受益,但是当它们长时间落在障碍物后面时,或者如果它们移动速度太快以至于跟踪算法无法赶上时,您也可能会失去对象的跟踪。跟踪算法累积错误也很常见,跟踪对象的边界框会慢慢偏离其正在跟踪的对象。为了通过跟踪算法解决这些问题,每隔一段时间运行一次检测算法。检测算法在对象的大量示例上进行训练。因此,他们对对象的一般类有更多的了解。另一方面,
  2. 当检测失败时,跟踪可以提供帮助:如果您在视频上运行人脸检测器并且人脸被对象遮挡,则人脸检测器很可能会失败。另一方面,良好的跟踪算法将处理某种程度的遮挡。在下面的视频中,您可以看到MIL跟踪器的作者Boris Babenko博士演示MIL跟踪器如何在遮挡下工作。
  3. 跟踪保留标识:对象检测的输出是包含对象的矩形数组。但是,该对象没有附加标识。例如,在下面的视频中,检测红点的检测器将输出对应于它在帧中检测到的所有点的矩形。在下一帧中,它将输出另一个矩形数组。在第一帧中,特定点可以由阵列中位置10处的矩形表示,并且在第二帧中,它可以在位置17处。当在帧上使用检测时,我们不知道哪个矩形对应于哪个对象。另一方面,跟踪提供了一种字面连接点的方法!

#include <opencv2/opencv.hpp>

#include <opencv2/tracking.hpp>

#include <opencv2/core/ocl.hpp>

 

using namespace cv;

using namespace std;

 

// Convert to string

#define SSTR( x ) static_cast< std::ostringstream & >( \

( std::ostringstream() << std::dec << x ) ).str()

 

int main(int argc, char **argv)

{

    // List of tracker types in OpenCV 3.4.1

    string trackerTypes[8] = {
"BOOSTING", "MIL", "KCF", "TLD","MEDIANFLOW", "GOTURN", "MOSSE", "CSRT"};

    // vector <string> trackerTypes(types, std::end(types));

 

    // Create a tracker

    string trackerType = trackerTypes[2];

 

    Ptr<Tracker> tracker;

 

    #if (CV_MINOR_VERSION < 3)

    {

        tracker = Tracker::create(trackerType);

    }

    #else

    {

        if (trackerType == "BOOSTING")

            tracker = TrackerBoosting::create();

        if (trackerType == "MIL")

            tracker = TrackerMIL::create();

        if (trackerType == "KCF")

            tracker = TrackerKCF::create();

        if (trackerType == "TLD")

            tracker = TrackerTLD::create();

        if (trackerType == "MEDIANFLOW")

            tracker = TrackerMedianFlow::create();

        if (trackerType == "GOTURN")

            tracker = TrackerGOTURN::create();

        if (trackerType == "MOSSE")

            tracker = TrackerMOSSE::create();

        if (trackerType == "CSRT")

            tracker = TrackerCSRT::create();

    }

    #endif

    // Read video

    VideoCapture video("videos/chaplin.mp4");

     

    // Exit if video is not opened

    if(!video.isOpened())

    {

        cout << "Could not read video file" << endl;

        return 1;

    }

 

    // Read first frame

    Mat frame;

    bool ok = video.read(frame);

 

    // Define initial bounding box

    Rect2d bbox(287, 23, 86, 320);

 

    // Uncomment the line below to select a different bounding box

    // bbox = selectROI(frame, false);

    // Display bounding box.

    rectangle(frame, bbox, Scalar( 255, 0, 0 ), 2, 1 );

 

    imshow("Tracking", frame);

    tracker->init(frame, bbox);

     

    while(video.read(frame))

    {    

        // Start timer

        double timer = (double)getTickCount();

         

        // Update the tracking result

        bool ok = tracker->update(frame, bbox);

         

        // Calculate Frames per second (FPS)

        float fps = getTickFrequency() / ((double)getTickCount() - timer);

         

        if (ok)

        {

            // Tracking success : Draw the tracked object

            rectangle(frame, bbox, Scalar( 255, 0, 0 ), 2, 1 );

        }

        else

        {

            // Tracking failure detected.

            putText(frame, "Tracking failure detected", Point(100,80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0,0,255),2);

        }

         

        // Display tracker type on frame

        putText(frame, trackerType + " Tracker", Point(100,20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50,170,50),2);

         

        // Display FPS on frame

        putText(frame, "FPS : " + SSTR(int(fps)), Point(100,50), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50,170,50), 2);

 

        // Display frame.

        imshow("Tracking", frame);

         

        // Exit if ESC pressed.

        int k = waitKey(1);

        if(k == 27)

        {

            break;

        }

 

    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127650.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Postman安装与简单使用[通俗易懂]

    Postman安装与简单使用[通俗易懂]Postman使用参考文档:1.官方英文文档2.chrome插件整理的postman中文使用教程Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。官方网站:https://www.getpostman.com/下载1>、postman下载地址:1.PostmanforMAC2.Postman..

  • 从CentOS官网下载系统镜像详细教程[通俗易懂]

    从CentOS官网下载系统镜像详细教程[通俗易懂]1、CentoS简介    CentOS(CommunityEnterpriseOperatingSystem,社区企业操作系统)是一个基于RedHatLinux提供的可自由使用源代码的企业级Linux发行版本,以高效、稳定著称。它使用与RedHat相同的源代码编译而成,而且是开源免费的,因此有些要求高度稳定性的服务器以CentOS替代商业版的RedHatEnterpris…

  • unix命令大全详解-完整版_command方式:

    unix命令大全详解-完整版_command方式:UNIX命令大全详解-完整版command方式:任何输入都会作为编辑命令,而不会出现在屏幕上,若输入错误则有“岬”的声音;任何输入都引起立即反映insert方式:任何输入的数据都置于编辑寄存器。在command方式下输入(I,a,A等),可进入in

  • python3、sqlmap下载与安装教程

    一、前提需要安装python3,可以参考其他教程二、下载官网下载http://sqlmap.org/三、安装将下载的sqlmap.zip解压到文件夹sqlmap中,并拷贝到Python安装路径下四、配置在桌面上创建一个cmd进入python的快捷方式(这步可以不做,只是比较方便启动),右键新建快捷方式输入cmd快捷方式命名可随意,不作要求,这里用sqlmap右键–属性修改起始位置为sqlmap文件夹路径测试启动sqlmap,双击刚才创建的快捷方式,

  • MDaemon退信之本域收发

    MDaemon退信之本域收发

  • 挖矿病毒处理记录「建议收藏」

    挖矿病毒处理记录「建议收藏」wnTKYg进程发现 执行top 会发现此进程。wnTKYg应该是利用redis漏洞入侵,加了定时任务,每一段时间向固定地址发送请求,执行挖矿程序后导致cpu和带宽升高,kill进程会自动重启。检查authorized_keys、known_hosts文件[root@zfr~]#cd/root/.ssh[root@zfr~]#catauth…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号