最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)對桌面進行實時捕捉畫面的方法詳解

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

介紹

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

代碼

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]
            實際截圖范圍,分別為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  # 屏幕中心點坐標

        # 截圖區(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]))  # 原點

        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將圖片轉為數(shù)組,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 根據(jù)窗口大小設置圖片大小
            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("結束")

代碼講解

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

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

然后,使用 mss 庫實例化一個截圖對象 cap 。

接著,設置屏幕的寬和高,并計算屏幕中心點的坐標。

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

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

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

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

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

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

調(diào)用示例

sc = ScreenCapture()
    sc.run()

參數(shù)解釋:

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 碼相同:

描述
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ù)字鍵盤上的鍵:

描述
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 鍵

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

相關文章

最新評論

罗山县| 罗定市| 铜陵市| 延庆县| 宜城市| 玛多县| 茌平县| 库车县| 开原市| 泾阳县| 万荣县| 沂源县| 平度市| 富川| 广汉市| 华安县| 黎平县| 宜春市| 石首市| 黄梅县| 卫辉市| 江永县| 汾西县| 漳州市| 赞皇县| 武汉市| 新晃| 分宜县| 昌都县| 龙里县| 栖霞市| 谢通门县| 洛川县| 射阳县| 同仁县| 吉林市| 连云港市| 延边| 澜沧| 乌拉特后旗| 环江|