python --windows自定义截图(并返回位置信息)

2023-09-22 03:24:15

依赖:
opencv-python4.0.0.21
pyscreenshot
3.1

import cv2
import pyscreenshot as ImageGrab
import numpy as np
import win32clipboard
import win32con
import win32gui
import pygetwindow as gw

def get_rectangle_coordinates():
    print("请按住鼠标左键并拖动以选择矩形区域,选中后按键盘上回车..")
    # 获取屏幕截图
    screenshot = ImageGrab.grab()
    # 将截图转换为OpenCV图像格式
    img = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
    '''
    - `winname`:窗口的名称,用于显示图像和选择区域。可以是任意字符串。
    - `img`:要选择区域的图像。可以是一个NumPy数组或一个OpenCV的Mat对象。
    - `fromCenter`:一个布尔值,指定选择区域的方式。如果设置为`True`,则选择的区域以鼠标点击的位置为中心;如果设置为`False`
    ,则选择的区域以鼠标点击的位置为起点的矩形。默认值为`False`。
    - `showCrosshair`:一个布尔值,指定是否显示十字线以帮助选择区域。如果设置为`True`,则显示十字线;如果设置为`False`,则不显示十字线。默认值为`False`。
    
    使用`cv2.selectROI()`函数时,你可以根据需要调整这些参数的值。例如,如果你希望选择的区域以鼠标点击的位置为中心,并显示十
    字线,可以将`fromCenter`设置为`True``showCrosshair`设置为`True`。
    
    请注意,`cv2.selectROI()`函数会返回一个包含所选区域的矩形的元组,格式为`(x, y, w, h)`,其中`(x, y)`是矩形左上角的坐标,`w`是矩形的宽度,`h`是矩形的高度。你可以使用这些值来提取所选区域。
    '''
    
    # 创建窗口并显示截图
    cv2.namedWindow("image", cv2.WINDOW_NORMAL)
    '''
    - `cv2.WINDOW_NORMAL`:创建一个可调整大小的窗口。
    - `cv2.WINDOW_AUTOSIZE`:创建一个自适应大小的窗口,窗口的大小将根据图像的大小自动调整。
    - `cv2.WINDOW_FULLSCREEN`:创建一个全屏窗口。
    - `cv2.WINDOW_FREERATIO`:创建一个可调整大小的窗口,窗口的宽高比可以自由调整。
    - `cv2.WINDOW_KEEPRATIO`:创建一个可调整大小的窗口,窗口的宽高比将保持不变。
    '''
    cv2.setWindowProperty('image', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
    cv2.imshow("image", img)

	window = gw.getWindowsWithTitle('image')[0]  #窗口置顶
    hwnd = window._hWnd
    win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)

    # 等待用户选择矩形区域
    rect = cv2.selectROI("image", img, fromCenter=False, showCrosshair=False)
    cv2.destroyAllWindows()

    x, y, w, h = rect
    # 提取所选区域
    roi = img[y:y + h, x:x + w]
    cv2.imwrite("selected_roi.jpg", roi)  # 保存文件,可以是临时路径
    return rect
# 获取用户选择的矩形区域坐标
x, y, width, height = get_rectangle_coordinates()
print(f"您选择的矩形区域坐标是:({x}, {y}, {width}, {height})")

示例

import os
import time
import cv2
import keyboard
import pyscreenshot as ImageGrab
import numpy as np
import win32con
import win32gui
import pygetwindow as gw
from loguru import logger

def get_rectangle_coordinates():
    logger.success("提示:【请按住win+空格,截图后按回车】")
    screenshot = ImageGrab.grab()
    img = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
    cv2.namedWindow("image", cv2.WINDOW_NORMAL)
    cv2.setWindowProperty('image', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
    cv2.imshow("image", img)
    window = gw.getWindowsWithTitle('image')[0]
    hwnd = window._hWnd
    win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)

    rect = cv2.selectROI("image", img, fromCenter=False, showCrosshair=False)
    cv2.destroyAllWindows()
    x, y, w, h = rect
    # 提取所选区域
    roi = img[y:y + h, x:x + w]
    cv2.imwrite("selected_roi.jpg", roi)  # 保存文件,可以是临时路径
    return rect


def on_key(event):
    if event.name == 'space' and keyboard.is_pressed('win'):
        print('Win+空格键被按下')
        keyboard.unhook_all()  # 取消注册的按键事件回调函数
        # 获取用户选择的矩形区域坐标
        x, y, width, height = get_rectangle_coordinates()
        print(f"您选择的矩形区域坐标是:({x}, {y}, {width}, {height})")
        os._exit(0)

