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批量转换文件编码格式
May 17 Python
python统计文本字符串里单词出现频率的方法
May 26 Python
Python装饰器用法示例小结
Feb 11 Python
在Python中增加和插入元素的示例
Nov 01 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
Mar 14 Python
实例讲解Python中整数的最大值输出
Mar 17 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
python3利用Socket实现通信的方法示例
May 06 Python
python @classmethod 的使用场合详解
Aug 23 Python
python爬虫 正则表达式解析
Sep 28 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 03 Python
python中pdb模块实例用法
Jan 15 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
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
Python文本特征抽取与向量化算法学习
2017/12/22 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Django之PopUp的具体实现方法
2019/08/31 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
Python里面如何拷贝一个对象
2014/02/17 面试题
《与朱元思书》的教学反思
2014/04/17 职场文书
《美丽的南沙群岛》教学反思
2014/04/27 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
大学生村官个人总结
2015/02/15 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
学习经验交流会策划书
2015/11/02 职场文书