前言
  找不同小游戏,大家或多或少都玩儿过,就是给你两幅相似的图片,里面会给你改变一些东西的形状,或者挪动位置,让你在规定时间内,找出两幅图的不同之处。可有时候图片信息过多或者太复杂,就会使我们找起来非常费劲儿。那有没有偷懒的方法呢?

  哈喽,小伙伴们好,这里是滑稽研究所。以上的问题能不能用python实现一键找不同呢?很显然除了生孩子外什么都会的python是可以做到的,只需要使用我们的opencv库,就可以实现我们想要的功能的。那么本期我们的任务就是识别下面图片素材中的不同之处,并标记出来。下图中除了比较明显的app的位置变化之外,4g信号的使用情况也不同(箭头一明一暗)。
  素材如下:

  **注意!**两个图片比较的先决条件必须处于同一环境,如我们截取定点监控摄像头的录像,在不同时间任意截取两张图片比较都是满足条件的。因为它拍摄的是同一地点,变化的只有行人和车辆。我们的素材也是在同一屏幕,不同情况下截取。
  那么先上代码,然后我们跟着不同阶段的图片处理结果来过一遍思路。
  源代码:

import cv2
import numpy as npimg = cv2.imread('images/3.png',0)
imgx = cv2.imread('images/3.png')
img2 = cv2.imread('images/4.png',0)
imgy = cv2.imread('images/4.png')
#缩放到合适大小
img=cv2.resize(img,None,fx=0.4,fy=0.4)
imgx=cv2.resize(imgx,None,fx=0.4,fy=0.4)
img2=cv2.resize(img2,None,fx=0.4,fy=0.4)
imgy=cv2.resize(imgy,None,fx=0.4,fy=0.4)print(img.shape,img2.shape)imgBlur = cv2.GaussianBlur(img, (7, 7), 1)
imgBlur2 = cv2.GaussianBlur(img2, (7, 7), 1)
# 获取图形轮廓
imgCanny = cv2.Canny(imgBlur, 50, 80)
imgCanny2 = cv2.Canny(imgBlur2, 50, 80)
#二值化操作
kernel = np.ones((5, 5), np.uint8)
ref = cv2.threshold(imgCanny, 10, 255, cv2.THRESH_BINARY_INV)[1]
ref2 = cv2.threshold(imgCanny, 10, 255, cv2.THRESH_BINARY)[1]
ref3 = cv2.threshold(imgCanny2, 10, 255, cv2.THRESH_BINARY_INV)[1]
#与运算
img4 = cv2.bitwise_and(imgCanny2,imgCanny2,mask=ref)
img5 = cv2.bitwise_and(ref2,ref2,mask=ref3)res1 = cv2.add(img4,img5)imgd = cv2.dilate(res1, kernel, iterations=2)img1 = imgx.copy()def getContours(img):contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)# contours接受识别出的所有轮廓# hierarchy各个轮廓之间的关系,我们本次用不到。for cnt in contours:area = cv2.contourArea(cnt)# 这个输出各个轮廓的面积#print(area)#if 0 <= area <=6000 :# 给我们的轮廓描边print(area)cv2.drawContours(img1, cnt, -1, (0, 255, 0), 2)# 轮廓的长度peri = cv2.arcLength(cnt, True)# 找出轮廓的突变值approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)# approx找到的是一个轮廓有几个突变值,有几个角就会有几个突变值# 返回的是一个list,输出他的长度,就可以知道到底有几个角print(len(approx))x, y, w, h = cv2.boundingRect(approx)  # 得到包覆此轮廓的最小正矩形# x,y为包覆此轮廓的最小正矩形的左上角的坐标。# w, h则为长宽,计算长宽的比值判断矩形。# if 730 > x > 70 and 270 < y < 350:cv2.rectangle(img1, (x, y), (x + w, y + h), (0, 0, 255), 2)getContours(imgd)
#图片拼接操作
imga = np.hstack((img1,imgy))
imgb = np.hstack((imgCanny2,ref))
imgc = np.hstack((ref2,ref3))
imgd = np.hstack((img4,img5))cv2.imshow("1", imga)
cv2.imshow("2", imgb)
cv2.imshow("3", imgc)
cv2.imshow("4", imgd)
cv2.imshow("8", res1)
# 设置窗口显示时间,0为永远。单位是ms。
cv2.waitKey(0)

  两张图片二值化之后,值取一正一反,注意需要做两组。为什么两组?

  第一次我们以左侧为原图,进行一次掩膜操作,右图作为mask。我们知道白色区域是我们希望保留的部分,覆盖之后,位置没有变的app轮廓被mask填充消失不见,那么得到下图的左侧部分。
  但是,我们发现一个问题,第2行和第4行app的位置变换没有被检测到。这是因为我们的原图app移动后的空缺处为黑色,而mask对应的位置即使有黑色轮廓也与背景色融合。无法被检测出来。因此我们需要进行一次反向取值。

  第二次操作反向取值之后我们得到上图的右侧部分。

  那么在两次操作之后我们对得到的结果进行一次加运算得到下图。我们可以看到在右上角的位置有片白色区域,那就是4g图标处的差异也被检测出来了。这意味着我们不仅可以检测到位置变换,还可以检测到图形的变换。也就是说如果位置不动,仅对调app的位置,那么logo和app名称的变化也是可以检测到的。

  我们对上图进行一次膨胀操作,以便程序可以更轻松的捕捉到我们的轮廓。在捕捉到轮廓后,我们对进行描边,并加上最小外接正矩形。

  最终结果:

  可以看到被移动的程序和信号的差别都被程序检测到了。那么到这一步,我们完成了就位置检测(app位置的移动)和图形检查(4g图标的不同)。
  其他素材测试:

  这里因为不需要关注细节处理,我们把膨胀操作去掉。在不同素材的情况下,我们灵活运用。
  最后,希望这篇文章对你理解opencv里的mask有帮助。

  转载自:滑稽研究所
  相关文章,请关注我们吧!

