实时对象跟踪——如何让视频一开始播放,让用户暂停,绘制边界框,然后开始跟踪?

问题描述

以下是我发现的用于实时对象跟踪的代码 here


  <div className="details__info">
                        <div className="details__incDec">
                            <span className="dec" onClick={decQuantity}><BsDash /></span>
                            <span className="quantity">{quantity}</span>
                            <span className="inc" onClick={() => setQuantity(quantity + 1)}><bsplus /></span>
                           {localStorage.getItem('email') 
                            ? <button  style={{outline: 'none',fontFamily: "'Comfortaa',cursive"}} className="btn-default"  onClick={cartData}>add to cart</button>
                            : <button  style={{outline: 'none',cursive"}} className="btn-default" onClick={signUpToBuy}>add to cart</button>
                            }
                            {localStorage.getItem('email') 
                            ?   <RiHeart3Fill className="heart"/>
                            :   <RiHeart3Fill  className="heart" style={{color:iconColor}} onClick={()=>setIconColor("red")}/>
                            }
                       </div>
  </div>

它工作正常,但是当您运行程序时,它会在第一帧暂停,直到您绘制边界框以开始跟踪。

我想让视频先播放,然后用户应该能够暂停它,绘制边界框,然后恢复视频以开始跟踪。为此,我替换了以下内容

import cv2
import sys

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

if __name__ == '__main__' :

    # Set up tracker.
    tracker_types = ['BOOSTING','MIL','kcf','TLD','MEDIANFLOW','GOTURN','MOSSE','CSRT']
    tracker_type = tracker_types[1]

    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(0) # 0 means webcam. Otherwise if you want to use a video file,replace 0 with "video_file.MOV")

    # Exit if video not opened.
    if not video.isOpened():
        print ("Could not open video")
        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:
        # 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);

        # 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),2,1)
        else :
            # Tracking failure
            cv2.putText(frame,"Tracking failure detected",(100,80),cv2.FONT_HERShey_SIMPLEX,0.75,(0,255),2)

        # display tracker type on frame
        cv2.putText(frame,tracker_type + " Tracker",20),(50,170,50),2);
    
        # display FPS on frame
        cv2.putText(frame,"FPS : " + str(int(fps)),2);

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

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

这样:

    # Read video
    video = cv2.VideoCapture(0) # 0 means webcam. Otherwise if you want to use a video file,frame = video.read()
    if not ok:
        print ('Cannot read video file')
        sys.exit()

    # Define an initial bounding Box
    bBox = (287,bBox)

当我现在运行程序时,视频一开始就开始播放,但是我一按 while True: # Read video video = cv2.VideoCapture(0) # 0 means webcam. Otherwise if you want to use a video file,replace 0 with "video_file.MOV") # Exit if video not opened. if not video.isOpened(): print ("Could not open video") sys.exit() # Read first frame. ok,frame = video.read() if not ok: print ('Cannot read video file') sys.exit() # Retrieve an image and display it. if(0xFF & cv2.waitKey(10))==ord('p'): # Press key `p` to pause the video to start tracking break cv2.namedWindow("Image",cv2.WINDOW_norMAL) cv2.imshow("Image",frame) cv2.destroyWindow("Image") ,Python 就崩溃了:

enter image description here

我该如何解决这个问题?

编辑:为了清楚起见,在此处粘贴带有替换/替换的整个代码

p

解决方法

你的 if 语句在错误的地方有括号

if(0xFF & cv2.waitKey(10))==ord('p'):

应该

if ((0xFF & cv2.waitKey(10)) == ord('p')):

虽然如果你使用 ord() 你可以直接比较

if (cv2.waitKey(10) == ord('p')):

这是经过一些编辑的代码。它适用于跟踪我的脸。

import cv2
import sys

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

if __name__ == '__main__' :

    # Set up tracker.
    tracker_types = ['BOOSTING','MIL','KCF','TLD','MEDIANFLOW','GOTURN','MOSSE','CSRT']
    tracker_type = tracker_types[1]

    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(0) # 0 means webcam. Otherwise if you want to use a video file,replace 0 with "video_file.MOV")

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

    while True:

        # Read first frame.
        ok,frame = video.read()
        if not ok:
            print ('Cannot read video file')
            sys.exit()
        
        # Retrieve an image and Display it.
        if((0xFF & cv2.waitKey(10))==ord('p')): # Press key `p` to pause the video to start tracking
            break
        cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
        cv2.imshow("Image",frame)
    cv2.destroyWindow("Image");

    # select the 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:
        # 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);

        # 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),2,1)
        else :
            # Tracking failure
            cv2.putText(frame,"Tracking failure detected",(100,80),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,255),2)

        # Display tracker type on frame
        cv2.putText(frame,tracker_type + " Tracker",20),(50,170,50),2);
    
        # Display FPS on frame
        cv2.putText(frame,"FPS : " + str(int(fps)),2);

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

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

我将 videocapture 声明移到了循环之外,这样它就不会在每次循环迭代中都被重建。我在第一次和第二次循环之间重新添加了 ROI 选择器和跟踪器初始化。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...