依赖:
opencv-python4.0.0.21
pyscreenshot3.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()