使用 OpenCV 进行对象跟踪

Manav Narula 2023年1月30日
  1. OpenCV 中用于对象跟踪的跟踪器
  2. 在 Python 中使用 OpenCV 对象跟踪器
  3. 结论
使用 OpenCV 进行对象跟踪

对象跟踪是计算机视觉中的重要任务之一,具有许多实际应用。在对象跟踪中,我们尝试根据一些给定的参数来区分不同的对象并跟踪它们的运动。

请记住,对象跟踪与对象检测不同。这是因为对象跟踪要快得多,因为我们不倾向于在每一帧中检测对象,这增加了计算量。

对象跟踪在现实生活中最常见的应用是跟踪车辆在道路上的运动。我们可以通过跟踪它们的轨迹来识别不同的车辆并观察它们是否遵守道路规则。

我们可以使用 opencv 库来处理 Python 中的对象跟踪问题。本教程将讨论 opencv 中用于对象跟踪的不同跟踪器。

OpenCV 中用于对象跟踪的跟踪器

第一个跟踪器是基于机器学习的 AdaBoost 算法的 cv2.TrackerBoosting_create。它在运行时使用要跟踪的对象的正负样本进行学习,并且它最近没有很好的跟踪记录,被认为很慢。

然后,我们有了基于 MIL 算法的 cv2.TrackerMIL_create 跟踪器。它是作为对 BOOSTING 跟踪器的改进而构建的,它基于正样本附近的类似概念和因素来区分对象,从而提高整体准确性。

cv2.TrackerKCF_create 跟踪器基于对 MIL 中多个正匹配的重叠区域的数学方法。KCF 的完整形式是 Kernelized Correlation Filters,它被认为是一个不错的跟踪器,在跟踪单个对象时效果很好。

cv2.TrackerCSRT_create 跟踪器基于具有通道和空间可靠性的判别相关滤波器。它使用有助于选择所需对象的空间可靠性图过滤掉部分帧,并且对于较低的帧速率,它提供了响亮的高精度。

cv2.TrackerMedianFlow_create 跟踪器是一种高级跟踪器,旨在最大限度地减少跟踪失败并选择最可靠的路径。实时检测对象,计算其向前和向后运动的位移,并比较两个值之间的误差和差异的测量值,以跟踪给定对象的轨迹。

我们还有 cv2.TrackerTLD_create 跟踪器。TLD 代表跟踪、学习和检测,它逐帧跟踪对象的轨迹。它使用前一帧的位置来纠正和改进跟踪。

如果需要,检测器部分用于使用前一帧校正跟踪器。它非常有效地处理对象重叠。

cv2.TrackerMOSSE_create 跟踪器,其中 MOSSE 代表平方误差的最小输出和,使用傅里叶空间中的自适应相关性来跟踪对象。它使用这些相关值并尝试最小化实际相关性和预测相关性之间的平方误差之和。

该跟踪器具有很高的跟踪速度,可以很好地适应光线和物体周围环境的变化。

在 Python 中使用 OpenCV 对象跟踪器

我们将在示例中使用 cv2.TrackerKCF_create 跟踪器来跟踪对象。我们将从使用 capture() 函数读取示例视频开始。

然后,我们初始化一个跟踪对象的变量。最初,它被指定为 none 并运行一个循环,逐帧读取此视频。

最初,我们检查在前一帧中是否进行了跟踪,如果初始化变量不是 none,则继续进行。如果没有,我们使用 selectROI 功能选择我们想要跟踪的对象。

之后,我们使用定义的跟踪器对象在每一帧中跟踪这个对象并显示跟踪信息。

代码示例:

import cv2
import imutils

vid = cv2.VideoCapture("sample1.mp4")
initial_box = None
tracker = cv2.TrackerKCF_create()
while True:
    fr = vid.read()
    if fr is None:
        break
    if initial_box is not None:
        (success, box) = tracker.update(fr)
        if success:
            (x, y, w, h) = [int(v) for v in box]
            cv2.rectangle(fr, (x, y), (x + w, y + h), (0, 255, 0), 2)
        fps.update()
        fps.stop()
        information = [
            ("Success", "Yes" if success else "No"),
            ("FPS", "{:.3f}".format(fps.fps())),
        ]
        for (i, (k, v)) in enumerate(information):
            text = "{}: {}".format(k, v)
            cv2.putText(
                fr,
                text,
                (10, H - ((i * 20) + 20)),
                cv2.FONT_HERSHEY_SIMPLEX,
                0.6,
                (0, 0, 255),
                2,
            )
        cv2.imshow("Output Frame", fr)
        key = cv2.waitKey(1) & 0xFF
    initial_box = cv2.selectROI("fr", fr, fromCenter=False, showCrosshair=True)
    tracker.init(fr, initial_box)
    fps = FPS().start()

cv2.destroyAllWindows()

结论

我们讨论了 opencv 库中用于对象跟踪的不同算法。首先,我们讨论了对象跟踪及其在现实生活中的用途。

然后,我们详细讨论了 opencv 库的八个可用跟踪器以及使用这些跟踪器处理对象跟踪的示例代码。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

相关文章 - Python OpenCV