【技术分享】Python3 屏幕单目标跟踪 opencv + dlib实现 ( 第六课 )
【技术分享】Python3 屏幕单目标跟踪 opencv + dlib实现 ( 第六课 )
2022-07-23 / 0 评论 / 62 阅读 / 4 点赞

【技术分享】Python3 屏幕单目标跟踪 opencv + dlib实现 ( 第六课 )

发光的神
2022-07-23 / 0 评论 / 62 阅读 / 正在检测是否收录...

简介

dlib提供了dlib.correlation_tracker()类用于跟踪目标,于是自己修改了下直接在屏幕上绘制识别物体,效果一般有时识别会出错。

完整代码

import cv2 
import numpy as np
import dlib, mss, os

window_name = 'Testone'
window_size = 2

sct = mss.mss()
screen_width = 1920
screen_height = 1080

# win_left , win_top, win_width, win_height = screen_width // 3, screen_height // 3, screen_width // 3, screen_height // 3
rwidth, rheight = screen_width // window_size, screen_height // window_size

monitor = {
    'left': 0,
    'top': 0,
    'width': 1920,
    'height': 1080,
}


tracker = dlib.correlation_tracker()  
start_flag = True  
selection = None 
track_window = None
drag_start = None


def onMouseClicked(event, x, y, flags, param):
    global selection, track_window, drag_start 
    if event == cv2.EVENT_LBUTTONDOWN:
        drag_start = (x, y)
        track_window = None
    if drag_start:
        xMin = min(x, drag_start[0])
        yMin = min(y, drag_start[1])
        xMax = max(x, drag_start[0])
        yMax = max(y, drag_start[1])
        selection = (xMin, yMin, xMax, yMax)
    if event == cv2.EVENT_LBUTTONUP:
        drag_start = None
        track_window = selection
        selection = None

cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
cv2.resizeWindow(window_name, rwidth, rheight)
cv2.setMouseCallback(window_name, onMouseClicked)

while True:
    try:
        img = sct.grab(monitor=monitor)
        img = np.array(img)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        
        if start_flag == True: 
            while True:
                img_first = img.copy() 
                if track_window:
                    cv2.rectangle(img_first, (track_window[0], track_window[1]), (track_window[2], track_window[3]), (255,255,255), 2)
                elif selection:
                    cv2.rectangle(img_first, (selection[0], selection[1]), (selection[2], selection[3]), (255,255,255), 2)
                cv2.imshow(window_name, img_first)
                if cv2.waitKey(5) == 13:
                    break
            start_flag = False
            tracker.start_track(gray, dlib.rectangle(track_window[0], track_window[1], track_window[2], track_window[3]))
        else:
            tracker.update(gray)

        box_predict = tracker.get_position()
        cv2.rectangle(img,(int(box_predict.left()),int(box_predict.top())),(int(box_predict.right()),int(box_predict.bottom())),(0,255,255),2) 

        cv2.imshow(window_name, img)
        
        if cv2.waitKey(10) == 27:
            break

    except Exception as e:
        print(e)
        os._exit(0)

cv2.destroyAllWindows()

视频效果

4

评论 (0)

取消
0:00