文/IT可达鸭
图/IT可达鸭、网络
前言
还记得几年前非常火的一个科学真人秀节目《最强大脑》吗?它的第一个挑战项目是魔方墙,魔方墙长什么样子?它有哪些规则?
首先,它是一个“找茬游戏”的升级版,就是从两幅一样魔方墙中,找出其中不一样的色块所在的位置。
为了方便大家更清楚的认识这个游戏,我们就称它为“魔方墙找茬”游戏。(看到这里的朋友,不要着急哈,认真看下去,最后有彩蛋。)
图片来自网络
魔方墙找茬
其实,我们普通人经过训练,也可以做到从两面魔方墙中寻找到不一样的色块。那么该怎么做呢?
- 第一步:所谓万丈高楼平地起
我们先从基础做起,先来个简单版的“魔方墙找茬”。
初级魔方墙找茬
是不是非常简单,只要一眼扫过去,就能发现第三行,第四列的色块不一样。
- 第二步:来个中等难度的魔方墙
中级魔方墙找茬
这个时候,就没那么简单了。那有的朋友就说,只要我细心,就一定可以看出来。是的,一行一行地扫描下来,细心的朋友会发现,最后一行,第六列的色块不一样。
- 第三步: 那我们就来高级的魔方墙找茬吧
高级魔方墙找茬
这个花时间去看容易看花,那么我们就应该重新审视这个游戏,寻找一个可以解决的可靠方法。
不过,在此之前,你可能会问,我想研究“魔方墙找茬”,但是这个“魔方墙找茬”游戏去哪里下载呀?
不用担心,小编刚好会一点点编程,给你写一个魔方墙找茬的游戏软件,来,直接上代码。
- 环境配置
python版本: 3.6.0
编辑器: pycharm
项目所需要的环境安装包
pip install numpy
pip install opencv-python
- 需要注意的点
要先安装numpy,再安装opencv-python。
- 第一步:导包和全局变量
# encoding:utf-8
import cv2
import numpy as np
import random
color_list = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (0, 255, 255), (255, 0, 255)
cv2: 是一个强大的图像处理库 opencv, 据说人脸识别、视频处理等操作都可以做到。
numpy: 是一个扩展包,支持大量的维度数组与矩阵运算,包含大量数学函数。
color_list: 是魔方墙找茬游戏的出现的所有色块,这里小编只给了六种颜色,大家可以根据自己的需求,增加新的颜色,颜色越多,难度越大哟。
- 第二步:生成魔方墙的函数体
def show_mixed(row, col, min_cube_size, windows_name = 'bgr_img'):
"""
展示两个颜色矩阵
:param row:
:param col:
:param windows_name:
:return:
"""
img = np.ones((min_cube_size*row, min_cube_size*col), dtype=np.uint8)
img2 = np.ones((min_cube_size * row, min_cube_size * col), dtype=np.uint8)
bgr_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
bgr_img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
for i in range(row):
tmp_row_start, tmp_row_end = i * min_cube_size, (i 1) * min_cube_size
for j in range(col):
tmp_col_start, tmp_col_end = j * min_cube_size, (j 1) * min_cube_size
tmp_color = random.choice(color_list) # 随机选一个颜色
bgr_img[tmp_row_start:tmp_row_end, tmp_col_start:tmp_col_end] = tmp_color
bgr_img2[tmp_row_start:tmp_row_end, tmp_col_start:tmp_col_end] = tmp_color
# 随机选一个坐标
x, y = random.randint(0, row-1), random.randint(0, col-1)
tmp_row_start, tmp_row_end = x * min_cube_size, (x 1) * min_cube_size
tmp_col_start, tmp_col_end = y * min_cube_size, (y 1) * min_cube_size
while True:
tmp_color = random.choice(color_list) # 随机选一个颜色
if bgr_img2[tmp_row_start 5, tmp_col_start 5][0] == tmp_color[0] and \
bgr_img2[tmp_row_start 5, tmp_col_start 5][1] == tmp_color[1] and \
bgr_img2[tmp_row_start 5, tmp_col_start 5][2] == tmp_color[2]:
continue
else:
bgr_img2[tmp_row_start:tmp_row_end, tmp_col_start:tmp_col_end] = tmp_color
break
cv2.imshow(windows_name "01", bgr_img )
cv2.imshow(windows_name "02", bgr_img2 )
return x 1, y
利用numpy的矩阵切片操作,给每个色块进行上色。同时利用随机函数,随即选定一个坐标,藏入找茬游戏的答案。
- 第三步:主函数
if __name__ == '__main__':
grade_dict = {"超简单":5, "简单": 15, "中等": 30, "难": 60} # 魔方墙的大小
cube_size_dict = {"超简单":40, "简单":25, "中等": 18, "难": 15} # 每个色块的像素大小
grade_name = '中等'
x, y = show_mixed(grade_dict[grade_name], grade_dict[grade_name], cube_size_dict[grade_name], 'bg_01')
print( "x=%d, y=%d" % (x, y) )
cv2.waitKey(
在主函数中,自定义难度参数,这里因为屏幕大小的限制,我把最难的设置为60*60的色块魔方墙。如果你的屏幕够大,可以设置成《最强大脑》里的魔方墙尺寸。
至此,生成魔方墙的软件就做好了,你可以随时生成多个“魔方墙找茬”的图,进行训练。
结语
最后,相信很多朋友会问,有什么方法可以快速找到答案?其实,很简单,使用裸眼3D眼。就是小时候大家经常玩的“斗鸡眼”。
使用“3D”眼,把两幅图重叠在一起,刚开始的时候,会比较模糊,这个时候需要盯住,图片慢慢清晰起来。这时候,你会发现“魔方墙”中有一个色块一直在闪,而这个色块,就是你要找的答案。
如果有疑问想获取源码,可以关注后,在后台私信我,回复:python魔方墙。 我把源码发你。持续关注"IT可达鸭",每天除了分享有趣Python源码,还会介绍NLP算法。最后,感谢大家的阅读,祝大家工作生活愉快!
,