温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用OpenCV实现迷宫解密

发布时间:2022-10-17 10:42:07 来源:亿速云 阅读:128 作者:iii 栏目:开发技术

今天小编给大家分享一下如何使用OpenCV实现迷宫解密的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    一、你能自己走出迷宫吗?

    如下图所示,可以看到是一张较为复杂的迷宫图,相信也有人尝试过自己一点一点的找出口,但我们肉眼来解谜恐怕眼睛有点小难受,特别是走了半天发现这迷宫无解,代入一下已经生气了,所以我们何必不直接开挂,使用opencv来代替我们寻找最优解。

    恩,不错,那就整!

    二、使用OpenCV找出出口。

    1、对图像进行二值化处理。

    此时我们的图像就反了过来,我们只需要找到一条从入口连续到出口的黑线即可。

    import cv2
    import numpy as np
     
    img = cv2.imread('../photos/1.png')
    # cv2.imshow('maze',img)
    # cv2.waitKey(0)
    # cv2.destroyAllWindows()
     
    #对图像进行二值化
    # Binary conversion
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
     
    #反转tholdolding将给我们一个二进制的图像与白色的墙壁和黑色的背景。
    ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
    cv2.imshow('THRESH_BINARY_INV',thresh)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    如何使用OpenCV实现迷宫解密

    2、 对二值化后的图像进行轮廓检测并标注

    可以看到大致路线已经出现。

    #对二值化处理的图像进行轮廓检测并标注
    # Contours
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL,
                                           cv2.CHAIN_APPROX_NONE)
    print('len(contours):',len(contours))
     
    # dc=cv2.drawContours(thresh, contours, 0, (255, 255, 255), -1)
    #用不同颜色来标注
    dc=cv2.drawContours(thresh, contours, 0, (255, 255, 255), 5)
     
    # TODO 大迷宫的len(contours): 26
    dc=cv2.drawContours(dc, contours, 1, (0, 0, 0), 5)
    cv2.imshow('drawContours',dc)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    如何使用OpenCV实现迷宫解密

    3、对图像阈值进行处理。

    #对图像阈值进行处理
    ret, thresh = cv2.threshold(dc, 240, 255, cv2.THRESH_BINARY)
     
    # ret, thresh = cv2.threshold(thresh, 240, 255, cv2.THRESH_BINARY)
    cv2.imshow('thresh3',thresh)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    如何使用OpenCV实现迷宫解密

    4、对图像进行扩展操作。

    扩张是数学形态领域的两个基本操作者之一,另一个是侵蚀。它通常应用于二进制图像,但有一些版本可用于灰度图像。

    操作者对二进制图像的基本效果是逐渐扩大前景像素区域的边界(通常为白色像素)。因此,前景像素的面积大小增加,而这些区域内的孔变小。

    # Dilate
    ke = 10
    # kernel = np.ones((19, 19), np.uint8)
    kernel = np.ones((ke, ke), np.uint8)
    dilation = cv2.dilate(thresh, kernel, iterations=1)
    cv2.imshow('dilation',dilation)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    如何使用OpenCV实现迷宫解密

    5、对图像进行侵蚀操作。 

    侵蚀是第二个形态运算符。它也适用于二进制图像。操作者对二进制图像的基本效果是消除前景像素区域的边界(通常为白色像素)。

    因此,前景像素的面积缩小,并且这些区域内的孔变大。

    # Erosion
    erosion = cv2.erode(dilation, kernel, iterations=1)
    cv2.imshow('erosion',erosion)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    如何使用OpenCV实现迷宫解密

    6、分迷宫通道找出路径。

    为了在原始迷宫图像上显示解决方案,首先将原来的迷宫分割成r,g,b组件。现在通过反转diff图像创建一个掩码。使用在最后一步中创建的掩码的原始迷宫的按位和r和g分量。这一步将从迷宫解决方案的图像部分去除红色和绿色成分。最后一个是合并所有组件,我们将使用蓝色标记的解决方案。

    #找到两个图像的差异
    diff = cv2.absdiff(dilation, erosion)
     
    # 分迷宫的通道
    b, g, r = cv2.split(img)
    mask_inv = cv2.bitwise_not(diff)
     
    # masking out the green and red colour from the solved path
    r = cv2.bitwise_and(r, r, mask=mask_inv)
    g = cv2.bitwise_and(g, g, mask=mask_inv)
     
    res = cv2.merge((b, g, r))
    cv2.imshow('Solved Maze', res)
     
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    如何使用OpenCV实现迷宫解密

     三、完整代码如下。

    import cv2
    import numpy as np
     
    img = cv2.imread('../photos/1.png')
    cv2.imshow('maze',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
     
     
     
    #对图像进行二值化
    # Binary conversion
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
     
    #反转tholdolding将给我们一个二进制的图像与白色的墙壁和黑色的背景。
    ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
    cv2.imshow('THRESH_BINARY_INV',thresh)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
     
    #对二值化处理的图像进行轮廓检测并标注
    # Contours
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL,
                                           cv2.CHAIN_APPROX_NONE)
    print('len(contours):',len(contours))
     
    # dc=cv2.drawContours(thresh, contours, 0, (255, 255, 255), -1)
    #用不同颜色来标注
    dc=cv2.drawContours(thresh, contours, 0, (255, 255, 255), 5)
     
    # TODO 大迷宫的len(contours): 26
    dc=cv2.drawContours(dc, contours, 1, (0, 0, 0), 5)
    cv2.imshow('drawContours',dc)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
     
    #对图像阈值进行处理
    ret, thresh = cv2.threshold(dc, 240, 255, cv2.THRESH_BINARY)
     
    # ret, thresh = cv2.threshold(thresh, 240, 255, cv2.THRESH_BINARY)
    cv2.imshow('thresh3',thresh)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
     
     
    '''
    扩张
    扩张是数学形态领域的两个基本操作者之一,另一个是侵蚀。它通常应用于二进制图像,但有一些版本可用于灰度图像。
    操作者对二进制图像的基本效果是逐渐扩大前景像素区域的边界(通常为白色像素)。因此,前景像素的面积大小增加,而这些区域内的孔变小。
    '''
    # Dilate
    ke = 10
    # kernel = np.ones((19, 19), np.uint8)
    kernel = np.ones((ke, ke), np.uint8)
    dilation = cv2.dilate(thresh, kernel, iterations=1)
    cv2.imshow('dilation',dilation)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
     
    # Erosion
    #侵蚀是第二个形态运算符。它也适用于二进制图像。操作者对二进制图像的基本效果是消除前景像素区域的边界(通常为白色像素)。
    # 因此,前景像素的面积缩小,并且这些区域内的孔变大。
    erosion = cv2.erode(dilation, kernel, iterations=1)
    cv2.imshow('erosion',erosion)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
     
    #找到两个图像的差异
    diff = cv2.absdiff(dilation, erosion)
    cv2.imshow('diff',diff)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
     
    # 分迷宫的通道
    b, g, r = cv2.split(img)
    mask_inv = cv2.bitwise_not(diff)
    #为了在原始迷宫图像上显示解决方案,首先将原来的迷宫分割成r,g,b组件。现在通过反转diff图像创建一个掩码。
    # 使用在最后一步中创建的掩码的原始迷宫的按位和r和g分量。这一步将从迷宫解决方案的图像部分去除红色和绿色成分。
    # 最后一个是合并所有组件,我们将使用蓝色标记的解决方案。
    # masking out the green and red colour from the solved path
    r = cv2.bitwise_and(r, r, mask=mask_inv)
    g = cv2.bitwise_and(g, g, mask=mask_inv)
     
    res = cv2.merge((b, g, r))
    cv2.imshow('Solved Maze', res)
     
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    以上就是“如何使用OpenCV实现迷宫解密”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI