import numpy as np
import cv2 # 导入opencv模块
# 迷宫中0的位置代表墙,不能走
# 8代表入口,1代表可走位置
# 888代表出口
migong = '''
0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 1 1 1 1 1 0
0 1 1 1 1 0 1 1 1 1 0 0
0 1 1 1 1 1 1 1 1 888 1 0
0 0 1 0 0 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 0 1 1 1 1 0 0 0 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 8 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0'''
data = np.array(migong.split(), dtype=int).reshape((12, 12))#以空格为分隔符,强制装换成int
def yanseshibie(): # 创建一个函数,函数名随意定义
#初始化变量
i=1
y0 = 0
y1 = 49
x0 = 0
x1 = 63
x3=0
y3=0
while(True):
frame = cv2.imread("/home/pi/tupian/cheku_xinban1111.jpg")
cv2.imshow("original", frame) # 输出视频每一帧
frame= frame[y0:y1, x0:x1] # 裁剪坐标为[y0:y1, x0:x1]
cv2.imwrite('/home/pi/migong_tupian/'+str(i)+'.jpg',frame)
x0 = x0+63
x1 = x1+63
#y3 = y3+1
if i%10==0:
y0 = y0+49
y1 = y1+49
x0 = 0
x1 = 63
x3 = x3+1
y3 = 0
i=i+1#每次进入循环加1
if(i>=101):
break
#a = frame.size
#print("像素值:",a)
# 将这一帧图像BGR转换为HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 这一帧图像限定在HSV蓝色的范围
blue_lower = np.array([0, 100, 50])
blue_upper = np.array([10, 255, 225])
# 阈值HSV图像以仅获得所选颜色,将图像二值化
# 就是将低于lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255
blue_mask = cv2.inRange(hsv, blue_lower, blue_upper)
# Bitwise-AND屏蔽原始图像
blue_res = cv2.bitwise_and(frame, frame, mask=blue_mask)
# 结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
# 形态学结束
blue_closing = cv2.morphologyEx(blue_res, cv2.MORPH_CLOSE, kernel)
# 转换为黑白图像
blue_gray = cv2.cvtColor(blue_closing, cv2.COLOR_BGR2GRAY)
(thresh2, blue_bw) = cv2.threshold(blue_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 计算像素变化
blue_black = cv2.countNonZero(blue_bw)
print("白色区域:", blue_black)
if blue_black > 100:
# print("视频中有蓝色像素")
data[x3,y3]=4
print(x3,y3)
y3 = y3+1
#else:
#print("无蓝色")
# 显示结果帧
cv2.imshow('blue_quyu', blue_bw)
def direction_set(data):
"""
函数功能,找到data中未被走过的地方,并同时记录该地方能够走的地方
"""
dir_set = {}
v, h = np.where(data > 0)
for i, j in zip(v, h):
key = str(i) + str(j)
if data[i, j + 1] > 0: # 该地方东邻块是否能走
dir_set[key] = [str(i) + str(j + 1)]
if data[i + 1, j] > 0: # 该地方南邻块是否能走
if key in dir_set:
dir_set[key] += [str(i + 1) + str(j)]
else:
dir_set[key] = [str(i + 1) + str(j)]
# data[i, j-1]
if data[i, j - 1] > 0: # 该地方西邻块是否能走
if key in dir_set:
dir_set[key] += [str(i) + str(j - 1)]
else:
dir_set[key] = [str(i) + str(j - 1)]
# data[i-1, j]
if data[i - 1, j] > 0: # 该地方北邻块是否能走
if key in dir_set:
dir_set[key] += [str(i - 1) + str(j)]
else:
dir_set[key] = [str(i - 1) + str(j)]
return dir_set
def get_forward_step(exit_index):
layer_ori = ['92'] # 存放第一层信息
while True:
layer_sec = [] # 存放第二层信息
for key in layer_ori: # 将layer_ori里面所能达到的位置,存放在layer_sec中
layer_sec += direction[key]
if exit_index in direction[key]:
forward_step = key
if exit_index in layer_sec: break
layer_ori = layer_sec
return forward_step
if __name__ == '__main__':
yanseshibie()
direction = direction_set(data)
huish = ['39']
# data[int(huish[0][0]), int(huish[0][1])] = 888 #将出口用888标记
while True:
forward_step = get_forward_step(huish[-1])
huish += [forward_step]
if forward_step == '92':
break
step = huish[::-1][:-1]
for ind in step:
data[int(ind[0]), int(ind[1])] = -8
print(data)
print(step)
本次修改只有11张图片没有识别到,
import numpy as np
import cv2 # 导入opencv模块
# 迷宫中0的位置代表墙,不能走
# 8代表入口,1代表可走位置
# 888代表出口
migong = '''
0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 1 1 1 1 1 0
0 1 1 1 1 0 1 1 1 1 0 0
0 1 1 1 1 1 1 1 1 888 1 0
0 0 1 0 0 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 0 1 1 1 1 0 0 0 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 8 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0'''
data = np.array(migong.split(), dtype=int).reshape((12, 12))#以空格为分隔符,强制装换成int
def yanseshibie(): # 创建一个函数,函数名随意定义
#初始化变量
i=1
y0 = 0
y1 = 49
x0 = 0
x1 = 63
x3=1
y3=1
a=0
while(True):
frame = cv2.imread("/home/pi/tupian/cheku_xinban1111.jpg")
cv2.imshow("original", frame) # 输出视频每一帧
frame= frame[y0:y1, x0:x1] # 裁剪坐标为[y0:y1, x0:x1]
cv2.imwrite('/home/pi/migong_tupian/'+str(i)+'.jpg',frame)
x0 = x0+63
x1 = x1+63
#y3 = y3+1
if i%10==1 and i!=1:
y0 = y0+49
y1 = y1+49
x0 = 0
x1 = 63
x3 = x3+1
y3 = 1
i=i+1#每次进入循环加1
if(i>=101):
break
#a = frame.size
#print("像素值:",a)
# 将这一帧图像BGR转换为HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 这一帧图像限定在HSV蓝色的范围
blue_lower = np.array([0, 100, 50])
blue_upper = np.array([10, 255, 225])
# 阈值HSV图像以仅获得所选颜色,将图像二值化
# 就是将低于lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255
blue_mask = cv2.inRange(hsv, blue_lower, blue_upper)
# Bitwise-AND屏蔽原始图像
blue_res = cv2.bitwise_and(frame, frame, mask=blue_mask)
# 结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
# 形态学结束
blue_closing = cv2.morphologyEx(blue_res, cv2.MORPH_CLOSE, kernel)
# 转换为黑白图像
blue_gray = cv2.cvtColor(blue_closing, cv2.COLOR_BGR2GRAY)
(thresh2, blue_bw) = cv2.threshold(blue_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 计算像素变化
blue_black = cv2.countNonZero(blue_bw)
print("白色区域:", blue_black)
if blue_black > 100:
# print("视频中有蓝色像素")
data[x3,y3]=4
print(x3,y3)
y3 = y3+1
#else:
#print("无蓝色")
# 显示结果帧
cv2.imshow('blue_quyu', blue_bw)
def direction_set(data):
"""
函数功能,找到data中未被走过的地方,并同时记录该地方能够走的地方
"""
dir_set = {}
v, h = np.where(data > 0)
for i, j in zip(v, h):
key = str(i) + str(j)
if data[i, j + 1] > 0: # 该地方东邻块是否能走
dir_set[key] = [str(i) + str(j + 1)]
if data[i + 1, j] > 0: # 该地方南邻块是否能走
if key in dir_set:
dir_set[key] += [str(i + 1) + str(j)]
else:
dir_set[key] = [str(i + 1) + str(j)]
# data[i, j-1]
if data[i, j - 1] > 0: # 该地方西邻块是否能走
if key in dir_set:
dir_set[key] += [str(i) + str(j - 1)]
else:
dir_set[key] = [str(i) + str(j - 1)]
# data[i-1, j]
if data[i - 1, j] > 0: # 该地方北邻块是否能走
if key in dir_set:
dir_set[key] += [str(i - 1) + str(j)]
else:
dir_set[key] = [str(i - 1) + str(j)]
return dir_set
def get_forward_step(exit_index):
layer_ori = ['92'] # 存放第一层信息
while True:
layer_sec = [] # 存放第二层信息
for key in layer_ori: # 将layer_ori里面所能达到的位置,存放在layer_sec中
layer_sec += direction[key]
if exit_index in direction[key]:
forward_step = key
if exit_index in layer_sec: break
layer_ori = layer_sec
return forward_step
if __name__ == '__main__':
yanseshibie()
direction = direction_set(data)
huish = ['39']
# data[int(huish[0][0]), int(huish[0][1])] = 888 #将出口用888标记
while True:
forward_step = get_forward_step(huish[-1])
huish += [forward_step]
if forward_step == '92':
break
step = huish[::-1][:-1]
for ind in step:
data[int(ind[0]), int(ind[1])] = -8
print(data)
print(step)
if下面是下面的id的
import numpy as np
import cv2 # 导入opencv模块
# 迷宫中0的位置代表墙,不能走
# 8代表入口,1代表可走位置
# 888代表出口
migong = '''
0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 1 1 1 1 1 0
0 1 1 1 1 0 1 1 1 1 0 0
0 1 1 1 1 1 1 1 1 888 1 0
0 0 1 0 0 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 0 1 1 1 1 0 0 0 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 8 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0'''
data = np.array(migong.split(), dtype=int).reshape((12, 12))#以空格为分隔符,强制装换成int
def yanseshibie(): # 创建一个函数,函数名随意定义
#初始化变量
i=1
y0 = 0
y1 = 49
x0 = 0
x1 = 63
x3=1
y3=1
a=0
while(True):
frame = cv2.imread("/home/pi/tupian/cheku_xinban1111.jpg")
cv2.imshow("original", frame) # 输出视频每一帧
frame= frame[y0:y1, x0:x1] # 裁剪坐标为[y0:y1, x0:x1]
cv2.imwrite('/home/pi/migong_tupian/'+str(i)+'.jpg',frame)
x0 = x0+63
x1 = x1+63
#y3 = y3+1
if i%10==0 and i!=1:#下面是下一个的
y0 = y0+49
y1 = y1+49
x0 = 0
x1 = 63
x3 = x3+1
y3 = 1
if(i>=100):
break
i=i+1#每次进入循环加1
#a = frame.size
#print("像素值:",a)
# 将这一帧图像BGR转换为HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 这一帧图像限定在HSV蓝色的范围
blue_lower = np.array([0, 100, 50])
blue_upper = np.array([10, 255, 225])
# 阈值HSV图像以仅获得所选颜色,将图像二值化
# 就是将低于lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255
blue_mask = cv2.inRange(hsv, blue_lower, blue_upper)
# Bitwise-AND屏蔽原始图像
blue_res = cv2.bitwise_and(frame, frame, mask=blue_mask)
# 结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
# 形态学结束
blue_closing = cv2.morphologyEx(blue_res, cv2.MORPH_CLOSE, kernel)
# 转换为黑白图像
blue_gray = cv2.cvtColor(blue_closing, cv2.COLOR_BGR2GRAY)
(thresh2, blue_bw) = cv2.threshold(blue_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 计算像素变化
blue_black = cv2.countNonZero(blue_bw)
print("白色区域:", blue_black)
if blue_black > 100:
# print("视频中有蓝色像素")
data[x3,y3]=4
print(x3,y3)
y3 = y3+1
#else:
#print("无蓝色")
# 显示结果帧
cv2.imshow('blue_quyu', blue_bw)
def direction_set(data):
"""
函数功能,找到data中未被走过的地方,并同时记录该地方能够走的地方
"""
dir_set = {}
v, h = np.where(data > 0)
for i, j in zip(v, h):
key = str(i) + str(j)
if data[i, j + 1] > 0: # 该地方东邻块是否能走
dir_set[key] = [str(i) + str(j + 1)]
if data[i + 1, j] > 0: # 该地方南邻块是否能走
if key in dir_set:
dir_set[key] += [str(i + 1) + str(j)]
else:
dir_set[key] = [str(i + 1) + str(j)]
# data[i, j-1]
if data[i, j - 1] > 0: # 该地方西邻块是否能走
if key in dir_set:
dir_set[key] += [str(i) + str(j - 1)]
else:
dir_set[key] = [str(i) + str(j - 1)]
# data[i-1, j]
if data[i - 1, j] > 0: # 该地方北邻块是否能走
if key in dir_set:
dir_set[key] += [str(i - 1) + str(j)]
else:
dir_set[key] = [str(i - 1) + str(j)]
return dir_set
def get_forward_step(exit_index):
layer_ori = ['92'] # 存放第一层信息
while True:
layer_sec = [] # 存放第二层信息
for key in layer_ori: # 将layer_ori里面所能达到的位置,存放在layer_sec中
layer_sec += direction[key]
if exit_index in direction[key]:
forward_step = key
if exit_index in layer_sec: break
layer_ori = layer_sec
return forward_step
if __name__ == '__main__':
yanseshibie()
direction = direction_set(data)
huish = ['39']
# data[int(huish[0][0]), int(huish[0][1])] = 888 #将出口用888标记
while True:
forward_step = get_forward_step(huish[-1])
huish += [forward_step]
if forward_step == '92':
break
step = huish[::-1][:-1]
for ind in step:
data[int(ind[0]), int(ind[1])] = -8
print(data)
print(step)
半成品
import numpy as np
import cv2 # 导入opencv模块
# 迷宫中0的位置代表墙,不能走
# 8代表入口,1代表可走位置
# 888代表出口
migong = '''
0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 1 1 1 1 1 0
0 1 1 1 1 0 1 1 1 1 0 0
0 1 1 1 1 1 1 1 1 888 1 0
0 0 1 0 0 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 0 1 1 1 1 0 0 0 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 1 8 1 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0'''
data = np.array(migong.split(), dtype=int).reshape((12, 12))#以空格为分隔符,强制装换成int
def yanseshibie(): # 创建一个函数,函数名随意定义
#初始化变量
i=1
y0 = 0
y1 = 49
x0 = 0
x1 = 63
x3=1
y3=1
a=0
while(True):
if i%10==1 and i!=1:#下面是下一个的
y0 = y0+49
y1 = y1+49
x0 = 0
x1 = 63
x3 = x3+1
y3 = 1
frame = cv2.imread("/home/pi/tupian/cheku_xinban1111.jpg")
cv2.imshow("original", frame) # 输出视频每一帧
frame= frame[y0:y1, x0:x1] # 裁剪坐标为[y0:y1, x0:x1]
cv2.imwrite('/home/pi/migong_tupian/'+str(i)+'.jpg',frame)
x0 = x0+63
x1 = x1+63
if(i>=100):
break
i=i+1#每次进入循环加1
#a = frame.size
#print("像素值:",a)
# 将这一帧图像BGR转换为HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 这一帧图像限定在HSV蓝色的范围
blue_lower = np.array([0, 100, 50])
blue_upper = np.array([10, 255, 225])
# 阈值HSV图像以仅获得所选颜色,将图像二值化
# 就是将低于lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255
blue_mask = cv2.inRange(hsv, blue_lower, blue_upper)
# Bitwise-AND屏蔽原始图像
blue_res = cv2.bitwise_and(frame, frame, mask=blue_mask)
# 结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
# 形态学结束
blue_closing = cv2.morphologyEx(blue_res, cv2.MORPH_CLOSE, kernel)
# 转换为黑白图像
blue_gray = cv2.cvtColor(blue_closing, cv2.COLOR_BGR2GRAY)
(thresh2, blue_bw) = cv2.threshold(blue_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 计算像素变化
blue_black = cv2.countNonZero(blue_bw)
print("白色区域:", blue_black)
if blue_black > 100:
# print("视频中有蓝色像素")
data[x3,y3]=4
print(x3,y3)
y3 = y3+1
#else:
#print("无蓝色")
# 显示结果帧
cv2.imshow('blue_quyu', blue_bw)
def direction_set(data):
"""
函数功能,找到data中未被走过的地方,并同时记录该地方能够走的地方
"""
dir_set = {}
v, h = np.where(data > 0)
for i, j in zip(v, h):
key = str(i) + str(j)
if data[i, j + 1] > 0: # 该地方东邻块是否能走
dir_set[key] = [str(i) + str(j + 1)]
if data[i + 1, j] > 0: # 该地方南邻块是否能走
if key in dir_set:
dir_set[key] += [str(i + 1) + str(j)]
else:
dir_set[key] = [str(i + 1) + str(j)]
# data[i, j-1]
if data[i, j - 1] > 0: # 该地方西邻块是否能走
if key in dir_set:
dir_set[key] += [str(i) + str(j - 1)]
else:
dir_set[key] = [str(i) + str(j - 1)]
# data[i-1, j]
if data[i - 1, j] > 0: # 该地方北邻块是否能走
if key in dir_set:
dir_set[key] += [str(i - 1) + str(j)]
else:
dir_set[key] = [str(i - 1) + str(j)]
return dir_set
def get_forward_step(exit_index):
layer_ori = ['92'] # 存放第一层信息
while True:
layer_sec = [] # 存放第二层信息
for key in layer_ori: # 将layer_ori里面所能达到的位置,存放在layer_sec中
layer_sec += direction[key]
if exit_index in direction[key]:
forward_step = key
if exit_index in layer_sec: break
layer_ori = layer_sec
return forward_step
if __name__ == '__main__':
yanseshibie()
direction = direction_set(data)
huish = ['39']
# data[int(huish[0][0]), int(huish[0][1])] = 888 #将出口用888标记
while True:
forward_step = get_forward_step(huish[-1])
huish += [forward_step]
if forward_step == '92':
break
step = huish[::-1][:-1]
for ind in step:
data[int(ind[0]), int(ind[1])] = -8
print(data)
print(step)