代码之家  ›  专栏  ›  技术社区  ›  conv3d

使用python mss在屏幕记录顶部绘制边界框

  •  0
  • conv3d  · 技术社区  · 6 年前

    我有屏幕记录的代码,每一帧我都有一组边界框要显示在每一帧上。我可以用 matplotlib 或者别的,但我 mss 正在以30帧的速度工作,我需要能够快速显示边界框。

    我在医生那里注意到的 this example 但我试着运行它,却无法让它显示任何内容。我甚至不确定这是否适用于我的例子。

    import cv2
    import time
    import numpy as np
    from mss import mss
    
    with mss() as sct:
            # Part of the screen to capture
            monitor = {"top": 79, "left": 265, "width": 905, "height": 586}
    
            while "Screen capturing":
                last_time = time.time()
    
                # Get raw pixels from the screen, save it to a Numpy array
                screen = np.array(sct.grab(monitor))
    
                # print("fps: {}".format(1 / (time.time() - last_time)))
    
                print('loop took {} seconds'.format(time.time()-last_time))
                last_time = time.time()
                screen = cv2.cvtColor(screen, cv2.COLOR_BGR2RGB)
                screen = cv2.resize(screen, (224,224)).astype(np.float32)/255
    
                # Display the picture
                cv2.imshow("OpenCV/Numpy normal", screen)
    
                # Press "q" to quit
                if cv2.waitKey(25) & 0xFF == ord("q"):
                    cv2.destroyAllWindows()
                    break
    

    现在假设我有一组边界框要显示在每个帧上,例如,

    bboxes = [np.array([12, 16, 29, 25]), np.array([5,  5, 38, 35])]
    

    我能以某种方式改变像素来显示这个吗?我想我可以通过 opencv 因为这就是最终显示屏幕的原因。

    编辑:参考关于边界框的注释,它们是 x1, y1, width, height ,并在调整大小后 (224,224) 形象

    1 回复  |  直到 6 年前
        1
  •  1
  •   Berriel    6 年前

    缺少一些详细信息:

    • 边界框的格式是什么: [x1, y1, x2, y2] [x1, y1, width, height] 或者别的什么?
    • 边界框中的值是否已调整大小( 224, 224 )还是原始范围?

    无论如何,您可以使用下面的函数绘制矩形(您需要根据格式进行选择):

    def draw_bboxes(img, bboxes, color=(0, 0, 255), thickness=1):
        for bbox in bboxes:
            # if [x1, y1, x2, y2]
            cv2.rectangle(img, tuple(bbox[:2]), tuple(bbox[-2:]), color, thickness)
            # if [x1, y1, width, height]
            cv2.rectangle(img, tuple(bbox[:2]), tuple(bbox[:2]+bbox[-2:]), color, thickness)
    

    假设你定义了你的 bboxes ,可以调用函数:

    • 如果要在原始帧上绘制:
    # [...]
    screen = np.array(sct.grab(monitor))
    draw_bboxes(screen, bboxes)
    # [...]
    
    • 如果要在调整大小的框架上绘制:
    # [...]
    screen = cv2.resize(screen, (224,224)).astype(np.float32)/255
    draw_bboxes(screen, bboxes)
    # [...]
    

    如果进行了一些更改,完整代码将如下所示:

    import cv2
    import time
    import numpy as np
    from mss import mss
    
    def draw_bboxes(img, bboxes, color=(0, 0, 255), thickness=1):
        for bbox in bboxes:
            cv2.rectangle(img, tuple(bbox[:2]), tuple(bbox[:2]+bbox[-2:]), color, thickness)
    
    # bounding boxes
    bboxes = [np.array([12, 16, 29, 25]), np.array([5,  5, 38, 35])]
    
    with mss() as sct:
        # part of the screen to capture
        monitor = {"top": 79, "left": 265, "width": 905, "height": 586}
        while "Screen capturing":
            # get screen
            last_time = time.time()
            screen = np.asarray(sct.grab(monitor))
            print('loop took {} seconds'.format(time.time()-last_time))
    
            # convert from BGRA --> BGR
            screen = cv2.cvtColor(screen, cv2.COLOR_BGRA2BGR)
            # resize and draw bboxes
            screen = cv2.resize(screen, (224,224))
            draw_bboxes(screen, bboxes)
    
            # display
            cv2.imshow("OpenCV/Numpy normal", screen)
    
            # Press "q" to quit
            if cv2.waitKey(25) & 0xFF == ord("q"):
                cv2.destroyAllWindows()
                break
    

    输出如下:

    enter image description here

    推荐文章