opencv对相似图片一键找不同。(嘻嘻,找不同小游戏作弊神器)相关推荐

  1. 4399玩过的服务器找不到了,4399小游戏:曾经玩到忘记吃饭了,为何如今有时间也不玩了?...

    原标题:4399小游戏:曾经玩到忘记吃饭了,为何如今有时间也不玩了? 大家好,我是小瑞子! 4399小游戏是一个网站平台,这个平台里面有着无数个大大小小的小游戏,各种各样类型的游戏都有,单人双人三人四 ...

  2. 计算机课玩的小游戏怎么找,能够回味电脑课的小游戏是什么 怎么制作这两个小游戏...

    能够回味电脑课的小游戏是什么,怎么制作这两个小游戏.在我的世界里回味已经是很多人的游玩乐趣之一了,因为这个游戏超高的自由度还有各种玩法可以让我们回味童年的种种. 这些小游戏乍一看都不怎么需要技巧 简单 ...

  3. 由于找不到appvisvsubsystems32.dll_找茬游戏大全:我找东西贼快!小清新找茬游戏小程序,点开既玩...

    50000+游戏爱好者已加入我们! 每天推荐好玩游戏! 关注我们,沐沐带你发现好游戏! <我找东西贼快>游戏小程序好玩吗? <我找东西贼快>小游戏怎么玩? 怎么进入<我找 ...

  4. 不止于大西瓜,让你的 H5 小游戏一键“起飞”

    近期,漫天"瓜"雨刷爆社媒,借助H5类游戏小巧轻便.易于分享的优势,一个个创意十足.与时俱进的花式合成类H5小游戏如雨后春笋般涌现,让广大网友不仅能吃瓜,还能亲手制瓜. △ 真·丢 ...

  5. Processing编程入门-02——添加图片 小游戏

    在工程文件夹中新建data文件夹 将要使用的图片拖入其中 并使用代码调用图片 //定义图片变量 PImage bunny; PImage carrot;void setup(){size(800,80 ...

  6. 教你七招如何找Android 高分辨率手机/平板电脑游戏

    分享Android平板电脑使用心得 这里介绍了软件心得 很多人都入手了Android 手机或者平板电脑 发现自己找到游戏不是不能全屏就是秒退. 估计FC问题困扰很多新手玩家. 这里我传授几招技巧帮助大 ...

  7. csharp通过dll调用opencv函数,图片作为参数

    [blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数          ​一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找 ...

  8. python opencv 截取矩形区域_python+OpenCV 鼠标交互图片切割矩形区域

    about 本文参考了: 不用鼠标交互,手动设参 先来个热身运动的先,直接手动设参选择.一个要点就是把一个RGB图片看成一个3维的数组. import cv2 def main(): org = cv ...

  9. 【Opencv】-----倾斜图片转正

    今天是我们来玩一个钉子.通过一个钉子来学习一个opencv中的一个函数,这个函数我网上也有搜过,不过遗憾的是,各路好手都是写的是有点不堪入目,现在这个学习氛围是越来越差了,很多人都直接复制粘贴别人的东 ...

  10. opencv二值化找轮廓检测背景简单小物体

    一.前言 本篇主要是针对背景简单,且具有固定颜色的单类小物体,方法为在灰度化时选用图片的HSV中的S通道,再使用opencv 二值化找轮廓大法可将小物体框出. 原理很简单,图片->取S通道灰度化 ...

最新文章

  1. 第四次作业,孙保平034
  2. 单片机large模式_对单片机存储分配新的认识
  3. 蓝牙4.0技术分析1-广播者角色
  4. windows 安装 openssl
  5. SAP Spartacus Theme 设置
  6. CentOS 6下搭建Apache+MySQL+PHP+SSL
  7. CAMERA(12)---[Android相机]光线传感器识别环境光亮强度
  8. 人脸检测(一)--综述
  9. 使用vscode比较两个文件的差别
  10. html下拉控件 拼音检索和中文检索,bootstrap select 下拉框通过拼音搜索汉字
  11. 部署nodejs报No package nodejs available
  12. matlab求解全微分函数,Matlab求解一元函数,再求全微分的错误,表达式复杂不会........
  13. While(true)无限循环
  14. n维单位向量的生成公式
  15. 渗透测试实战指南笔记
  16. javascript 递归乘阶
  17. linux启动流程及自定义gurb
  18. 2022哈工大软件构造lab1小结(知识点)
  19. Ten Simple Rules for Effective Statistical Practice
  20. SQL必知必会【笔记】

热门文章

  1. 定时任务---Only no-arg methods may be annotated with @Scheduled
  2. number of lines annotated by git is not equal to number of linus in the file .check file encoding an
  3. 共享充电宝为啥能够盈利
  4. 鼠标回报率测试软件用哪个,揭开鼠标的秘密 艾尚教你如何测回报率
  5. 家用无线路由器服务器,ZOL实测:家用无线路由器WiFi性能排行榜
  6. 段式存储、页式存储及段页式存 详解
  7. C++压缩解压之snappy
  8. Apache doris 使用过程中常见问题汇总
  9. 【CSDN|每日一练】走楼梯
  10. 学会这个小技巧,SSH 会话连接永远不超时!