放弃机器学习,Python 如何进行物体检测?
你是否曾以为物体检测必须依赖复杂的机器学习模型?今天,就来打破这个认知!我将手把手教你,如何在不使用任何机器学习框架的情况下,仅用Python实现物体检测。
作者 | Ravindu Senaratne
译者 | 弯月,责编 | 屠敏
头图 | CSDN 下载自视觉中国
出品 | CSDN(ID:CSDNnews)
以下为译文:
一提到物体检测,人们往往立刻联想到机器学习和各种框架。但真相是,抛开这些,你照样能玩转物体识别!本文就带你用纯Python探索一种经典方法。
核心思路很简单:先选定一个模板图像,然后让程序在源图像中扫描,找出所有匹配的区域。举个例子,下面这张源图里有飞机,而模板图正是飞机局部。

接下来,我们用Python代码框出源图中所有匹配位置。先从检测单个物体入手,再扩展到多物体识别。
策略一:精准打击——检测最佳匹配物体
准备一张源图像和一张模板图像。模板就像滑动窗口,在源图上逐像素移动比对,找出相似度最高的区域。
下面我们开始写代码。
import cv2import numpy as npfrom matplotlib import pyplot as pltimg_rgb = cv2.imread('SourceIMG.jpeg')img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)template = cv2.imread('TemplateIMG.jpeg', 0)
上面代码用OpenCV加载了源图和模板图。
height, width = template.shape[::]
模板在源图上滑窗搜索时,我们需要记录匹配区域的左上角坐标,并根据模板的宽高绘制矩形框。
res = cv2.matchTemplate(img_gray, template, cv2.TM_SQDIFF)
OpenCV的模板匹配功能会计算灰度图的统计指标。这里选用最小平方差(TM_SQDIFF),因为我们追求模板与源图的最小差异。
plt.imshow(res, cmap='gray')
将结果可视化,你会得到一张概率图,其中的暗点就是潜在匹配位置。
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
这行代码从概率图中提取最小值、最大值及对应位置。我们取最小值位置作为匹配起点。
top_left = min_loc bottom_right = (top_left[0] + width, top_left[1] + height)cv2.rectangle(img_rgb, top_left, bottom_right, (255, 0, 0), 2)
以min_loc为左上角,加上模板宽高算出右下角,就能用cv2.rectangle画出一个蓝色矩形框出物体。
展示结果图像。
cv2.imshow("Matched image", img_rgb)cv2.waitKeycv2.destroyAllWindows
完整代码如下:
import cv2import numpy as npfrom matplotlib import pyplot as pltimg_rgb = cv2.imread('SourceIMG.jpeg')img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)template = cv2.imread('TemplateIMG.jpeg', 0)height, width = template.shape[::]res = cv2.matchTemplate(img_gray, template, cv2.TM_SQDIFF)plt.imshow(res, cmap='gray')min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)top_left = min_loc Change to max_loc for all except for TM_SQDIFFbottom_right = (top_left[0] + width, top_left[1] + height)cv2.rectangle(img_rgb, top_left, bottom_right, (255, 0, 0), 2)cv2.imshow("Matched image", img_rgb)cv2.waitKeycv2.destroyAllWindows
策略二:批量识别——基于阈值检测多个物体
单个物体检测只选最佳匹配。要识别所有相似物体,只需设个阈值,抓出所有可能区域。沿用之前的图片,设定阈值为0.5(具体值可调整)。
只需改动几行代码,就能实现多物体检测。
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
这里改用TM_CCOEFF_NORMED,因为我们需要匹配度高(值大)的区域,而非单个最小值。
threshold = 0.5 For TM_CCOEFF_NORMED, larger values means good fitloc = np.where( res >= threshold)
找出所有大于阈值的位置坐标。loc包含两个数组,组合后即得一系列(x,y)点。
for pt in zip(loc[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + width, pt[1] + height), (255, 0, 0), 1)
遍历所有匹配点,逐一画出矩形框。来瞧瞧效果。
完整代码如下:
import cv2import numpy as npfrom matplotlib import pyplot as pltimg_rgb = cv2.imread('SourceIMG.jpeg')img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)template = cv2.imread('TemplateIMG.jpeg', 0)height, width = template.shape[::]res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)plt.imshow(res, cmap='gray')threshold = 0.5 For TM_CCOEFF_NORMED, larger values = good fit.loc = np.where( res >= threshold)for pt in zip(loc[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + width, pt[1] + height), (255, 0, 0), 1)cv2.imshow("Matched image", img_rgb)cv2.waitKeycv2.destroyAllWindows
看,两种策略各显神通:一种精准定位,一种批量抓取。虽然机器学习能达到更高精度,但这种方法胜在简单快捷,特别适合快速验证和入门。
现在,轮到你动手了!尝试用这个方法来识别你图片中的物体,在评论区分享你的实验结果吧!
原文:https://towardsdatascience.com/object-detection-on-python-using-template-matching-ab4243a0ca62
本文为 CSDN 翻译,转载请注明来源出处。
相关问答
atm物体识别技术是什么?
ATM不是物体识别技术,而是银行自动提款机的一个简写,现在,随着银行业务的快速发展,手机APP等线上业务也越来越多,现在使用ATM机上取款或者存款的人也越来越...
智能视觉分析系统如何实现车道与物体检测?-ZOL问答
这不就是靠摄像头加AI算法嘛,车道线识别应该是通过图像处理技术,比如边缘检测啥的,然后物体检测就是用深度学习模型,像YOLO或者FasterR-CNN这种,训练好了专门识...
物体识别怎么用?
物体识别的使用方法根据不同的场景和技术会有所不同,以下是一些常见的物体识别使用方法:静态图像物体识别。这种场景下,物体识别技术通常采用深度学习技术对...
允许盲人识别形状和物体的新技术是怎样的?
一项令人难以置信的新技术正在让失明人士有能力识别形状和物体,而这些形状和物体都是在他们的大脑上“画出来”的。一篇描述该技术的研究论文刚刚发表在《细胞》...
物体是否导电,我们可以用电路检测器检测,请写出检测步骤急用...
物体是否导电,我们可以用电路检测器检测,请写出检测步骤急用!111题目急用!111答案解析解答一在物体两端加上一定的电压,测量通过的电流,可以测量其电阻大...
R-C3D算法如何快速视频活动物体检测?
对车速的检测一般都用编码器或者光电对管来测速没见过用直接用视频图像进行测速的对车速的检测一般都用编码器或者光电对管来测速没见过用直接用视频图像进...
手机怎么智能识别物体?
手机要智能识别物体,一般通过使用先进的计算机视觉技术和深度学习算法来实现。这些技术可以分析图像或视频中的物体,识别并分类它们。首先,手机需要获取图像或...
智能扫一扫识别物体app?
万能拍照识别app可以智能扫一扫识别物体。万能拍照识别app这是一款功能较为全面的拍照识别软件,不仅可以识别植物花草,还可以识别动物、语言、文字、菜品、车...
opencv物体检测原理?
OpenCV内置目标检测OpenCV内置的目标检测主要是对于特定物体(人脸)或者运动物体进行检测,本例使用OpenCV中的MOG2算法对运动的目标进行检测,检测后使用腐蚀...
人是怎样识别物体的?
谢邀。识别物体,或“格物”,旨在“致知”。主要涉及注意力与统筹力。以下分享三个要点。一,全局考虑,注重细节。下面这道题,个个细节,处处陷阱,险象环生...