Python OpenCV:如何在不间断视频流中选取ROI进行目标跟踪
OpenCV实时视频流自定义ROI选取后跟踪异常
我正在学习OpenCV目标跟踪教程,该教程通过视频流的静态截图创建ROI来实现基础目标跟踪(非检测)。我需要在摄像头/视频流播放过程中(不暂停、不打开新窗口)选取Bounding Box,但标准的cv2.selectROI()会打开新窗口并暂停视频流,不符合需求。
参考相关内容后,我实现了鼠标事件来在实时视频上绘制矩形,但将自定义BBox坐标传入OpenCV跟踪器后出现异常。尝试过的旧示例到2022年已过时,现在能触发跟踪器,但初始BBox并未出现在鼠标选取的位置。
我的设置规则:两次左键点击创建BBox,一次右键点击移除BBox并停止跟踪,相关代码如下:
import cv2, sys (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.') print(cv2.__version__) video = cv2.VideoCapture(r'C:\Users\longc\Downloads\race_test.mp4') cv2.namedWindow('Frame', cv2.WINDOW_NORMAL) import selectinwindow # Our ROI, defined by two points p1, p2 = None, None state = 0 bbox = (0,50,100,150) # Set up tracker. # Instead of MIL, you can also use cv2.namedWindow("Frame", cv2.WINDOW_NORMAL) tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'CSRT', 'MOSSE'] tracker_type = tracker_types[6] if int(major_ver) < 4 and int(minor_ver) < 3: tracker = cv2.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 == 'CSRT': tracker = cv2.TrackerCSRT_create() if tracker_type == 'MOSSE': tracker = cv2.legacy.TrackerMOSSE_create() # Called every time a mouse event happen def on_mouse(event, x, y, flags, userdata): global state, p1, p2, bbox, val, tracker, frame # Left click if event == cv2.EVENT_LBUTTONUP: # Select first point if state == 0: p1 = (x, y) state += 1 # Select second point elif state == 1: p2 = (x, y) state += 1 bbox = p1 + p2 print(p1,p2) print(bbox) # Initialize tracker with first frame and bounding box if int(major_ver) < 4 and int(minor_ver) < 3: tracker = cv2.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 == 'CSRT': tracker = cv2.TrackerCSRT_create() if tracker_type == 'MOSSE': tracker = cv2.legacy.TrackerMOSSE_create() val = tracker.init(frame, bbox) # Right click (erase current ROI) if event == cv2.EVENT_RBUTTONUP: p1, p2 = None, None state = 0 val = tracker.init(frame, bbox) # Register the mouse callback cv2.setMouseCallback('Frame', on_mouse) test_counter = 0 while video.isOpened(): val, frame = video.read() if not val: break # If a ROI is selected, draw it if state > 1: #cv2.rectangle(frame, p1, p2, (255, 0, 0), 1) # Read a new frame val, frame = video.read() if not val: break # Start timer timer = cv2.getTickCount() # Update tracker val, bbox = tracker.update(frame) # Calculate Frames per second (FPS) fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer); # Draw bounding box if val: # 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) cv2.putText(frame, "Tracking Successful", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2) 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, (255, 127, 0), 2); # Show image cv2.imshow('Frame', frame) # Let OpenCV manage window events key = cv2.waitKey(50) # If ESCAPE key pressed, stop if key == 27: video.release() # Delayed test console test_counter += 1 if test_counter % 30 == 0: print("Current BBox: {}".format(str(bbox))) print(val) #print(frame) print(tracker)
内容的提问来源于stack exchange,提问作者ansib1e
相关产品推荐
相关产品推荐

