照抄这段代码帮我写一个完整的源代码。利用名为qq的图片找到桌面上相似的图标并输出图标的屏幕坐标。import numpy as npfrom PIL import ImageGrabimport cv2# 读取 qq 图片并获取其特征描述符qq_image = cv2imreadD789QQpngsift = cv2xfeatures2dSIFT_createkp1 des1 = siftdete
import numpy as np from PIL import ImageGrab import cv2
读取 qq 图片并获取其特征描述符
qq_image = cv2.imread('D:/789/QQ.png') sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(qq_image, None)
循环捕获屏幕截图,进行特征匹配
while True: # 获取计算机屏幕的截图 screen_shot = ImageGrab.grab() screen_shot_cv = np.array(screen_shot) screen_shot_rgb = cv2.cvtColor(screen_shot_cv, cv2.COLOR_BGR2RGB)
# 在截图中查找与 qq 图标相似的区域
kp2, des2 = sift.detectAndCompute(screen_shot_rgb, None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
# 筛选出好的匹配点,显示结果
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append(m)
if len(good_matches) > 10:
src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
matchesMask = mask.ravel().tolist()
h, w, c = qq_image.shape
pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)
dst = cv2.perspectiveTransform(pts, M)
# 求出匹配图标的屏幕坐标,打印输出结果
match_x = (dst[0][0][0] + dst[2][0][0]) / 2
match_y = (dst[0][0][1] + dst[2][0][1]) / 2
print('找到相似图标, 坐标为: ({:.0f}, {:.0f})'.format(match_x, match_y))
# 显示截图
cv2.imshow('Capture', screen_shot_cv)
# 检测键盘按键,按下 Q 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
释放窗口和摄像头资源
cv2.destroyAllWindows(
原文地址: https://www.cveoy.top/t/topic/eaCc 著作权归作者所有。请勿转载和采集!