中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用OpenCV實現迷宮解密

發布時間:2022-10-17 10:42:07 來源:億速云 閱讀:127 作者: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

    喜德县| 乡宁县| 洞头县| 稻城县| 阆中市| 犍为县| 杭锦旗| 五峰| 新安县| 石狮市| 西和县| 泗水县| 堆龙德庆县| 台湾省| 永春县| 晋江市| 信宜市| 湘乡市| 互助| 方城县| 阳江市| 龙川县| 奉贤区| 许昌县| 锡林浩特市| 凌源市| 抚顺市| 达孜县| 弋阳县| 瓦房店市| 改则县| 浦县| 武乡县| 石阡县| 盘山县| 彭山县| 平安县| 金湖县| 万安县| 万山特区| 张家川|