???一个帅气的boy,你可以叫我
?? 个人主页:的个人主页
???如果对你有帮助的话希望三连???支持一下博主

图像大找茬

  • 前言
  • 基础知识
  • 图片找茬
  • 抓取句柄图片
  • GUI界面搭建

前言

在一个月黑风高的夜晚,我的舍友小许摇起我来,面色惊恐地说道:“快来帮我,我要不行了o(╥﹏╥)o”。我连忙起身,问到他你怎么了,他把我拉到他电脑面前,一脸凝重的说道:这两张图片我找不出第五个不同的地方。我上来…就给他个大B兜,睡觉。凄凄惨惨戚戚,独留一人守空房…


基础知识

  1. 首先我们要想分清两种图片的不同就要想起它——灰度图。
  2. 其次我们找到一个可以获取不同页面句柄的库实时截取图片(这里不采用抓包)
  3. PyQt5设计页面

图片找茬

原图:

灰度图使用skimage库可以轻松解决pip install scikit-image,同时安装pip install opencv-python以显示图片。

imageA = cv2.imread("./first.png")
imageB = cv2.imread("./second.png")
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)

扩展:用到了SSIM原理,也可以叫他结构相似性指数,是一种衡量两幅图像相似度的指标。

#调用ssim函数
from skimage.metrics import structural_similarity
#返回三个值
mssim, grad , S = structural_similarity(grayA, grayB, gradient=True,full=True)
'''
mssim:float
图像上的平均结构相似性指数。grad:ndarray
im1 和 im2 [2]之间结构相似性的梯度。这仅在梯度设置为 True 时返回。S:ndarray
完整的 SSIM 图像。这仅在full设置为 True 时返回。
'''

可以打印mssim数值观察ssim指数,此指数越高说明越相似

但是需要注意的是 SSIM返回的ndarray里面的值为[0, 1]的float型,而OpenCV的[0, 255]为uint8型,用如下转换:

grad= (grad* 255).astype("uint8")

grad对应图片:

然后用cv2中图像阈值处理threshold函数去寻找轮廓,然后用imutils.grab_contours返回cnts中的countors(轮廓),然后用cv2.boundingRect获取边界框位置,直接用cv2.rectangle画出方框

thresh = cv2.threshold(S, 0, 255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cnts = imutils.grab_contours(cnts)

threshold函数寻找到的轮廓:

for c in cnts:#获取边界框位置(x, y, w, h) = cv2.boundingRect(c)cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), thickness = 4)cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), thickness = 4)

最后打印图片保存即可。
源码:

#Image_Comparefrom skimage.metrics import structural_similarity
import imutils
import cv2
import argparse
def Make_picture() -> object:parser = argparse.ArgumentParser(description="查找茬图像输入")parser.add_argument("-f","--first",default=False,help="first image")parser.add_argument("-s","--second",help="first image")args = vars(parser.parse_args())imageA = cv2.imread("./first.png")imageB = cv2.imread("./second.png")#灰度图grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)#计算两幅图像之间的结构相似性指数(SSIM),确保返回差异图像(mssim, grad ,S) = structural_similarity(grayA, grayB, full=True,gradient=True)S = (S * 255).astype("uint8")thresh = cv2.threshold(S, 0, 255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)for c in cnts:(x, y, w, h) = cv2.boundingRect(c)cv2.rectangle(imageA, (x, y), (x + w, y + h), (0, 0, 255), thickness = 4)cv2.rectangle(imageB, (x, y), (x + w, y + h), (0, 0, 255), thickness = 4)cv2.waitKey(0)cv2.imwrite(filename="Find_Different.png", img=imageB)
#测试时解开注释
#Make_picture()

抓取句柄图片

需要安装pip install pywin32,这个库可以完成根据自己电脑打开的程序抓取所需句柄(也就是已经打开的任意程序)
具体操作:打开qq游戏大厅中的大家来找茬小游戏,咳咳,找个座位坐下,进入游戏前点开程序,然后开始游戏后点击开始!!开始检测!!!十图场乱杀!!!!!

#PyQt5_catchWindows.py
import win32gui
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import *
import sys
from Image_Compare import  Make_picture
from PIL import Image # 导入PIL库
import win32con
hwnd_title = dict()
def get_all_hwnd(hwnd,mouse):if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})hwnd_title.update({hwnd:win32gui.GetWindowText(hwnd)})win32gui.EnableWindow(hwnd,True)#print(win32gui.IsWindow(hwnd))
def Get_Windows():
#通过将句柄依次传递给应用程序定义的回调函数,枚举屏幕上的所有顶级窗口。win32gui.EnumWindows(get_all_hwnd, 0)for h,t in hwnd_title.items():if t != '':print(h,t)if t == '大家来找茬':hwnd = win32gui.FindWindow(None, t)#返回屏幕坐标中窗口的矩形b = win32gui.GetWindowRect(hwnd)screen = QApplication.primaryScreen()img1 = screen.grabWindow(hwnd,549,311,383,288).toImage()img1.save("first.png", "png")img2 = screen.grabWindow(hwnd, 92, 311, 383, 288).toImage()img2.save("second.png", "png")clsname = win32gui.GetClassName(hwnd)title = win32gui.GetWindowText(hwnd)return img1,img2#print(clsname, title)
def Start():img1,img2 = Get_Windows()Make_picture()

