学习在不使用机器学习或任何框架的情况下,如何在Python中进行物体检测。

作者 | Ravindu Senaratne

译者 | 弯月,责编 | 屠敏

头图 | CSDN 下载自视觉中国

出品 | CSDN(ID:CSDNnews)

以下为译文:

每当我们听说“物体检测”时,就会想到机器学习和各种不同的框架。但实际上,我们可以在不使用机器学习或任何其他框架的情况下进行物体检测。在本文中,我将向你展示如何仅使用Python进行操作。

首先,我们定义一个模板图像(或者叫模板物体),然后程序将在源图像中查找与我们选择的模板匹配的所有其他物体。举例来说明一下。下面有两张图片,上面是飞机的源图像,下面是模板照片,其中的物体为飞机。

下面我们来编写python代码,圈出源图像中所有匹配模板图像的区域。

首先,我们来检测一个物体。然后再调整代码实现多个物体的检测。

检测一个物体:最准确的那个物体

我们需要一个源图像和一个模板图像。模板图像在源图像上滑动(像2D卷积有一样),然后程序将尝试找到最准确的匹配项。

下面我们开始写代码。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv2.imread('SourceIMG.jpeg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('TemplateIMG.jpeg', 0)

在上述代码中,我们使用OpenCV读取SourceIMG.jpeg和TemplateIMG.jpeg。

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)

我们可以使用上面的代码从概率图中找出小点的位置。然后使用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(该位置为匹配开始的位置)作为左上角。同样,我们可以通过top_left[0] + width和top_left [1] + height获得右下角。通过这些尺寸,我们可以使用cv2.rectangle绘制蓝色矩形。

一切准备就绪,下面我们进行可视化。

cv2.imshow("Matched image", img_rgb)
cv2.waitKey()
cv2.destroyAllWindows()

完整的代码:

import cv2
import numpy as np
from 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_SQDIFF
bottom_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.waitKey()
cv2.destroyAllWindows()

检测多个物体:在给定阈值下进行检测

上述我们已经完成了单个物体的检测,即选择源图像和模板图像之差的最小值。通过定义阈值的方法,我们可以检测所有与模板图像相似的物体。

为此,我将使用与上例相同的源图像和模板图像,并设置阈值为概率大于0.5(你可以查看res数组来确定阈值)。我们只需要更改几行代码即可检测多个物体。

res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)

在这里,我使用TM_CCOEFF_NORMED,因为我们需要获取最大值,而不是最小值。这意味着我们需要寻找多个物体而不是一个。

threshold = 0.5 #For TM_CCOEFF_NORMED, larger values means good fit
loc = np.where( res >= threshold)

我们要查找所有大于阈值的位置值。loc接收2个输出数组,并将这些数组组合在一起,这样就可以获得x,y坐标。

for pt in zip(*loc[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + width, pt[1] + height), (255, 0, 0), 1)

这里有多个位置。因此,我们需要针对所有位置绘制蓝色矩形。下面我们来进行可视化。

完整的代码:

import cv2
import numpy as np
from 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.waitKey()
cv2.destroyAllWindows()

看起来很简单吧?但是如果我们使用机器学习或框架,则可以达到更高的准确性。

感谢您的阅读,希望本文对您有所帮助。

原文:https://towardsdatascience.com/object-detection-on-python-using-template-matching-ab4243a0ca62

本文为 CSDN 翻译,转载请注明来源出处。

更多精彩推荐
☞国内厂商 Onyx 违反 GPL 协议,中国开源何去何从?
☞无代码时代下,程序员不够用了!
☞漏答题、偏科、多次复读,30 位互联网大佬考上啥大学了?
☞云计算与星辰大海的结合——不要回答,来自百亿光年外的未知信号
☞用机器学习还原《隐秘的角落》那些被修改的台词
☞一文速览 Eth2.0 的 7 大客户端进展
点分享点点赞点在看

