溫馨提示×

溫馨提示×

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

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

如何使用OpenCV實現(xiàn)迷宮解密

發(fā)布時間:2022-10-17 10:42:07 來源:億速云 閱讀:120 作者:iii 欄目:開發(fā)技術

今天小編給大家分享一下如何使用OpenCV實現(xiàn)迷宮解密的相關知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    一、你能自己走出迷宮嗎?

    如下圖所示,可以看到是一張較為復雜的迷宮圖,相信也有人嘗試過自己一點一點的找出口,但我們?nèi)庋蹃斫庵i恐怕眼睛有點小難受,特別是走了半天發(fā)現(xiàn)這迷宮無解,代入一下已經(jīng)生氣了,所以我們何必不直接開掛,使用opencv來代替我們尋找最優(yōu)解。

    恩,不錯,那就整!

    二、使用OpenCV找出出口。

    1、對圖像進行二值化處理。

    此時我們的圖像就反了過來,我們只需要找到一條從入口連續(xù)到出口的黑線即可。

    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)
     
    #反轉(zhuǎn)tholdolding將給我們一個二進制的圖像與白色的墻壁和黑色的背景。
    ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
    cv2.imshow('THRESH_BINARY_INV',thresh)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    如何使用OpenCV實現(xiàn)迷宮解密

    2、 對二值化后的圖像進行輪廓檢測并標注

    可以看到大致路線已經(jīng)出現(xiàn)。

    #對二值化處理的圖像進行輪廓檢測并標注
    # 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實現(xiàn)迷宮解密

    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實現(xiàn)迷宮解密

    4、對圖像進行擴展操作。

    擴張是數(shù)學形態(tài)領域的兩個基本操作者之一,另一個是侵蝕。它通常應用于二進制圖像,但有一些版本可用于灰度圖像。

    操作者對二進制圖像的基本效果是逐漸擴大前景像素區(qū)域的邊界(通常為白色像素)。因此,前景像素的面積大小增加,而這些區(qū)域內(nèi)的孔變小。

    # 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實現(xiàn)迷宮解密

    5、對圖像進行侵蝕操作。 

    侵蝕是第二個形態(tài)運算符。它也適用于二進制圖像。操作者對二進制圖像的基本效果是消除前景像素區(qū)域的邊界(通常為白色像素)。

    因此,前景像素的面積縮小,并且這些區(qū)域內(nèi)的孔變大。

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

    如何使用OpenCV實現(xiàn)迷宮解密

    6、分迷宮通道找出路徑。

    為了在原始迷宮圖像上顯示解決方案,首先將原來的迷宮分割成r,g,b組件?,F(xiàn)在通過反轉(zhuǎn)diff圖像創(chuàng)建一個掩碼。使用在最后一步中創(chuàng)建的掩碼的原始迷宮的按位和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實現(xiàn)迷宮解密

     三、完整代碼如下。

    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)
     
    #反轉(zhuǎn)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()
     
     
    '''
    擴張
    擴張是數(shù)學形態(tài)領域的兩個基本操作者之一,另一個是侵蝕。它通常應用于二進制圖像,但有一些版本可用于灰度圖像。
    操作者對二進制圖像的基本效果是逐漸擴大前景像素區(qū)域的邊界(通常為白色像素)。因此,前景像素的面積大小增加,而這些區(qū)域內(nèi)的孔變小。
    '''
    # 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
    #侵蝕是第二個形態(tài)運算符。它也適用于二進制圖像。操作者對二進制圖像的基本效果是消除前景像素區(qū)域的邊界(通常為白色像素)。
    # 因此,前景像素的面積縮小,并且這些區(qū)域內(nèi)的孔變大。
    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組件。現(xiàn)在通過反轉(zhuǎn)diff圖像創(chuàng)建一個掩碼。
    # 使用在最后一步中創(chuàng)建的掩碼的原始迷宮的按位和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實現(xiàn)迷宮解密”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI