简体   繁体   English

OpenCV 对象跟踪输入格式

[英]OpenCV object tracking input format

I'm working with approximately 5000 images per sample (+- 100 samples) taken by a high speed camera.我正在处理由高速相机拍摄的每个样本(+- 100 个样本)大约 5000 张图像。

Converting them all to video files would take quite some time.将它们全部转换为视频文件需要相当长的时间。

My question is: is it possible to apply object tracking to a sorted array of images?我的问题是:是否可以将对象跟踪应用于已排序的图像数组?

My understanding is that the OpenCV tracking algorithms extracts each frame from the provided video file, tracks the requested object(s) and compares the result with the previous frame to determine if it is indeed the same object.我的理解是 OpenCV 跟踪算法从提供的视频文件中提取每一帧,跟踪请求的对象并将结果与​​前一帧进行比较以确定它是否确实是同一个对象。

Short version: Is it possible to provide frames instead of a video file to the OpenCV tracking algorithms?简短版本:是否可以向 OpenCV 跟踪算法提供帧而不是视频文件?

With few modifications you can modify Object Tracking using OpenCV to work with a sequence of images.只需稍加修改,您就可以使用 OpenCV修改对象跟踪以处理一系列图像。

The following code applies tracking on images sequence in a folder (the video related code is commented):以下代码对文件夹中的图像序列应用跟踪(视频相关代码已注释):

import cv2
import cv2
import os
import glob
import sys

# https://www.quora.com/How-can-I-read-multiple-images-in-Python-presented-in-a-folder
img_dir = "C:/Images"  # Enter Directory of all images 
data_path = os.path.join(img_dir, "*.tif") #Assume images are in tiff format
img_files = glob.glob(data_path)

# Display image for testing:
##############################
#for f1 in img_files:
#    img = cv2.imread(f1)
#    cv2.imshow('img', img)
#    cv2.waitKey(1000)

#cv2.destroyAllWindows()
##############################


# https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/

(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')

# Set up tracker.
# Instead of MIL, you can also use

tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN', 'MOSSE', 'CSRT']
tracker_type = tracker_types[2]

if int(minor_ver) < 3:
    tracker = cv2.Tracker_create(tracker_type)
else:
    if tracker_type == 'BOOSTING':
        tracker = cv2.TrackerBoosting_create()
    if tracker_type == 'MIL':
        tracker = cv2.TrackerMIL_create()
    if tracker_type == 'KCF':
        tracker = cv2.TrackerKCF_create()
    if tracker_type == 'TLD':
        tracker = cv2.TrackerTLD_create()
    if tracker_type == 'MEDIANFLOW':
        tracker = cv2.TrackerMedianFlow_create()
    if tracker_type == 'GOTURN':
        tracker = cv2.TrackerGOTURN_create()
    if tracker_type == 'MOSSE':
        tracker = cv2.TrackerMOSSE_create()
    if tracker_type == "CSRT":
        tracker = cv2.TrackerCSRT_create()

# Read video
#video = cv2.VideoCapture("videos/chaplin.mp4")

# Exit if video not opened.
#if not video.isOpened():
#    print "Could not open video"
#    sys.exit()

if not img_dir:
    print("Images folder is empty")
    sys.exit()

# Read first image
frame = cv2.imread(img_files[0])

if frame is None:
    print("Cannot read image file")
    sys.exit()

# Read first frame.
#ok, frame = video.read()
#if not ok:
#    print 'Cannot read video file'
#    sys.exit()

# Define an initial bounding box
bbox = (287, 23, 86, 320)

# Uncomment the line below to select a different bounding box
bbox = cv2.selectROI(frame, False)

# Initialize tracker with first frame and bounding box
ok = tracker.init(frame, bbox)

#while True:

# Iterate image files instead of reading from a video file
for f1 in img_files:
    frame = cv2.imread(f1)

    # Read a new frame
    #ok, frame = video.read()
    #if not ok:
    #    break

    # Start timer
    timer = cv2.getTickCount()

    # Update tracker
    ok, bbox = tracker.update(frame)

    # Calculate Frames per second (FPS)
    #fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);

    fps = 30 # We don't know the fps from the set of images

    # Draw bounding box
    if ok:
        # Tracking success
        p1 = (int(bbox[0]), int(bbox[1]))
        p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
        cv2.rectangle(frame, p1, p2, (255,0,0), 2, 1)
    else:
        # Tracking failure
        cv2.putText(frame, "Tracking failure detected", (100,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2)

    # Display tracker type on frame
    cv2.putText(frame, tracker_type + " Tracker", (100,20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50),2);

    # Display FPS on frame
    cv2.putText(frame, "FPS : " + str(int(fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2);

    # Display result
    cv2.imshow("Tracking", frame)

    # Exit if ESC pressed
    k = cv2.waitKey(1) & 0xff 

    if k == 27:
        break

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM