『OpenCV』使用OpenCV和Python来解决迷宫问题
今天我们将学习在python中使用opencv制作迷宫解谜器 。
本文插图
解决迷宫的例子
首先 , 我们导入所需的Python库
import cv2import numpy as npimport os
让我们从读取图像开始
def readImage(img_file_path):binary_img = Noneimg = cv2.imread(img_file_path,0)ret,img = cv2.threshold(img,127,255,cv2.THRESH_BINARY)binary_img = imgreturn binary_img
现在我们有一个读取迷宫方块的问题 。
本文插图
def blockwork(img,coordinate): size = CELL_SIZEh = CELL_SIZE*(coordinate[0]+1)w = CELL_SIZE*(coordinate[1]+1)h0= CELL_SIZE*coordinate[0]w0= CELL_SIZE*coordinate[1]block = img[h0:h,w0:w]up= bool(block[0,int(size/2)]) *1000down= bool(block[int(size-1),int(size/2)])*100left= bool(block[int(size/2),0]) *10right = bool(block[int(size/2),int(size-1)])*1edge = up+down+left+rightreturn edge, block
变量“ edge”包含每个单个块的边界信息 。 如果该块的特定面是开放的 , 我们设置为1 。 这样会将大量信息压缩为一个数字 , 0
- 对于上边缘-1000
- 对于下边缘-100
- 对于左边缘-10
- 对于右边缘-1
本文插图
这也 , 我们可以知道给定块的哪一侧是打开的 , 哪一侧是闭合的 。
def solveMaze(original_binary_img, initial_point, final_point, no_cells_height, no_cells_width):edgearray = []for i in range (no_cells_height):edgearray.append([])for j in range(no_cells_width):sz = [i,j]edge, block = blockwork(img, sz)edgearray[i].append(edge)edge= edgearray
在获得所有块的边缘数组之后 , 我们将它附加到一个边缘数组中 。解迷宫实际上就是解这个数组
本文插图
回溯算法 回溯是一种递归地解决问题的算法技术 , 它尝试逐步地构建一个解 , 每次只构建一个部分 , 并删除那些在任何时间点都不能满足问题约束的解 。
本文插图
#The solvemaze method is continued here... shortestPath = [] img = original_binary_img sp = [] rec = [0] p = 0 sp.append(list(initial_point))while True:h,w = sp[p][0],sp[p][1]#h stands for height and w stands for widthif sp[-1]==list(final_point):breakif edge[h][w] > 0:rec.append(len(sp))if edge[h][w]>999:#If this edge is open upwardsedge[h][w] = edge[h][w]-1000h = h-1sp.append([h,w])edge[h][w] =edge[h][w]-100p = p+1continueif edge[h][w]>99:#If the edge is open downwardedge[h][w] =edge[h][w]-100h = h+1sp.append([h,w])edge[h][w] =edge[h][w]-1000p=p+1continueif edge[h][w]>9:#If the edge is open leftedge[h][w] = edge[h][w]-10w = w-1sp.append([h,w])edge[h][w] = edge[h][w]-1p = p+1continueif edge[h][w]==1:#If the edge is open rightedge[h][w] = edge[h][w]-1w = w+1sp.append([h,w])edge[h][w] = edge[h][w]-10p=p+1continueelse:#Removing the coordinates that are closed or don't show any pathsp.pop()rec.pop()p = rec[-1]for i in sp:shortestPath.append(tuple(i))return shortestPath
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #即科技#107国赞同票作废!,想“加入”联合国?中国使用一票否决
- 【游戏菜鸟小嘈】都有哪些?适合排位中使用吗,王者荣耀:KPL赛场上的工具人中单
- 「天极网」还可在水下正常使用?,苹果专利再曝光:不仅可以防水
- SmallRig斯莫格■为什么要使用RAW格式?用RAW格式拍摄更接近人眼所见,摄影
- 智能家▲华为p40pro怎么使用人脸解锁
- 「风月无关」腾讯却能年入3772亿,马化腾是如何实现的?,微信免费使用
- 风月无关■腾讯却能年入3772亿,马化腾是如何实现的?,微信免费使用
- [娱乐小看点点]汽车上的陡坡缓降有什么用?如何使用这个功能?
- 科技小数据■Python培训完能够做数据分析类的工作吗?
- 『央视新闻』数千台呼吸机无法使用,美媒称政府储备系统运作失序