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 将字符串转换成字典dict
Mar 24 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
python出现"IndentationError: unexpected indent"错误解决办法
Oct 15 Python
Python入门之三角函数全解【收藏】
Nov 08 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
python绘制漏斗图步骤详解
Mar 04 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
python实现3D地图可视化
Mar 25 Python
完美解决ARIMA模型中plot_acf画不出图的问题
Jun 04 Python
编写python代码实现简单抽奖器
Oct 20 Python
python 实现数据库中数据添加、查询与更新的示例代码
Dec 07 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利用COM对象访问SQLServer、Access
2006/10/09 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
jQuery 连续列表实现代码
2009/12/21 Javascript
jquery图片上下tab切换效果
2011/03/18 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
js实现碰撞检测
2021/01/29 Javascript
Django自定义manage命令实例代码
2018/02/11 Python
python自动截取需要区域,进行图像识别的方法
2018/05/17 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Python 忽略warning的输出方法
2018/10/18 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
python实现遍历文件夹图片并重命名
2020/03/23 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
Ajax的工作原理
2015/12/04 面试题
任课老师推荐信范文
2013/11/24 职场文书
高中毕业生自我鉴定例文
2013/12/29 职场文书
年度考核自我鉴定
2014/02/02 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android
用Python实现屏幕截图详解
2022/01/22 Python