GUI界面搭建

按上述操作完成后打开界面如下

#Pyqt_UI.py
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import PyQt5_catchWindows
class picture(QWidget):def __init__(self):super(picture, self).__init__()self.setWindowTitle("显示图片")self.label = QLabel(self)self.label.setText("生成图像框")self.label.setFixedSize(383,288)self.label.move(10, 10)self.label.setStyleSheet("QLabel{background:white;}""QLabel{color:rgb(300,300,300,120);""font-size:70px;font-weight:bold;""font-family:黑体;}")btn = QPushButton(self)btn.setText("开始检测")print(1)btn.move(160, 330)btn.clicked.connect(self.openimage)def openimage(self):PyQt5_catchWindows.Start()imgName = "Find_Different.png"jpg = QtGui.QPixmap(imgName).scaled(self.label.width(), self.label.height())self.label.setPixmap(jpg)if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)my = picture()my.show()sys.exit(app.exec_())

纯纯辅助神器,喜欢的朋友们可以去玩一玩哦???求一键三连。

项目地址

封校大学生在宿舍无聊玩起图像大找茬——一个关于游戏的练手小项目(一起领略Python脚本的风采吧)相关推荐

  1. 绝地求生游戏怎么转到计算机上玩,绝地求生大逃杀吃鸡游戏提示tslgame.exe 应用程序错误解决方法...

    众所周知,玩家口中所谓的"吃鸡"游戏就是绝地求生大逃杀,这款游戏虽然比较好玩,但是游戏优化比较差,此外游戏的应用程序会出现各种报错,最为常见的就是tslgame.exe 应用程序错 ...

  2. (附源码)springboor大学生防疫封校管理系统 毕业设计632124

    大学生防疫封校管理系统 摘 要 2019年12月19号中国武汉发生第一例新冠病毒的到来,大家都在听从政府的号召在居家隔离,不管是在城市还是在乡镇.农村,这引起我的注目,设计一套大学生防疫封校管理系统 ...

  3. (附源码)springboot大学生防疫封校管理系统 毕业设计 632124

    大学生防疫封校管理系统 摘 要 2019年12月19号中国武汉发生第一例新冠病毒的到来,大家都在听从政府的号召在居家隔离,不管是在城市还是在乡镇.农村,这引起我的注目,设计一套大学生防疫封校管理系统 ...

  4. springboot mybatis大学生校园宿舍管理系统源码含文档

    摘 要:宿舍是大学生学习与生活的主要场所之一,宿舍管理是高校学工管理事务中 尤为重要的一项.随着我国高校招生规模的进一步扩大,学生总体人数的不断增加, 宿舍管理工作变得愈加沉重和琐碎,学生宿舍信息的采 ...

  5. diy nas配置推荐2020_2020适合大学生专业需求及玩游戏的电脑配置推荐

    阅读本文前,请您先点击上面的蓝色字体,再点击"关注",这样您就可以继续免费收到最新文章了.每天都有分享.完全是免费订阅,请放心关注.注:本文转载自网络,不代表本平台立场,仅供读者参 ...

  6. python1乘到10_python写一个循环1+到10打印计算步骤的脚本——纯粹无聊玩的

    python写一个循环1+到10打印计算步骤的脚本--纯粹无聊玩的 python写一个循环1+到10打印计算 [root@13cml10 ~]# cat a.py #_*_coding:utf-8_* ...

  7. 短代码的java打地鼠_女白领在家无聊玩打地鼠游戏,不经意间已经学会了Python编程...

    女白领在家无聊玩打地鼠游戏,不经意间已经学会了Python编程 玩打地鼠的游戏,因为有BUG,需要优化,于是无意间竟然学到了很多python的基础内容. 女白领说:在家玩了一个用python做的打地鼠 ...

  8. 【kimol君的无聊小发明】—用python写图片下载器

    [kimol君的无聊小发明]-用python写图片下载器 前言 一.单线程版 二.多线程版 写在最后 Tip:本文仅供学习与参考,且勿用作不法用途~ 前言 某个夜深人静的夜晚,我打开了自己的文件夹,发 ...

  9. 局域网有几台电脑频繁断网_一张地图肝了17年,曾经宿舍10点前要断网,但这游戏却能开黑通宵...

    原标题:一张地图肝了17年,曾经宿舍10点前要断网,但这游戏却能开黑通宵 魔兽3冰封王座,承载着多少80后玩家的回忆.17年前的时候,奇怪的是大家都没有正儿八经的去打一遍剧情,也没有正儿八经的玩一下澄 ...

