「找一找」考你眼力的時候到了!

機器視覺OpenCV圖片模板匹配javascript


養成好習慣:文中文末小廣告幫忙點一點java


什麼是模板匹配
python

簡單來講模板匹配就是經過現有的模板去與圖片進行比較找出圖中所匹配的圖像nginx


首先來看一下效果圖:
web



左圖是模板圖片,中圖是帶測試的圖片,右圖是匹配的結果
微信


程序將在「中圖」中匹配「左圖」的模板圖片,若是中圖中含有模板圖片的話,則會在中圖畫出模板圖片的位置(用藍線圈出來)。app




模板匹配原理:函數

模板匹配是一種用於在較大圖像中搜索和查找模板圖像位置的方法。爲此,OpenCV帶有一個函數cv2.matchTemplate()。它只是將模板圖像滑動到輸入圖像上(就像在2D卷積中同樣),而後在模板圖像下比較模板和輸入圖像的補丁。OpenCV中實現了幾種比較方法。(您能夠檢查文檔以瞭解更多詳細信息)。它返回一個灰度圖像,其中每一個像素表示該像素的鄰域與模板匹配多少。工具


若是輸入圖像的大小(WxH)和模板圖像的大小(wxh),則輸出圖像的大小將爲(W-w + 1,H-h + 1)。
得到結果後,能夠使用cv2.minMaxLoc()函數查找最大/最小值在哪裏。將其做爲矩形的左上角,並以(w,h)做爲矩形的寬度和高度。該矩形是您模板的區域。
學習




目錄:

    1.前提

     2.兩種方法實現

     3.後記



1.前提:


程序運行以前先安裝一下相關的庫

cv2imutils

報錯1:

ModuleNotFoundError: No module named 'cv2' (安裝cv2)

說明缺乏opencv庫

在命令提示符窗口 中,執行下面的命令:

pip install opencv-python

若是以爲下載過慢的能夠執行下面的命令:(使用了豆瓣源下載,結果和上面是同樣的,只不過這個命令安裝快一些)

pip install -i https://pypi.doubanio.com/simple/ opencv-python



兩種方法實現:


  • 第一次方法:圖像模板匹配(最簡單)

模板匹配和卷積原理很像,模板在原圖像上從原點開始滑動,計算模板與(圖像被模板覆蓋的地方)的差異程度,這個差異程度的計算方法在OpenCV裏有6種,而後將每次的結果放入一個矩陣裏,做爲結果輸出。假如原圖形是AXB大小,而模板是axb大小,則輸出結果的矩陣是(A-a+1)x(B-b+1)


代碼:

"""Created on 2020-11-11
@author: 李運辰"""#模板匹配import numpy as npimport cv2
def cv_show(name,image): cv2.imshow(name,image) cv2.waitKey(0) cv2.destroyAllWindows()
img = cv2.imread("source.jpg")template = cv2.imread("m.jpg")

# 轉換爲灰度圖片gray1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 讀取測試圖片並將其轉化爲灰度圖片gray2 = cv2.cvtColor(template,cv2.COLOR_BGR2GRAY)h,w = template.shape[:2]#匹配#TM_SQDIFF 匹配方法,歸一化的方法更好用res = cv2.matchTemplate(gray1,gray2,cv2.TM_SQDIFF)#獲得極值座標min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)top_left = min_locbottom_right = (top_left[0]+w,top_left[1]+h)#畫出標記點cv2.rectangle(img,top_left,bottom_right,255,2)cv_show("img",img)

運行結果:




  • 第二種方法:多尺度模板匹配

多尺度模板匹配實現步驟

  • 步驟1-讀取模板圖片,並依次執行灰度化和邊緣檢測處理;

  • 步驟2-讀取測試圖片,遍歷整個尺度空間,進行圖片裁剪;

  • 步驟3-依次執行邊緣檢測和模板匹配,獲取到外接矩形;

  • 步驟4-根據結果對測試圖片中模板所在的位置進行更新;

  • 步驟5-首先進行位置轉換,而後繪製矩形框,最後顯示結果。


代碼實現:

"""Created on 2020-11-11
@author: 李運辰"""# coding=utf-8# 導入python包import numpy as npimport imutilsimport cv2
# 讀取模板圖片template = cv2.imread("m.jpg")# 轉換爲灰度圖片template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)# 讀取測試圖片並將其轉化爲灰度圖片image = cv2.imread('source.jpg')gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 執行邊緣檢測template = cv2.Canny(template, 50, 200)(tH, tW) = template.shape[:2]# 顯示模板#cv2.imshow("Template", template)

found = None
# 循環遍歷不一樣的尺度for scale in np.linspace(0.2, 1.0, 20)[::-1]: # 根據尺度大小對輸入圖片進行裁剪 resized = imutils.resize(gray, width = int(gray.shape[1] * scale)) r = gray.shape[1] / float(resized.shape[1])
# 若是裁剪以後的圖片小於模板的大小直接退出 if resized.shape[0] < tH or resized.shape[1] < tW: break
# 首先進行邊緣檢測,而後執行模板檢測,接着獲取最小外接矩形 edged = cv2.Canny(resized, 50, 200) #匹配 #TM_SQDIFF 匹配方法,歸一化的方法更好用 result = cv2.matchTemplate(edged, template, cv2.TM_CCOEFF) (_, maxVal, _, maxLoc) = cv2.minMaxLoc(result)
# 結果可視化 # 繪製矩形框並顯示結果 clone = np.dstack([edged, edged, edged]) cv2.rectangle(clone, (maxLoc[0], maxLoc[1]), (maxLoc[0] + tW, maxLoc[1] + tH), (0, 0, 255), 2) #cv2.imshow("Visualize", clone) #cv2.waitKey(0)
# 若是發現一個新的關聯值則進行更新 if found is None or maxVal > found[0]: found = (maxVal, maxLoc, r)
# 計算測試圖片中模板所在的具體位置,即左上角和右下角的座標值,並乘上對應的裁剪因子(_, maxLoc, r) = found(startX, startY) = (int(maxLoc[0] * r), int(maxLoc[1] * r))(endX, endY) = (int((maxLoc[0] + tW) * r), int((maxLoc[1] + tH) * r))
# 繪製並顯示結果cv2.rectangle(image, (startX, startY), (endX, endY), (0, 0, 255), 2)cv2.imshow("Image", image)cv2.waitKey(0)

運行結果:


3.後記:

        若是你們學會這種技術以後,再稍微改進一下,弄錯一個小腳本,這樣下次玩開心消消樂的那能夠直接無敵了,不再用擔憂找不到匹配的小方塊了,哈哈哈哈。

       在集體照的茫茫人海中,你還怕我找不到你???經過模板匹配,直接定位你的位置


最後幫忙點一點文中文末小廣告 


正文結束!!!!

歡迎關注公衆號:Python爬蟲數據分析挖掘,方便及時閱讀最新文章

記錄學習python的點點滴滴;

回覆【開源源碼】免費獲取更多開源項目源碼;

公衆號每日更新python知識和【免費】工具;

本文已同步到【開源中國】、【騰訊雲社區】、【CSDN】;



本文分享自微信公衆號 - Python爬蟲數據分析挖掘(zyzx3344)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索