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通过递归遍历出集合中所有元素的方法
Feb 25 Python
Python实现压缩与解压gzip大文件的方法
Sep 18 Python
python 寻找list中最大元素对应的索引方法
Jun 28 Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 Python
pycharm创建一个python包方法图解
Apr 10 Python
python爬虫之自制英汉字典
Jun 24 Python
python开启debug模式的方法
Jun 27 Python
Django forms表单 select下拉框的传值实例
Jul 19 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 Python
Python 求向量的余弦值操作
Mar 04 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命令行脚本接收传入参数的三种方式
2014/08/20 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
vuex入门最详细整理
2020/03/04 Javascript
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
Python中属性和描述符的正确使用
2016/08/23 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
利用python绘制正态分布曲线
2021/01/04 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
巴西手表购物网站:eclock
2019/03/19 全球购物
爷爷追悼会答谢词
2014/01/24 职场文书
单位创先争优活动方案
2014/01/26 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
法人授权委托书格式
2014/04/08 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
个人工作年终总结
2015/03/09 职场文书
2015年推普周活动总结
2015/03/27 职场文书
锦旗赠语
2015/06/23 职场文书
幼儿园教师教育随笔
2015/08/14 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书