最新文章

  1. 【Design pattern】设计模式思路总结(三)
  2. bzoj3442 学习小组
  3. 文本查找查找命令的grep 、egrep、fgrep用法的详解
  4. html圆角兼容jq,IE兼容css3圆角的htc解决方法
  5. 瞄准千亿个护市场,纸业龙头们下半场战役已经打响
  6. UVa 11121 Base -2(负数进制)
  7. 安卓学习 之 广播(五)
  8. Python的魔法函数
  9. windows下安装和使用scrapy
  10. 如果要做小程序创业,哪种方式最赚钱?
  11. ASP.NET验证码的实现
  12. Android低功耗蓝牙(BLE)使用详解
  13. linux中找到最耗CPU的那段Java代码
  14. 魅蓝note2android8,魅族魅蓝Note3和魅蓝Note2哪个好
  15. AD9361开发:接收与发送滤波器配置
  16. 惠普m1216硒鼓清零步骤_hpm1213nf清零
  17. 计算机中丢失d3dx11 43.dll,帮您设置win10系统运行软件提示计算机丢失d3dx11_43.dll的图文办法...
  18. 计算机网络-第1章-PPT
  19. c语言binsearch函数头文件,C++ binary_search()函数详解
  20. 四川内江现天眼猫 额头正中间长眼睛

热门文章

  1. 将格林威治时间转换为北京时间
  2. 微信推送封面尺寸_微信公众平台图片尺寸是多少 如何设置
  3. 【系统集成项目管理工程师】信息系统集成及服务
  4. SIMBOSS:物联网业务如何应用领域驱动设计?
  5. GOOGLE HACKS巧妙使用网络搜索的技巧和工具(第二版)已经出版
  6. 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)
  7. 通过AWS云平台 构建云上勒索病毒防护体系,轻松保护数据完整性
  8. 成都物韵电子商务有限公司推广网店需要注意什么?
  9. 入门设计原则C++实现五:依赖倒置原则
  10. MySQL (四)------DML操作表记录-增删改【重点】DQL操作表记录-查询【重点】