Opencv Object Tracking【使用OpenCV目标跟踪模块】

  • Post author:
  • Post category:其他


实时目标检测如RCNN,yolo,ssd等都是可行的解决方案,但对于工业目标检测方案落地,一些嵌入式系统架构的硬件性能不能达到这样的高性能计算要求,或者当需要对特定目标进行检测识别时,这时可以采取的方案是检测+跟踪。

不要惊奇我们常用的OpenCV中包含着8种独立的目标检测方法,可以在计算机视觉中进行应用。

OpenCV中的8种目标检测方法

1.BOOSTING Tracker

该算法是基于机器学习汇总我的Haar级联(Adaboost)算法,是一种较为落后的一种方法,比较的慢,性能也不是很好,主要用来做算法的比较和基准。(>opencv3.0.0)

2.MIL Tracker

比boosting具有更好的准确率,但是存在报错的几率。(>opencv3.0.0)

3.KCF Tracker

核相关滤波算法,比上述两种都要快,但是偶然因素下存在失效。(>opencv3.1.0)

4.CSRT Tracker

判别相关滤波算法,具有通道和空间可靠性,比KCF准确率更高,但是相对慢。(>opencv3.4.2)

5.MedianFlow Tracker

失效性能良好,然后如果目标变动过大,如移动过快,容易丢失目标。(>opencv3.0.0)

6.TLD Tracker

有一定的假正率,不推荐使用该种OpenCV目标跟踪方法。

7.MOSSE Tracker

非常非常快,但是准确率没有CSRT和KCF高,如果对帧率要求很高,这是可行的方法。

8.GOTURN Tracker

这种唯一一个使用深度学习的OpenCV的方法。需要额外的模型文件caffe网络结构文件caffemode+prototext,并且基于caffe框架。

先给建议,再给实操。

使用CSRT当需要非常高的跟踪准确率。并且可以容忍慢一些的帧率。

使用KCF,当需要较快的FPS,但同时能够容忍轻微弱的准确率。

使用MOSSE,当需要非常高的FPS。

opencv_object_tracker.py

from imutils.video import VideoSteram
from imutils.video import FPS
import argparse
import imutils
import time
import cv2

#pip install --upgrade imutils

ap = argparse.ArgumentParse()
ap.add_argument("-v", "--video", type=str, help="path to input video files"
ap.add_argument("-t", "--tracker", type=str, default="kcf", help="opencv object tracker type")
args = vars(ap.parse_args())

(major, minor) = cv2.__version__.split(".")[:2]

if int(majot) ==3 and int(minor) <3:
    tracker=cv2.Tracker_create(args["tracker"]).upper()
else:
    OPENCV_OBJECT_TRACKERS ={
        "csrt":cv2.TrackerCSRT_create,
        "kcf":cv2.TrckerCKF_create,
        "mil":cv2.TrckerMIL_create,
        "tld":cv2.TrckerTLD_create,
        "medianflow":cv2.TrackerMedianFlow_create,
        "mosse":cv2.TrackerMOSSE_create
    }
    tarcker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()
initBB =None

if not args.get("video", False):
    print("[INFO]starting video stream...")
    vs = VideoStream(src=0).start()
    time.sleep(1.0)

else:
    vs = cv2.VideoCapture(arg["vide"])
fps=None

while True:
    frame = vs.read()
    frame=frame[1] if args.get("video", False) else frame

    if frame is None:
        break

    frame = imutils.resize(frame, width=500)
    (H, W) = frame.shape[:2]
    
    if intiBB is not None:
        if success:
            (x, y, w, h)=[int(v) for v in box]
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255,0),2)
        fps.update()
        fps.stop()

        info=[
            ("Tracker", args["tracker"]),
            ("Success", "Yes", if success else "No"),
            ("FPS", "{:.2f}".format(fps.fps())),
        ]
        
        for (i, (k, v)) in enumerate(info):
            text="{}:{}".format(k ,v)
            cv2.puttext(frame, text, (10, H - ((i*10) +20)), 
                cv2.FONT_HERSHEY_SIMPLE, 0.6, (0,0,255),2)

    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1) && oxff

    if key == ord("s"):
        initBB =cv2.selectROI("Frame", frame, fromCenter=False, showCrosshair=True)
        tracker.init(frame, initBB)
        fps == FPS().start()
    elif key == ord("q"):
         break
if not args.get("video", False):
    vs.stop()
else:
    vs.release()

cv2.desrtoyAllWindows()
   

python opecv_object_tracking.py –video 1.mp4 –tracker csrt



版权声明:本文为Synioe原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。