keyboard.on_press(on_key)
keyboard.wait()
更多推荐

监控数据的采集方式及原理

采集方法使用频率从高到低依次是读取/proc目录、执行命令行工具、远程黑盒探测、拉取特定协议的数据、连接到目标对象执行命令、代码埋点、日志解析。读取/proc目录/proc是一个位于内存中的伪文件系统,而在该目录下保存的不是真正的文件和目录,而是一些“运行时”信息,Linux操作系统层面的很多监控数据,比如内存数据、网

Go编程规范

文章目录注释转义符定义变量方法一:指定变量类型,声明后若不赋值,使用默认值方法二:根据值自行判定变量类型(类型推导)方法三:省略var,注意:=左侧的变量不应该是已经声明过的,否则会导致编译错误[`推荐`]全局变量和局部变量fmt.Printf查看变量常量iota定义函数多行书写参考注释//单行注释/*多行注释第一行第

javabean项目专项练习(1) 文字格斗游戏

main中是这样写的如下是character类的描述总结一下(个人):这是一题面向对象的编程,个人编程后感是:核心就是在于自己会不会取定义一个类,如果是多个对象(同一个类),能不能捋顺类的方法的关系,个人觉得黑马程序员up主给出来的分析方法特别好用.步骤:先把在类里该该弄得弄好,然后看题目需求的打印方法,我们可以根据题

idea Terminal 回退历史版本 Git指令 git reset

——————强制回滚历史版本——————一、ideaTerminal第一步:复制版本号(右击项目–>Git-->ShowHistory-->选中要回退的版本–>CopyRevisionNumber,直接复制;)第二步:ideaTerminal(确认项目)输入指令:gitreset--hard版本号示例:gitreset

【计算机组成原理】第一章部分课后题

冯·诺依曼型计算机的主要设计思想是什么?它包括哪些主要组成部分?冯·诺依曼型汁算机的其本没计思想为:①以二进制形式表示指令和数据②程序和数据事先放在存储器中,计算机在工作时够高速地从存储器中取出指令加以执行③由运算器、控制器、存储器、输入设备和输出设备五大部分组成计算机硬件系统它的主要组成部分为:运算器、控制器、存储器

数据治理-分类法

分类法是一种命名结构,包含用于概述主题、启用导航和搜索系统的受控词表。分类法有助于减少歧义并控制同义词,层次分类法包含了对索引者和搜索者都有帮助的多种类型的父/子关系。这样的分类法常用于向下扩展分类。分类法可以有多种不同的结构:扁平分类法:在受控类别集之间没有关系,所有类别都是平等的。这类似于列表。例如,一个包含多个多

[CISCN 2019 初赛]Love Math 通过进制转换执行命令

目录hex2binbin2hexbase_convert动态函数第一种解法通过get获取参数绕过第二种解法读取请求头getallheadersechoa,b第三种解法异或获得更多字符这道题也是很有意思!通过规定白名单和黑名单指定了函数为数学函数并且参数也只能是规定在白名单中的参数我们首先要了解通过进制转换执行命令的第一

【论文基本功】【LaTeX】个人常用易忘LaTeX命令

【论文基本功】【LaTeX】个人常用易忘LaTeX命令1.基本符号2.引用3.字体及符号大小4.其他参考1.基本符号符号LaTeX命令备注∣⋅∣|\cdot|∣⋅∣|\cdot|绝对值∣∣⋅∣∣||\cdot||∣∣⋅∣∣\|\cdot\|范数⌈⋅⌉\lceil\cdot\rceil⌈⋅⌉\lceil\cdot\rce

SpringBoot MyBatisPlus Oracle

官网官⽹:https://mybatis.plus/或https://mp.baomidou.com/pom<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www

shell脚本自动化执行jar包

需要用shell脚本来自动化执行jar包,以后可以用jenkins来CI/CD,记录一下对应实现。实现需求以命令行执行shell传入的第一个参数为jar名进行执行。对应jar已存在执行进程,关闭对应进程后再执行。以后台方式执行对应的jar包,输出log文件并判断是否成功执行。测试用jar包和功能为了保持进程执行不退出,

简单的分析下dart实现grpc客户端的流程,以helloworld为例

第三步:实现实现gRPC方法在HelloWorldClient类中,为每个定义在.proto文件中的rpc方法实现对应的Dart方法。简单的分析下dart实现grpc客户端的流程,以helloworld为例这里给出helloworld的proto文件,grpc协议下客户端和服务端都只需要关注相同的proto文件并以自己

热文推荐