《大家来找茬》游戏辅助工具开发
提示:本博文仅供学习交流,并无任何破坏游戏环境之意。
文章目录
规则分析
在规定时间内找出2张相似的图片中不一样的5处地方就算过关,一般是连续5回合,也就是5组图 25个错误地方。在总时间内找到最多最快的算胜利。
开发思路 屏幕抓取图片对比图片找茬辅助工具,找出不同之处GUI显示帮助信息 程序设计 1.获取图片
首先,获取游戏界面中两张相似图片。关键部分程序如下:
win32gui.GetWindowRect(handle) # 获取窗口矩形坐标
# 通过计算目标图片相对于父窗口的位置进行截取
img_ready = ImageGrab.grab((x1, y1, x2, y2))
img_left = ImageGrab.grab((x1 + 134, y1 + 463, x1 + 134 + 582, y1 + 463 + 439))
img_right = ImageGrab.grab((x1 + 820, y1 + 463, x1 + 820 + 582, y1 + 463 + 439))
运行结果如下图所示:
2.图片对比
将获取的两张图片进行对比图片找茬辅助工具,找出不同之处。两张图片的不同之处总结起来有两点:颜色差异和轮廓差异。颜色差异可通过简单的三通道求差获取,轮廓差异可通过轮廓检测后求差获取(预期方案)。但是在实际对比两张图片时发现其实两张图片完全不一样,一方面两者有一定的色差,另一方面两者轮廓并非绝对重合,而是存在一定偏差。所以我觉得采用将两张图片叠加,然后生成GIF动图的形式辅助我们用肉眼快速找出不同。这种生成GIF图的方法能够找出两者的轮廓差异,但是在颜色差异上略显乏力(特别是深红色和紫色,两者闪烁我根本看不出来有变化。),所以此时需要用到色差图进行”补漏“。相关关键代码如下:
diff = cv.subtract(cv.cvtColor(np.asarray(img_left), cv.COLOR_BGR2RGB),
cv.cvtColor(np.asarray(img_right), cv.COLOR_BGR2RGB))
def create_gif(image_list, gif_name, duration = 0.35):
frames = []
for image_name in image_list:
frames.append(imageio.imread(image_name))
imageio.mimsave(gif_name, frames, 'GIF', duration = duration)
return
def main():
image_list = ['img1.jpg', 'img2.jpg']
gif_name = 'diff.gif'
duration = 0.1
create_gif(image_list, gif_name, duration)
运行结果如下图所示:
3.GUI显示
本来是想通过获取图片不同之处的坐标值,利用win32api的mouse_event进行单击操作,实现完全的自动化操作。但是由于时间和精力限制,使用GUI显示辅助判断信息的方式取缔了上述方案。关键代码如下:
def run(self, evt):
windowName = "大家来找茬"
dst = get_picture(windowName)
# cv.imshow("dst", dst)
gif.create_gif(["img1.jpg", "img2.jpg"], "diff.gif", 0.1)
self.animation.Stop()
self.animation = AnimationCtrl(self.panel, -1, Animation('diff.gif'), pos = (0, 0)) # 创建一个动画
self.animation.Play() # 播放动图
row, col, x = dst.shape
bmp = wx.Bitmap.FromBuffer(col, row, dst)
wx.StaticBitmap(self, -1, bmp, (0, 500), (bmp.GetWidth(), bmp.GetHeight())) # BUG:静态图更新延迟
未解决BUG:静态图更新有延迟,一般gif更新后需再点击一次按钮才会更新jpg
总结
欢迎各位看官指出不足之处,并给予宝贵建议和意见!