IG 奪冠啦!王老闆火啦!連王老闆吃熱狗都吃的如此銷魂,那咱們固然要來在人羣中找到他呢!python
看到一個美術生的做品,如何 3 秒內找到思聰王。算法
我找了很久啊,這幅圖畫的真是魔性,看得眼睛都花了,浪費了我寶貴的上班時間。不得不認可,我,做爲一個工科生,3 秒鐘是找不到了。可是,個人電腦能夠呀!bash
連美術生都出動調侃王思聰了,工科生怎麼能坐以待斃!那我就趁着上班,來作一個自動找王思聰的實現吧。函數
既然在上班,就要用一種比較專業的方式來展開個人工做。工具
項目目標:在一羣鴨子中找到 吃熱狗的 王思聰學習
項目實現:Python ,OpenCVui
項目成果:0.3 秒內找到spa
項目技術路線:code
項目具體實現:cdn
圖像處理,做爲計算機算法中十分大的一類,現成的代碼庫中有一個很是適合用來作
1.得到鴨子同等大小的王思聰 —— resize(OpenCV)
這個部分主要是數據的預處理,說得很專業,其實就是用電腦自帶的截圖工具,截取一個小鴨子,他的大小大約爲 36*36。咱們就相應地把王思聰 resize 到和小鴨子同等大小,這裏採用了插值 inter_cubic 的方式來進行重採樣。
王思聰的圖來自 那位可愛的美術生。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" Created on Wed Nov 7 11:42:02 2018 @author: aaron """
import cv2
template = cv2.imread('wangsicong.png')
template = cv2.resize(template, (40, 40),
interpolation=cv2.INTER_CUBIC)複製代碼
2.在原圖全局搜索,匹配王思聰所在的位置 —— matchTemplate (opencv)
OpenCV 做爲一個比較全能的圖像處理庫,可以提供較爲許多圖像處理的基礎,好比邊緣監測函數能夠直接用於監測圖像的邊界(OpenCV 也提供了 canny 算子、sobel 算子等)。
這裏咱們使用 模版匹配算法(matchTemplate),他幫助算法在一副圖像中找到特定的目標。該函數須要四個參數,
所以,該搜索主要是以像素級別的匹配,不會進行縮放;
咱們目前的任務中王思聰的色調並無改變,所以任何一種方法的差別並非很大。
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image.jpg')
template = cv2.imread('detect.png')
# Apply template Matching
res = cv2.matchTemplate(img,template,eval('cv2.TM_CCOEFF'))
# Get the size of template
w, h = template[:,:,0].shape[::-1]複製代碼
3.在王思聰周圍畫個紅框 —— minMaxLoc(OpenCV);
matchTemplate 函數獲得的結果是一個灰度數值圖,給出的是圖像中每個 detect 範圍的匹配程度,灰度數值越大,則類似度越高。
爲了畫出這個最有可能出現思聰王的位置,咱們使用 OpenCVv 的 minMaxLoc 函數來獲得思聰王邊框的具體位置,並進一步使用 OpenCV 的 rectangle 函數來畫出這個框。
# Get anchor for templateMatch result
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# draw rectangle
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
imgplt = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.rectangle(imgplt,top_left, bottom_right, 255, 2)
# show image
plt.imshow(imgplt)
plt.title('Detected results'), plt.xticks([]), plt.yticks([])
plt.show()
複製代碼
結果如上!成功!
4.計算機的速度 —— timeit。
Python 的 timeit 模塊可以提供 代碼運算時間 的統計,在使用這一模塊的使用,總共記錄兩次時間。一次在全部代碼運行以前,一次在全部代碼運行以後,兩次相減就獲得的 代碼運算的 總時間。
這裏列出了 timeit 時間統計的方式,可是在具體運行的時候,則須要把上述代碼所有放在兩次時間獲取的中間,也就是下述第四行的位置。
import timeit
start = timeit.default_timer()
# All your code above
stop = timeit.default_timer()
print('Time: ', stop - start)
複製代碼
我平均跑了十次,2018 年款的 MacBook Air,基本配置的平均時間是 0.2 秒!
目標達成!
PS,👆是爲了展現一下 OpenCV 的風采。所以使用了傳統的模式匹配流程。若是咱們在實際應用中,面對雷同的問題。
OpenCV 是 計算機視覺 中很是重要的類庫,他既能夠支持傳統計算機視覺處理,也能夠支持 深度學習計算機視覺。他的底層是 C++,運算速度很快,也提供了 Python 的調用接口,真的省了不少事呢!
感謝觀看!