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压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
python发送告警邮件脚本
Sep 17 Python
基于python实现学生管理系统
Oct 17 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
python使用turtle绘制国际象棋棋盘
May 23 Python
django model的update时auto_now不被更新的原因及解决方式
Apr 01 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
Jul 20 Python
python openCV实现摄像头获取人脸图片
Aug 20 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
Python获取百度热搜的完整代码
Apr 07 Python
python运算符之与用户交互
Apr 13 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 中的输出缓冲
2006/12/21 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
Laravel 5 学习笔记
2015/03/06 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
VC调用javascript的几种方法(推荐)
2016/08/09 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
python 中random模块的常用方法总结
2017/07/08 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
介绍一下你对SOA的认识
2016/04/24 面试题
大专学生推荐信范文
2013/11/19 职场文书
会计自我鉴定
2014/02/04 职场文书
学习标兵获奖感言
2014/02/20 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
财务会计岗位职责
2015/02/03 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
北京爱情故事观后感
2015/06/12 职场文书
安全教育观后感
2015/06/17 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书