欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面的方法詳解

 更新時(shí)間:2023年01月28日 09:49:00   作者:奧怪的小棧  
最近在研究目標(biāo)檢測(cè)方面的小東西,需要到對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面。所以本文來(lái)用Python實(shí)現(xiàn)簡(jiǎn)單的對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面,感興趣的可以了解一下

介紹

最近在研究目標(biāo)檢測(cè)方面的小東西,需要到對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面,獲取畫(huà)面后再檢測(cè),達(dá)到實(shí)時(shí)桌面目標(biāo)檢測(cè)的目的,所以寫(xiě)了一段小代碼來(lái)實(shí)現(xiàn)該功能,實(shí)測(cè)速度很快,符合我的需求。特此記錄一下。

代碼

import argparse
import time
import cv2
import keyboard
import mss
import numpy as np
import win32com.client
import win32con
import win32gui


class ScreenCapture:
    """
    parameters
    ----------
        screen_frame : Tuple[int, int]
            屏幕寬高,分別為x,y
        region : Tuple[float, float]
            實(shí)際截圖范圍,分別為x,y,(1.0, 1.0)表示全屏檢測(cè),越低檢測(cè)范圍越小(始終保持屏幕中心為中心)
        window_name : str
            顯示窗口名
        exit_key : int
            結(jié)束窗口的退出鍵值,為鍵盤(pán)各鍵對(duì)應(yīng)的ASCII碼值,默認(rèn)是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)表示全屏檢測(cè),越低檢測(cè)范圍越小(始終保持屏幕中心為中心)')
        self.parser_args = self.parser.parse_args()

        self.cap = mss.mss(mon=-1, optimize=True)  # 實(shí)例化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  # 屏幕中心點(diǎn)坐標(biāo)

        # 截圖區(qū)域
        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]))  # 原點(diǎn)

        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將圖片轉(zhuǎn)為數(shù)組,cvtColor將BRGA轉(zhuǎn)為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 根據(jù)窗口大小設(shè)置圖片大小
            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:  # 默認(rèn):ESC
                cv2.destroyAllWindows()
                exit("結(jié)束")

代碼講解

功能實(shí)現(xiàn)思路主要是使用 mss 庫(kù)進(jìn)行截圖,并使用 opencv 庫(kù)進(jìn)行圖像顯示和處理。

首先,使用 argparse 庫(kù)解析傳入的參數(shù),設(shè)置檢測(cè)范圍的大小。

然后,使用 mss 庫(kù)實(shí)例化一個(gè)截圖對(duì)象 cap 。

接著,設(shè)置屏幕的寬和高,并計(jì)算屏幕中心點(diǎn)的坐標(biāo)。

之后,根據(jù)傳入的參數(shù)計(jì)算游戲內(nèi)截圖區(qū)域的寬高和原點(diǎn)坐標(biāo),并將其保存在變量 mointor 中。

定義了一個(gè)函數(shù) grab_screen_mss ,使用 cap.grab 截取圖片,并用 np.array 將圖片轉(zhuǎn)為數(shù)組,然后用 cvtColor 將 BRGA 轉(zhuǎn)為 BRG ,去掉了透明通道。

定義了一個(gè) run 函數(shù),在其中不斷循環(huán),判斷是否按下 ctrl+U ,若按下,則窗口始終置頂。

然后調(diào)用 grab_screen_mss 函數(shù)獲取截圖,使用 cv2 庫(kù)進(jìn)行圖像顯示,并設(shè)置顯示窗口的大小。

如果窗口需要置頂,則使用 win32com 庫(kù)和 win32gui 庫(kù)置頂窗口。

最后,使用 cv2 庫(kù)的 waitKey 函數(shù)等待用戶操作,按下 ESC 鍵退出程序。

調(diào)用示例

sc = ScreenCapture()
    sc.run()

參數(shù)解釋?zhuān)?/p>

screen_frame : Tuple[int, int]

屏幕寬高,分別為x,y

region : Tuple[float, float]

實(shí)際截圖范圍,分別為x,y,(1.0, 1.0)表示全屏檢測(cè),越低檢測(cè)范圍越小(始終保持屏幕中心為中心)

window_name : str

顯示窗口名

exit_key : int

結(jié)束窗口的退出鍵值,為鍵盤(pán)各鍵對(duì)應(yīng)的ASCII碼值,默認(rèn)是ESC鍵

其他

鍵盤(pán)各鍵對(duì)應(yīng)的ASCII碼值 (0x指16進(jìn)制,delete鍵的ascii碼值是0x2e,也即十進(jìn)制的46)

  • 0x1 鼠標(biāo)左鍵
  • 0x2 鼠標(biāo)右鍵
  • 0x3 CANCEL 鍵
  • 0x4 鼠標(biāo)中鍵
  • 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 碼相同:

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

0 至 9 鍵與數(shù)字 0 – 9 的 ASCII 碼相同:

描述
480 鍵
491 鍵
502 鍵
513 鍵
524 鍵
535 鍵
546 鍵
557 鍵
568 鍵
579 鍵

下列常數(shù)代表數(shù)字鍵盤(pán)上的鍵:

描述
0x600 鍵
0x611 鍵
0x622 鍵
0x633 鍵
0x644 鍵
0x655 鍵
0x666 鍵
0x677 鍵
0x688 鍵
0x699 鍵
0x6AMULTIPLICATION SIGN (*) 鍵
0x6BPLUS SIGN (+) 鍵
0x6CENTER 鍵
0x6DMINUS SIGN (–) 鍵
0x6EDECIMAL POINT (.) 鍵
0x6FDIVISION SIGN (/) 鍵

下列常數(shù)代表功能鍵:

描述
0x70F1 鍵
0x71F2 鍵
0x72F3 鍵
0x73F4 鍵
0x74F5 鍵
0x75F6 鍵
0x76F7 鍵
0x77F8 鍵
0x78F9 鍵
0x79F10 鍵
0x7AF11 鍵
0x7BF12 鍵
0x7CF13 鍵
0x7DF14 鍵
0x7EF15 鍵
0x7FF16 鍵

到此這篇關(guān)于Python實(shí)現(xiàn)對(duì)桌面進(jìn)行實(shí)時(shí)捕捉畫(huà)面的方法詳解的文章就介紹到這了,更多相關(guān)Python桌面實(shí)時(shí)捕捉畫(huà)面內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • windows系統(tǒng)下Python環(huán)境的搭建(Aptana Studio)

    windows系統(tǒng)下Python環(huán)境的搭建(Aptana Studio)

    這篇文章主要介紹了windows系統(tǒng)下Python環(huán)境的搭建(Aptana Studio),需要的朋友可以參考下
    2017-03-03
  • 如何將anaconda安裝配置的mmdetection環(huán)境離線拷貝到另一臺(tái)電腦

    如何將anaconda安裝配置的mmdetection環(huán)境離線拷貝到另一臺(tái)電腦

    這篇文章主要介紹了如何將anaconda安裝配置的mmdetection環(huán)境離線拷貝到另一臺(tái)電腦,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • pytorch tensor int型除法出現(xiàn)的問(wèn)題

    pytorch tensor int型除法出現(xiàn)的問(wèn)題

    這篇文章主要介紹了pytorch tensor int型除法出現(xiàn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Django的性能優(yōu)化實(shí)現(xiàn)解析

    Django的性能優(yōu)化實(shí)現(xiàn)解析

    這篇文章主要介紹了Django的性能優(yōu)化實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python操作SQLite簡(jiǎn)明教程

    Python操作SQLite簡(jiǎn)明教程

    這篇文章主要介紹了Python操作SQLite簡(jiǎn)明教程,簡(jiǎn)單明了的入門(mén)教程,包含連接、建表、增刪修查等例子,需要的朋友可以參考下
    2014-07-07
  • 一個(gè)基于flask的web應(yīng)用誕生(1)

    一個(gè)基于flask的web應(yīng)用誕生(1)

    這篇文章主要為大家詳細(xì)介紹了基于flask的web應(yīng)用誕生,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Python爬豆瓣電影實(shí)例

    Python爬豆瓣電影實(shí)例

    本篇文章給大家通過(guò)Python爬豆瓣電影實(shí)例對(duì)Python爬蟲(chóng)更深入的講解,有興趣的學(xué)習(xí)下。
    2018-02-02
  • python pandas獲取csv指定行 列的操作方法

    python pandas獲取csv指定行 列的操作方法

    這篇文章主要介紹了pandas獲取csv指定行,列的操作方法,本文簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • pyqt串口通信的項(xiàng)目實(shí)踐

    pyqt串口通信的項(xiàng)目實(shí)踐

    串口通信工業(yè)控制上面常用的,本文主要介紹了pyqt串口通信的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • Python列表去重的幾種方法整理

    Python列表去重的幾種方法整理

    這篇文章介紹了Python列表去重的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論