放弃机器学习,Python 如何进行物体检测?相关推荐

  1. 教你在Python中构建物体检测系统(附代码、学习资料)

    作者:FAIZANSHAIKH 翻译:闫晓雨 校对:张玲 本文约3200字,建议阅读10分钟. 本文介绍物体检测技术以及解决此领域问题的几种不同方法,带你深入研究在Python中如何构建我们自己的对象 ...

  2. 用python做视觉检测系统_教你用 Python 做一个物体检测系统

    在本文中,我们将了解物体检测技术是什么以及可以用来解决此领域问题的几种不同方法,接着深入研究在Python中如何构建我们自己的对象检测系统.在本文结束时,您将拥有足够的知识来独自迎接不同的物体检测挑战 ...

  3. 基于python的移动物体检测_感兴趣区域的移动物体检测,框出移动物体的轮廓 (固定摄像头, opencv-python)...

    感兴趣区域.特定区域.框出移动物体的轮廓.越界检测.入侵物体检测.使用 opencv-python库的函数cv2.findContours.cv2.approxPolyDP.cv2.arcLength ...

  4. 基于python的移动物体检测_树莓派+摄像头实现对移动物体的检测

    在上一篇文章中实现了树莓派下对摄像头的调用,有兴趣的可以看一下:python+opencv实现摄像头调用的方法 接下来,我们将使用python+opencv实现对移动物体的检测 一.环境变量的配置 我 ...

  5. 报名 | “智见AI”SpringCamp:物体检测与深度神经网络模型设计

    AI未来的路在哪里?有的先行者早已智见!扫描下文中的二维码或点击阅读原文,即可参与本次"智见AI"SpringCamp--计算机视觉之物体检测与深度神经网络模型设计专场,与大咖一同 ...

  6. 手把手教你用深度学习做物体检测(四):模型使用

    上一篇<手把手教你用深度学习做物体检测(三):模型训练>中介绍了如何使用yolov3训练我们自己的物体检测模型,本篇文章将重点介绍如何使用我们训练好的模型来检测图片或视频中的物体.   如 ...

  7. python 提取最小外接矩形_放弃机器学习框架,如何用 Python 做物体检测?

    每当我们听说"物体检测"时,就会想到机器学习和各种不同的框架.但实际上,我们可以在不使用机器学习或任何其他框架的情况下进行物体检测.在本文中,我将向你展示如何仅使用Python进行 ...

  8. python重量计算月球上的物体_Tensorflow.物体检测_资料(raccoon浣熊)

    ZC:类似之前的文章,没太多看头 ZC:主看这个 ZC:(20190905)训练起来好慢... 它指定的最多的step是 200k,文章中说 "TensorBoard的主界面,可以看出来,在 ...

  9. voxelnet_苹果最新机器学习论文:使用VoxelNet进行3D物体检测

    原标题:苹果最新机器学习论文:使用VoxelNet进行3D物体检测 原文来源:arXiv 作者:Yin Zhou.OncelTuzel 「雷克世界」编译:嗯~阿童木呀 多啦A亮 现如今,3D点云(3D ...

最新文章

  1. 题解 P4753 【River Jumping】
  2. 9soc sensor与bayer sensor 区别,内外置isp
  3. 【opencv】图像细化
  4. 新装oracle密码文件,oracle密码文件的重建
  5. php和xml区别,html与xhtml和xml有什么区别
  6. ML/DL-复习笔记【二】- L1正则化和L2正则化
  7. MFC 通用对话框之字体对话框
  8. java获取本机ip_java获取本机IP
  9. 【程序员如何买基金 八】筛选优秀的债券基金
  10. 指定vtp为服务器命令,VTP与单臂路由
  11. 《大型网站技术架构-核心原理与案例分析》(李智慧 著)第3章-大型网站核心架构要素
  12. 量化选股宝三步走,京豆礼包你拿走
  13. qt4.8.5在arm下的移植
  14. [C语言数据结构]栈
  15. java字节流与字符流的区别编码缓冲
  16. 基于管道过滤器实现的kwic实现
  17. 【多线程】线程与进程、以及线程进程的调度
  18. 端口被占用时怎么解决?
  19. 《AcFun 的视频架构演化实践》读后感
  20. 机器学习从零到一的基础知识总集篇

热门文章

  1. Windows的空格预览神器 | QuickLook
  2. 【心情】bjdldrz
  3. 移动开发之手势与双指缩放
  4. 一个阿拉伯数字转中文数字的函数
  5. 并发环境下的缓存容器性能优化(上):不可变的哈希表
  6. 几个有用的小程序(转载)
  7. dubbo mysql_Dubbo学习系列之六(微服务架构实战)
  8. 如何自己用U盘重装系统
  9. Unity3D实现按钮切换Panel的功能
  10. 在gcp终端中使用ssh连接到本地机器