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

依赖:
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()

猜你喜欢

转载自blog.csdn.net/weixin_44634704/article/details/133155156