我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python简单实现对桌面进行实时捕捉画面

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python简单实现对桌面进行实时捕捉画面

介绍

最近在研究目标检测方面的小东西,需要到对桌面进行实时捕捉画面,获取画面后再检测,达到实时桌面目标检测的目的,所以写了一段小代码来实现该功能,实测速度很快,符合我的需求。特此记录一下。

代码

import argparseimport timeimport cv2import keyboardimport mssimport numpy as npimport win32com.clientimport win32conimport win32guiclass ScreenCapture:    """    parameters    ----------        screen_frame : Tuple[int, int]            屏幕宽高,分别为x,y        region : Tuple[float, float]            实际截图范围,分别为x,y,(1.0, 1.0)表示全屏检测,越低检测范围越小(始终保持屏幕中心为中心)        window_name : str            显示窗口名        exit_key : int            结束窗口的退出键值,为键盘各键对应的ASCII码值,默认是ESC键    """    def __init__(self, screen_frame=(1920, 1080), region=(0.5, 0.5), window_name='test', exit_key=0x1B):        self.parser = argparse.ArgumentParser()        self.parser.add_argument('--region', type=tuple, default=region,     help='截图范围;分别为x,y,(1.0, 1.0)表示全屏检测,越低检测范围越小(始终保持屏幕中心为中心)')        self.parser_args = self.parser.parse_args()        self.cap = mss.mss(mon=-1, optimize=True)  # 实例化mss,并使用高效模式        self.screen_width = screen_frame[0]  # 屏幕的宽        self.screen_height = screen_frame[1]  # 屏幕的高        self.mouse_x, self.mouse_y = self.screen_width // 2, self.screen_height // 2  # 屏幕中心点坐标        # 截图区域        self.GAME_WIDTH, self.GAME_HEIGHT = int(self.screen_width * self.parser_args.region[0]), int(            self.screen_height * self.parser_args.region[1])  # 宽高        self.GAME_LEFT, self.GAME_TOP = int(0 + self.screen_width // 2 * (1. - self.parser_args.region[0])), int(            0 + 1080 // 2 * (1. - self.parser_args.region[1]))  # 原点        self.RESZIE_WIN_WIDTH, self.RESIZE_WIN_HEIGHT = self.screen_width // 4, self.screen_height // 4  # 显示窗口大小        self.mointor = {            'left': self.GAME_LEFT,            'top': self.GAME_TOP,            'width': self.GAME_WIDTH,            'height': self.GAME_HEIGHT        }        self.window_name = window_name        self.Exit_key = exit_key        self.img = None    def grab_screen_mss(self, monitor):        # cap.grab截取图片,np.array将图片转为数组,cvtColor将BRGA转为BRG,去掉了透明通道        return cv2.cvtColor(np.array(self.cap.grab(monitor)), cv2.COLOR_BGRA2BGR)    def update_img(self, img):        self.img = img    def get_img(self):        return self.img    def run(self):        SetForegroundWindow_f = 0  # 判断是否需要置顶窗口        while True:            # 判断是否按下 ctrl+U 窗口始终置顶            if keyboard.is_pressed('ctrl+U'):                while keyboard.is_pressed('ctrl+U'):                    continue                if SetForegroundWindow_f == 0:                    SetForegroundWindow_f = 1                    time.sleep(1)                    continue                else:                    SetForegroundWindow_f = 0            if self.img is None:                img = self.grab_screen_mss(self.mointor)            cv2.namedWindow(self.window_name, cv2.WINDOW_NORMAL)  # cv2.WINDOW_NORMAL 根据窗口大小设置图片大小            cv2.resizeWindow(self.window_name, self.RESZIE_WIN_WIDTH, self.RESIZE_WIN_HEIGHT)            cv2.imshow(self.window_name, img)            if SetForegroundWindow_f == 1:                shell = win32com.client.Dispatch("WScript.Shell")                shell.SendKeys('%')                win32gui.SetForegroundWindow(win32gui.FindWindow(None, self.window_name))                win32gui.ShowWindow(win32gui.FindWindow(None, self.window_name), win32con.SW_SHOW)            if cv2.waitKey(1) & 0XFF == self.Exit_key:  # 默认:ESC                cv2.destroyAllWindows()                exit("结束")

代码讲解

功能实现思路主要是使用 mss 库进行截图,并使用 opencv 库进行图像显示和处理。

首先,使用 argparse 库解析传入的参数,设置检测范围的大小。

然后,使用 mss 库实例化一个截图对象 cap 。

