当前位置:网站首页>基于opencv实现桌面图标识别
基于opencv实现桌面图标识别
2022-07-03 09:03:00 【蒙蒂锅巴】
一、必要的库
numy和opencv。直接使用pip安装即可;
二、在指定区域截图
直接贴代码:
from ctypes import windll, byref, c_ubyte
from ctypes.wintypes import RECT, HWND
import numpy as np
import time
from win32com.client import Dispatch
# import mouse as mouse
GetDC = windll.user32.GetDC
CreateCompatibleDC = windll.gdi32.CreateCompatibleDC
GetClientRect = windll.user32.GetClientRect
CreateCompatibleBitmap = windll.gdi32.CreateCompatibleBitmap
SelectObject = windll.gdi32.SelectObject
BitBlt = windll.gdi32.BitBlt
SRCCOPY = 0x00CC0020
GetBitmapBits = windll.gdi32.GetBitmapBits
DeleteObject = windll.gdi32.DeleteObject
ReleaseDC = windll.user32.ReleaseDC
# 防止UI放大导致截图不完整
#windll.user32.SetProcessDPIAware()
def capture(handle: HWND):
"""窗口客户区截图
Args:
handle (HWND): 要截图的窗口句柄
Returns:
numpy.ndarray: 截图数据
"""
# 获取窗口客户区的大小
r = RECT()
GetClientRect(handle, byref(r))
width, height = r.right, r.bottom
print("width,height:", width, height)
# 开始截图
dc = GetDC(handle)
cdc = CreateCompatibleDC(dc)
# 内存中创建,防止屏幕在截图的时候闪烁,同时,如果知道需要识别的图标的大致范围,则可以
# 在这个地方将width和height改成对应区域的宽度和高度信息
bitmap = CreateCompatibleBitmap(dc, width, height)
SelectObject(cdc, bitmap)
# 这里可以设置截图的区域,要和上面的宽度和高度对应,后续的宽度和高度都要对应起来,否则会不匹配
BitBlt(cdc, 0, 0, width, height, dc, 0, 0, SRCCOPY)
# 截图是BGRA排列,因此总元素个数需要乘以4
total_bytes = width*height*4
buffer = bytearray(total_bytes)
byte_array = c_ubyte*total_bytes
GetBitmapBits(bitmap, total_bytes, byte_array.from_buffer(buffer))
DeleteObject(bitmap)
DeleteObject(cdc)
ReleaseDC(handle, dc)
# 返回截图数据为numpy.ndarray
return np.frombuffer(buffer, dtype=np.uint8).reshape( width, height, 4)
if __name__ == "__main__":
import cv2
op=Dispatch("op.opsoft")
handle = windll.user32.FindWindowW(None, "这里是窗口句柄或者名字")
# 截图时要保证游戏窗口的客户区大小是1334×750
print(handle)
image = capture(handle)
# 转为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGRA2GRAY)
# 读取图片,并保留Alpha通道,若要排除背景干扰,需要将源对比图背景设置成透明的,即Alpha通道置为0.
#这里替换成自己的想要抓的图,可以是jpg格式的截图
template = cv2.imread('23.PNG', cv2.IMREAD_UNCHANGED)
# 转为灰度图
template_gray = cv2.cvtColor(template, cv2.COLOR_BGRA2GRAY)
# 取出Alpha通道
alpha = template[:,:,3]
# 模板匹配,将alpha作为mask,TM_CCORR_NORMED方法的计算结果范围为[0, 1],越接近1越匹配 TM_CCOEFF_NORMED
result = cv2.matchTemplate(gray, template_gray, cv2.TM_CCOEFF_NORMED,mask=alpha)
# TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
# TM_CCORR 相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
# TM_CCOEFF 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
# TM_SQDIFF_NORMED 归一化平方差匹配法
# TM_CCORR_NORMED 归一化相关匹配法
# TM_CCOEFF_NORMED 归一化相关系数匹配法
# result = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
print(cv2.minMaxLoc(result))
# 获取结果中最大值和最小值以及他们的坐标
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# 匹配最大值的坐标,左上角
top_left = max_loc
print("左上角坐标值:",top_left[0],top_left[1])
# 模板的高度和宽度
h, w = template.shape[:2]
# 右下角的坐标
bottom_right = top_left[0] + w, top_left[1] + h
if max_val>0.8:
# 在窗口截图中匹配位置画红色方框,在image上画出左上角为top_left,右下角为bottom_right的坐标的矩形
cv2.rectangle(image, top_left, bottom_right, (0,0,255), 2)
#大漠插件的鼠标移动,也可以使用win32的鼠标控制
op.MoveTo(top_left[0]+4,top_left[1]+4)
cv2.imshow('Match Template', image)
cv2.waitKey()
然后,依据此可以改成的自动化操作。
边栏推荐
- [point cloud processing paper crazy reading frontier version 8] - pointview gcn: 3D shape classification with multi view point clouds
- Alibaba cloud notes for the first time
- [point cloud processing paper crazy reading classic version 12] - foldingnet: point cloud auto encoder via deep grid deformation
- Uc/os self-study from 0
- [point cloud processing paper crazy reading classic version 13] - adaptive graph revolutionary neural networks
- [advanced feature learning on point clouds using multi resolution features and learning]
- LeetCode每日一题(985. Sum of Even Numbers After Queries)
- Django operates Excel files through openpyxl to import data into the database in batches.
- Pic16f648a-e/ss PIC16 8-bit microcontroller, 7KB (4kx14)
- Jenkins learning (III) -- setting scheduled tasks
猜你喜欢
Using Hudi in idea
[point cloud processing paper crazy reading classic version 11] - mining point cloud local structures by kernel correlation and graph pooling
[point cloud processing paper crazy reading classic version 9] - pointwise revolutionary neural networks
[set theory] order relation (eight special elements in partial order relation | ① maximum element | ② minimum element | ③ maximum element | ④ minimum element | ⑤ upper bound | ⑥ lower bound | ⑦ minimu
[kotlin learning] operator overloading and other conventions -- overloading the conventions of arithmetic operators, comparison operators, sets and intervals
[point cloud processing paper crazy reading classic version 14] - dynamic graph CNN for learning on point clouds
LeetCode每日一题(931. Minimum Falling Path Sum)
全球KYC服务商ADVANCE.AI 活体检测产品通过ISO国际安全认证 产品能力再上一新台阶
Win10 quick screenshot
IDEA 中使用 Hudi
随机推荐
[point cloud processing paper crazy reading classic version 8] - o-cnn: octree based revolutionary neural networks for 3D shape analysis
Logstash+jdbc data synchronization +head display problems
STM32F103 can learning record
【点云处理之论文狂读前沿版13】—— GAPNet: Graph Attention based Point Neural Network for Exploiting Local Feature
【点云处理之论文狂读经典版10】—— PointCNN: Convolution On X-Transformed Points
Spark 概述
Spark overview
LeetCode每日一题(2115. Find All Possible Recipes from Given Supplies)
【Kotlin学习】高阶函数的控制流——lambda的返回语句和匿名函数
Spark 集群安装与部署
NPM install installation dependency package error reporting solution
Linxu learning (4) -- Yum and apt commands
Database execution error: SQL_ mode only_ full_ group_ by:
Data mining 2021-4-27 class notes
LeetCode每日一题(985. Sum of Even Numbers After Queries)
Computing level network notes
Hudi integrated spark data analysis example (including code flow and test results)
【Kotlin学习】类、对象和接口——定义类继承结构
The idea of compiling VBA Encyclopedia
[graduation season | advanced technology Er] another graduation season, I change my career as soon as I graduate, from animal science to programmer. Programmers have something to say in 10 years