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 的调用接口,真的省了不少事呢!
感谢观看!