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快速查找算法应用实例
Sep 26 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
Dec 25 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
python实现PCA降维的示例详解
Feb 24 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
Feb 26 Python
Python编程快速上手——PDF文件操作案例分析
Feb 28 Python
Python 下载Bing壁纸的示例
Sep 29 Python
python import 上级目录的导入
Nov 03 Python
Python中对象的比较操作==和is区别详析
Feb 12 Python
十个Python自动化常用操作,即拿即用
May 10 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 程序员的调试技术小结
2009/11/15 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
php数组去重的函数代码
2013/02/03 PHP
PHP数组相关函数汇总
2015/03/24 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
基于Python的PIL库学习详解
2019/05/10 Python
python画双y轴图像的示例代码
2019/07/07 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
python实现XML解析的方法解析
2019/11/16 Python
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
英国排名第一的在线宠物用品商店:Monster Pet Supplies
2018/05/20 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
党校培训思想汇报
2014/01/03 职场文书
大学校运会广播稿
2014/02/03 职场文书
移风易俗倡议书
2014/04/15 职场文书
公司运动会策划方案
2014/05/25 职场文书
优秀毕业生找工作自荐信
2014/06/23 职场文书
艾滋病宣传标语
2014/06/25 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
社区工作者个人总结
2015/02/28 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