OpenCV Python实现拼图小游戏


Posted in Python onMarch 23, 2020

基于OpenCV实现拼图版小游戏,供大家参考,具体内容如下

效果展示

OpenCV Python实现拼图小游戏

实现

思路

1.对图像进行分割,分割成m*n个子图
2.打乱子图的顺序
3.将子图重新组成一幅新的图片并显示
4.添加鼠标点击响应动作,交换鼠标依次点击的两张图的位置
5.每次交换后,判断是否与原图是否一致

python代码

import cv2 as cv
import numpy
import random
import math

src = cv.imread("D:\\CvPic\\1.jpg")
print(src.shape)
h = src.shape[0]
w = src.shape[1]
c = src.shape[2]

row = 3
col = 3

offset_h = h/row
offset_w = w/col

firstClick = False
clickIdx = [0,0]

tileList = []
def calPicIdx(x, y):
 print(str(y)+" "+str(h/col))
 i = y//(offset_h)
 print(str(y%offset_h)+" "+str(offset_w))
 j = math.ceil((x%w)/offset_w)
 idx = i*row+j
 print("i:"+str(i)+" j:"+str(j)+" idx:"+str(idx))
 return int(idx)

def onMouse(event, x, y, flag ,params):
 if event==cv.EVENT_LBUTTONDOWN:
  print("left button down:"+str(x)+" "+str(y))
  idx = calPicIdx(x, y)
  global firstClick
  firstClick = not firstClick
  print(firstClick)
  if firstClick:
   clickIdx[0] = idx
  else:
   clickIdx[1] = idx
   tileList[clickIdx[0]], tileList[clickIdx[1]] = tileList[clickIdx[1]], tileList[clickIdx[0]]
   for i in range(0, row):
    for j in range (0, col):
     dst[i*offset_h:(i+1)*offset_h-1, j*offset_w:(j+1)*offset_w-1] = tileList[i*row+j]
   cv.imshow("dst", dst)

   difference = cv.subtract(dst, src2)
   result = not numpy.any(difference) #if difference is all zeros it will return False
   print("result:"+str(result))
  print(clickIdx)

# --------------splite image into n*n tile--------------

tile = numpy.zeros((offset_h-1, offset_w-1, c),numpy.uint8)

for i in range(0, row):
 for j in range (0, col):
  tile = src[i*offset_h:(i+1)*offset_h-1, j*offset_w:(j+1)*offset_w-1]
  tileList.append(tile)
  # cv.imshow("tile", tile)

# --------------ramdom the tiles--------------------
print(len(tileList))
for i in range(len(tileList)-1,0,-1):
 randomIdx = random.randint(0,i-1)
 print("swap:"+str(random.randint(0,i-1))+" "+str(i))
 tileList[i], tileList[randomIdx] = tileList[randomIdx], tileList[i]

# debug show every tile
# for k,tile in enumerate(tileList):
# cv.imshow("tile"+str(k), tile)

dst = numpy.zeros((h, w, c), numpy.uint8)
for i in range(0, row):
 for j in range (0, col):
  dst[i*offset_h:(i+1)*offset_h-1, j*offset_w:(j+1)*offset_w-1] = tileList[i*row+j]
cv.namedWindow("dst")
cv.setMouseCallback("dst", onMouse)
cv.imshow("dst", dst)

# -------------match the origin image and now--------------
src2 = src.copy()
for i in range(1, row):
 src2[i*offset_h-1:i*offset_h]= numpy.zeros((1,w,3), numpy.uint8)
 for j in range(1, col):
  src2[0:h,j*offset_w-1:j*offset_w]= numpy.zeros((h,1,3), numpy.uint8)
# cv.imshow("src2", src2)

cv.waitKey(0)

参考

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
python 获取网页编码方式实现代码
Mar 11 Python
python下setuptools的安装详解及No module named setuptools的解决方法
Jul 06 Python
python中字符串比较使用is、==和cmp()总结
Mar 18 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
将字典转换为DataFrame并进行频次统计的方法
Apr 08 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
详解python的argpare和click模块小结
Mar 31 Python
Python3 执行Linux Bash命令的方法
Jul 12 Python
python区分不同数据类型的方法
Oct 14 Python
Python模块future用法原理详解
Jan 20 Python
Python通过队列来实现进程间通信的示例
Oct 14 Python
PYcharm 激活方法(推荐)
Mar 23 #Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 #Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
Mar 23 #Python
Python常用编译器原理及特点解析
Mar 23 #Python
Python3.7.0 Shell添加清屏快捷键的实现示例
Mar 23 #Python
Python面向对象程序设计之继承、多态原理与用法详解
Mar 23 #Python
python实现图像拼接功能
Mar 23 #Python
You might like
PHP加密解密类实例代码
2016/07/20 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
区分JS中的undefined,null,"",0和false
2007/03/08 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
js从Cookies里面取值的简单实现
2014/06/30 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
Python如何重新加载模块
2020/07/29 Python
python中类与对象之间的关系详解
2020/12/16 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
初中生三年学习生活的自我评价
2013/11/03 职场文书
销售总监岗位职责
2014/01/04 职场文书
军训考核自我鉴定
2014/02/13 职场文书
销售经理竞聘书
2014/03/31 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
2014年涉外离婚协议书范本
2014/11/20 职场文书
中学社团活动总结
2015/05/07 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
Redis实现短信验证码登录的示例代码
2022/06/14 Redis