【问题标题】:OpenCV object tracking input formatOpenCV 对象跟踪输入格式
【发布时间】:2020-02-24 17:08:16
【问题描述】:

我正在使用高速相机拍摄的每个样本(+- 100 个样本)大约 5000 张图像。

将它们全部转换为视频文件需要相当长的时间。

我的问题是:是否可以将对象跟踪应用于已排序的图像数组?

我的理解是 OpenCV 跟踪算法从提供的视频文件中提取每一帧,跟踪请求的对象并将结果与​​前一帧进行比较以确定它是否确实是同一个对象。

短版:是否可以向 OpenCV 跟踪算法提供帧而不是视频文件?

【问题讨论】:

    标签: python opencv image-processing video-processing


    【解决方案1】:

    只需稍作修改,您就可以修改 Object Tracking using OpenCV 以处理一系列图像。

    以下代码对文件夹中的图像序列进行跟踪(视频相关代码已注释):

    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
    

    【讨论】:

    • 非常感谢!这正是我想要的。
    猜你喜欢
    • 2014-01-09
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多