树莓派迷宫小车程序备份(ing版本)

本次版本图片裁剪出错,正在找错误 

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
    n=1
    y0 = 0
    y1 = 49
    x0 = 0
    x1 = 63
    x3=1
    y3=1
    z=1
    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(z)+'.jpg',frame)
        
        if i==11 :
            i=1
            n=n+1
            f=2
            

        if i==1 and n!=1:
            print(i)
            y0 = y0+49
            y1 = y1+49
            x0 = 0
            x1 = 63
        #if i!=1:
        x0 = x0+63
        x1 = x1+63
        
       # if f==2:
         #   x0 = x0-63
          #  x1 = x1-63
            
            
        
        

        if z==91:
            break
        #print(z)
        z=z+1
        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, 90])
        blue_upper = np.array([10, 255, 225])
        
        blue_mask = cv2.inRange(hsv, blue_lower, blue_upper)
        
        #blue_mask = blue_mask0+blue_mask1

        


        # 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 > 38:
          #  print("视频中有蓝色像素")
            data[x3,y3]=4
        print(x3,y3)
        if i==1:
            x3 = x3+1
            y3 = 1
        if i!=1  :
            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)

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值