立即登录

开发思路屏幕抓取图片对比,找出不同之处GUI显示帮助信息

09/15 05:15:16

《大家来找茬》游戏辅助工具开发

提示:本博文仅供学习交流,并无任何破坏游戏环境之意。

文章目录

规则分析

在规定时间内找出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))

运行结果如下图所示:

img1.jpg

img2.jpg

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)

运行结果如下图所示:

diff.jpg

diff.gif

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

总结

欢迎各位看官指出不足之处,并给予宝贵建议和意见!

最新资讯