接着,设置屏幕的宽和高,并计算屏幕中心点的坐标。

之后,根据传入的参数计算游戏内截图区域的宽高和原点坐标,并将其保存在变量 mointor 中。

定义了一个函数 grab_screen_mss ,使用 cap.grab 截取图片,并用 np.array 将图片转为数组,然后用 cvtColor 将 BRGA 转为 BRG ,去掉了透明通道。

定义了一个 run 函数,在其中不断循环,判断是否按下 ctrl+U ,若按下,则窗口始终置顶。

然后调用 grab_screen_mss 函数获取截图,使用 cv2 库进行图像显示,并设置显示窗口的大小。

如果窗口需要置顶,则使用 win32com 库和 win32gui 库置顶窗口。

最后,使用 cv2 库的 waitKey 函数等待用户操作,按下 ESC 键退出程序。

调用示例

    sc = ScreenCapture()    sc.run()

参数解释:

   screen_frame : Tuple[int, int]
        屏幕宽高,分别为x,y    region : Tuple[float, float]        实际截图范围,分别为x,y,(1.0, 1.0)表示全屏检测,越低检测范围越小(始终保持屏幕中心为中心)    window_name : str        显示窗口名    exit_key : int        结束窗口的退出键值,为键盘各键对应的ASCII码值,默认是ESC键

其他

键盘各键对应的ASCII码值 (0x指16进制,delete键的ascii码值是0x2e,也即十进制的46)

0x1 鼠标左键
0x2 鼠标右键
0x3 CANCEL 键
0x4 鼠标中键
0x8 BACKSPACE 键
0x9 TAB 键
0xC CLEAR 键
0xD ENTER 键
0x10 SHIFT 键
0x11 CTRL 键
0x12 MENU 键
0x13 PAUSE 键
0x14 CAPS LOCK 键
0x1B ESC 键
0x20 SPACEBAR 键
0x21 PAGE UP 键
0x22 PAGE DOWN 键
0x23 END 键
0x24 HOME 键
0x25 LEFT ARROW 键
0x26 UP ARROW 键
0x27 RIGHT ARROW 键
0x28 DOWN ARROW 键
0x29 SELECT 键
0x2A PRINT SCREEN 键
0x2B EXECUTE 键
0x2C SNAPSHOT 键
0x2D INSERT 键
0x2E DELETE 键
0x2F HELP 键
0x90 NUM LOCK 键

A 至 Z 键与 A – Z 字母的 ASCII 码相同:

值 描述
65 A 键
66 B 键
67 C 键
68 D 键
69 E 键
70 F 键
71 G 键
72 H 键
73 I 键
74 J 键
75 K 键
76 L 键
77 M 键
78 N 键
79 O 键
80 P 键
81 Q 键
82 R 键
83 S 键
84 T 键
85 U 键
86 V 键
87 W 键
88 X 键
89 Y 键
90 Z 键

0 至 9 键与数字 0 – 9 的 ASCII 码相同:

值 描述
48 0 键
49 1 键
50 2 键
51 3 键
52 4 键
53 5 键
54 6 键
55 7 键
56 8 键
57 9 键

下列常数代表数字键盘上的键:

值 描述
0x60 0 键
0x61 1 键
0x62 2 键
0x63 3 键
0x64 4 键
0x65 5 键
0x66 6 键
0x67 7 键
0x68 8 键
0x69 9 键
0x6A MULTIPLICATION SIGN (*) 键
0x6B PLUS SIGN (+) 键
0x6C ENTER 键
0x6D MINUS SIGN (–) 键
0x6E DECIMAL POINT (.) 键
0x6F DIVISION SIGN (/) 键

下列常数代表功能键:

值 描述
0x70 F1 键
0x71 F2 键
0x72 F3 键
0x73 F4 键
0x74 F5 键
0x75 F6 键
0x76 F7 键
0x77 F8 键
0x78 F9 键
0x79 F10 键
0x7A F11 键
0x7B F12 键
0x7C F13 键
0x7D F14 键
0x7E F15 键
0x7F F16 键

来源地址:https://blog.csdn.net/weixin_45371411/article/details/128757738

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python简单实现对桌面进行实时捕捉画面

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python实现对桌面进行实时捕捉画面的方法详解

最近在研究目标检测方面的小东西,需要到对桌面进行实时捕捉画面。所以本文来用Python实现简单的对桌面进行实时捕捉画面,感兴趣的可以了解一下
2023-01-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录