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 相关文章推荐
在win和Linux系统中python命令行运行的不同
Jul 03 Python
Python多继承顺序实例分析
May 26 Python
对PyTorch torch.stack的实例讲解
Jul 30 Python
python实现在函数中修改变量值的方法
Jul 16 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 Python
Django框架创建项目的方法入门教程
Nov 04 Python
python垃圾回收机制(GC)原理解析
Dec 30 Python
pytorch 数据处理:定义自己的数据集合实例
Dec 31 Python
python自动点赞功能的实现思路
Feb 26 Python
Python如何输出百分比
Jul 31 Python
python中round函数保留两位小数的方法
Dec 04 Python
python快速安装OpenCV的步骤记录
Feb 22 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&&mysql)五
2006/10/09 PHP
两种设置php载入页面时编码的方法
2014/07/29 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
PHP积分兑换接口实例
2015/02/09 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
JavaScript语言核心数据类型和变量使用介绍
2013/08/23 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
Python中实现参数类型检查的简单方法
2015/04/21 Python
Python基础篇之初识Python必看攻略
2016/06/23 Python
tensorflow多维张量计算实例
2020/02/11 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
如何基于线程池提升request模块效率
2020/04/18 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
Django haystack实现全文搜索代码示例
2020/11/28 Python
总经理驾驶员岗位职责
2013/12/04 职场文书
元旦晚会感言
2014/03/12 职场文书
校园公益广告语
2014/03/13 职场文书
服务标语大全
2014/06/18 职场文书
小学生国庆65周年演讲稿范文(2篇)
2014/09/21 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
2015年派出所工作总结
2015/04/24 职场文书
考研英语辞职信
2015/05/13 职场文书