每当我们听说“物体检测”时,就会想到机器学习和各种不同的框架。但实际上,我们可以在不使用机器学习或任何其他框架的情况下进行物体检测。在本文中,我将向你展示如何仅使用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 plt
img_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 plt
img_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()
看起来很简单吧?但是如果我们使用机器学习或框架,则可以达到更高的准确性。
感谢您的阅读,希望本文对您有所帮助。

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

  1. python 提取最小外接矩形_python给人脸带上口罩(简单版)

    导读 因为目前公开的口罩人脸数据比较少,如果想训练一个口罩人脸识别模型,必须依赖大量的人脸数据.为了收集到更多的口罩人脸数据,我们只能利用已有的公开人脸数据上通过程序来模拟人脸带口罩.这篇文章向大家介 ...

  2. 怎么在python提取别的数据了_别再问如何用python提取PDF内容了!

    作者:陈熹 来源:早起Python 大家好,在之前的办公自动化系列文章中我们已经详细介绍了如何使用python批量处理PDF文件,包括合并.拆分.水印.加密等操作. 今天我们再次回到PDF,详细讲解如 ...

  3. python opencv最小外接矩形_Opencv绘制最小外接矩形、最小外接圆

    Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle. minAreaRect方法原型: RotatedRect minAre ...

  4. python opencv最小外接矩形中心点_Opencv绘制最小外接矩形、最小外接圆

    Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle. minAreaRect方法原型: RotatedRect minAre ...

  5. 提取点位属性文本_手把手教你如何用Python爬取网站文本信息

    提取网页源代码--Requests 工具包 在我们提取网络信息之前,我们必须将网页的源代码进行提取,Requests工具包现在可以说是最好用和最普及的静态网页爬虫工具,它是由大神Kenneth Rei ...

  6. python爬取网页文本_手把手教你如何用Python爬取网站文本信息

    提取网页源代码--Requests 工具包 在我们提取网络信息之前,我们必须将网页的源代码进行提取,Requests工具包现在可以说是最好用和最普及的静态网页爬虫工具,它是由大神Kenneth Rei ...

  7. python人机猜拳游戏代码_实用宝典|如何用Python实现人机猜拳小游戏

    首先,解释一下人机猜拳,猜拳相信大家都了解,通俗讲就是"石头.剪刀.布"嘛!再简单不过的一个小游戏,而所谓人机猜拳其实就是猜拳的双方中一方是人另一方是计算机. 问题一 人的问题好解 ...

  8. python外包凹多边形生成_Python实现图片查找轮廓、多边形拟合、最小外接矩形代码...

    1.概述 经常用到轮廓查找和多边形拟合等opencv操作,因此记录以备后续使用.本文代码中的阈值条件对图片没有实际意义,仅仅是为了测试. 原图为: 2.测试代码: import cv2 import ...

  9. python+opencv获取最小外接矩形

    python+opencv获取最小外接矩形 环境 代码 效果 环境 python版本:3.8 opencv版本:4.3.0.36 代码 from PIL import Image from pylab ...

最新文章

  1. HDU 5972 Regular Number(ShiftAnd+读入优化)
  2. 学python可以做什么副业-写代码做副业月入10K的方法都藏在这几个公众号里!
  3. java throwable用法_java – ExceptionHandler不能与Throwable一起使用
  4. 学校计算机教学演示,案例演示在计算机基础教学中的运用
  5. 前端学习(2148):webpack之图片的处理
  6. MBTI性格类型测试
  7. mysql数据库过滤数据_MySQL数据库常规操作一些简单绕过过滤的方法
  8. 数据告诉你,抖音凭什么逆袭?
  9. SI9000常用共面阻抗模型的解释
  10. Mybatis-Plus入门(一)
  11. 解决最近github网页无法打开问题
  12. mysql dump 1449_mysqldump1449错误解决办法
  13. 修改远程计算机 时间,Pubwin服务器时间修改的四种办法
  14. 任务开始时间和完成时间
  15. sort函数用法详解
  16. final 修饰的成员变量必须手动初始化
  17. (附源码)springboot电影选座订票app 毕业设计 011439
  18. java基础第二十五天 数据库
  19. Android源码看设计模式(十二)--------关于观察者模式的Rxjava的相关分析
  20. 牛油果怎么催熟 牛油果催熟法

热门文章

  1. 单独组件_苹果已停止对macOS Big Sur 11.0.1版本macOS系统组件的单独更新
  2. 熟悉Linux的环境实验报告,实验1 熟悉Linux开发环境 实验报告
  3. mac环境下安装Gradle及配置
  4. nginx mysql占用率高_nginx/mysql查看内存占用
  5. c语言变量在头文件定义变量吗,在头文件C中声明变量
  6. android快速充电实现_用一个快充头实现苹果安卓同时快充,实在太赞了!
  7. php mssql 端口,MSSQL_SQL Server端口更改后的数据库连接方式,SQL Server端口,大家可以通过quot - phpStudy...
  8. mysql按逗号拼接起来_MySQL ----- 计算字段(Trim,Concat,as)(九)
  9. goahead如何使用cgi服务_北斗导航系统现已提供全球服务!你知道如何使用这个服务吗?...
  10. c语言如何回缩一个字符,撑大的胃怎样能瘦回去 被撑大的胃还能缩回去吗