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中的JSON使用
Apr 28 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
PyQT实现多窗口切换
Apr 20 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
python将字符串转换成json的方法小结
Jul 09 Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 Python
快速解决docker-py api版本不兼容的问题
Aug 30 Python
Django静态资源部署404问题解决方案
May 11 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 Python
用Python制作mini翻译器的实现示例
Aug 17 Python
Django web自定义通用权限控制实现方法
Nov 24 Python
用Python爬虫破解滑动验证码的案例解析
May 06 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学习笔记 类的声明与对象实例化
2011/06/13 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
理解JavaScript中的事件
2006/09/23 Javascript
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
jQuery中parents()和parent()的区别分析
2014/10/28 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
angularJS实现动态添加,删除div方法
2018/02/27 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
Python base64编码解码实例
2015/06/21 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
Python常用的json标准库
2019/02/19 Python
在python里面运用多继承方法详解
2019/07/01 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
车间统计员岗位职责
2014/01/05 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
护士感人事迹
2014/05/01 职场文书
校运会口号
2014/06/18 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
百年孤独读书笔记
2015/06/29 职场文书
导游词之山海关
2019/12/10 职场文书
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript