Opencv Object Tracking【使用OpenCV目标跟踪模块】
实时目标检测如RCNN、Yolo、ssd等方法均能有效实现目标识别任务,在实际应用中针对工业场景中的目标检测方案落地时需注意以下几点:首先由于这些嵌入式系统的硬件性能难以满足高性能计算的要求因此无法直接采用上述高效算法;其次当需要对特定场景下的特定物体进行精确识别时则可考虑采用基于物体检测与跟踪技术结合的目标方案
值得期待的是,在计算机视觉领域有着广泛应用的OpenCV技术集合中拥有8种独立的目标检测算法
OpenCV中的8种目标检测方法
1.BOOSTING Tracker
该算法采用了机器学习结合Haar级联(Adaboost)的方法,在OpenCV 3.0.0框架下实现,并被归类为一种相对落后的技术手段。它虽然运行较慢且整体性能尚欠理想,但主要应用于不同算法间的对比分析与基准测试。
2.MIL Tracker
比boosting具有更好的准确率,但是存在报错的几率。(>opencv3.0.0)
3.KCF Tracker
核相关滤波算法,比上述两种都要快,但是偶然因素下存在失效。(>opencv3.1.0)
4.CSRT Tracker
discriminant correlation filter algorithm在通道和平移不变性方面具有良好的鲁棒性,在识别精度上表现更为出色。然而,在计算效率上略低于KCF。(>opencv3.4.2)
5.MedianFlow Tracker
失效性能良好,然后如果目标变动过大,如移动过快,容易丢失目标。(>opencv3.0.0)
6.TLD Tracker
有一定的假正率,不推荐使用该种OpenCV目标跟踪方法。
7.MOSSE Tracker
极度快速的方法在性能上具有显著优势
8.GOTURN Tracker
这种独特的深度学习方案仅适用于OpenCV平台。它必须依赖特定的模型文件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
