前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV中使用模板匹配识别空闲的货架空间

OpenCV中使用模板匹配识别空闲的货架空间

作者头像
AI算法与图像处理
发布2021-06-08 11:32:47
6740
发布2021-06-08 11:32:47
举报

假设你是一名在超市工作的员工,被要求在商店里四处走动,检查需要重新进货的货架。但是,超市有时会有多个区域来存放一种特定的产品,所以要跟踪购物者购买产品的确切位置并不容易。最重要的是,报告库存的空货架空间可能非常耗时,而且总是存在人为缺陷的可能性。这就是通过计算机视觉识别空的货架空间可能会派上用场的地方。

我们创建两个独特的模板并遍历图像以找到足够相似的多维数组。相似度是基于我们可配置的阈值。OpenCV的模板matchTemplate函数可以实现该操作。

模板匹配

有一些方法可以通过计算机视觉来实现这一点,有些比其他的更好,然而,在这篇文章中,我们将尝试OpenCV中的模板匹配。

模板匹配是一种在较大的图像中搜索和查找模板图像位置的方法。OpenCV附带了一个函数cv.matchTemplate()为这个目的。它简单地将模板图像滑动到输入图像上(就像在2D卷积中一样),并在模板图像下比较输入图像的模板和补丁。

模板匹配的第一步是创建我们的模板。当看到上面的照片,我们可以立即识别出中间顶部的两个架子有空余的空间。在最上面的架子上,我们可以确定有3-5个白色的bag产品需要重新进货。在第二个架子上,我们可以看到大约有两种产品需要重新进货。

首先,让我们用Python加载以下图片:

代码语言:javascript
复制
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread("/content/drive/MyDrive/Computer Vision/new_shelf.jpg")
plt.figure(figsize = (20,15))
plt.imshow(img)

下面是创建特定模板的代码(注意template_2由于空置面积较小,更窄):

代码语言:javascript
复制
template_1 = img[60:270, 1890:2010]
plt.imshow(template_1)
template_2 = img[300:500, 1825:1905]
plt.imshow(template_2)

模板2(中间第2格)

如果你想的话,你可以调整模板的大小,我觉得这些是最合适的。此外,如果你想知道为什么模板颜色看起来不同于原始图像,这是因为CV2作为加载图像BGR而不是RGB。

匹配过程

现在我们有了模板,我们可以开始匹配过程了。为此,我们首先将模板存储为一个具有不同属性的类,例如标签(1,2)和颜色(以区分为不同模板绘制的矩形框)。再次,巨大的呼喊Jean Rovani’s模板匹配博客和代码:

代码语言:javascript
复制
*******************************************************************/
* Title: template_defenition.py
* Author: Jean Rovani
* Date: 2020
* Code version: 3rd revision
* Availability: https://gist.github.com/jrovani/012f0c6e66647b4e7b844797fa6ded22#file-template_definition-py
*******************************************************************/
DEFAULT_TEMPLATE_MATCHING_THRESHOLD = 0.85
class Template:
    def __init__(self, label, template, color, matching_threshold=DEFAULT_TEMPLATE_MATCHING_THRESHOLD):
        self.label = label
        self.color = color
        self.template = template
        self.template_height, self.template_width = self.template.shape[:2]
        self.matching_threshold = matching_threshold
image = cv2.imread("/content/drive/MyDrive/Computer Vision/shelf_new.jpg")
templates = [
    Template(label="1", template = template_1, color=(0, 0, 255)),
    Template(label="2", template = template_2, color=(0, 255, 0))
]

接下来,我们遍历图像,并存储满足或超过阈值要求。

代码语言:javascript
复制
*******************************************************************/
* Title: plot_bounding_boxes.py
* Author: Jean Rovani
* Date: 2020
* Code version: 6th revision
* Availability: https://gist.github.com/jrovani/099f80a5ee75657ff7aa6ed491568f04#file-plot_bounding_boxes-py
*******************************************************************/
detections_1 = []
detections_2 = []
for template in templates:
    template_matching = cv2.matchTemplate(
        template.template, image, cv2.TM_CCOEFF_NORMED
    )
match_locations = np.where(template_matching >= template.matching_threshold)
for (x, y) in zip(match_locations[1], match_locations[0]):
        match = {
            "TOP_LEFT_X": x,
            "TOP_LEFT_Y": y,
            "BOTTOM_RIGHT_X": x + template.template_width,
            "BOTTOM_RIGHT_Y": y + template.template_height,
            "MATCH_VALUE": template_matching[y, x],
            "LABEL": template.label,
            "COLOR": template.color
        }
        if match['LABEL'] == '1':
          detections_1.append(match)
        else:
          detections_2.append(match)

现在我们有了探测的所有数据,让我们看看它们在原始图像上是什么样子的cv2.rectangle功能:

代码语言:javascript
复制
image_with_detections = image.copy()
for temp_d in [detections_1, detections_2]:
  for detection in temp_d:
      cv2.rectangle(
          image_with_detections,
          (detection["TOP_LEFT_X"], detection["TOP_LEFT_Y"]),
          (detection["BOTTOM_RIGHT_X"], detection["BOTTOM_RIGHT_Y"]),
          detection["COLOR"],
          2,
      )
plt.figure(figsize = (20,15))
plt.imshow(image_with_detections)

模板与副本匹配

我们有发现了!这里的问题是检测List正在存储副本。为了解决这个问题,我们只需要确保我们只会使用一个不与其他矩形重叠的矩形:

消除重复检测

代码语言:javascript
复制
#Sorting detections by BOTTOM_RIGHT_X coordinate
detections_1 = sorted(detections_1, key = lambda i: i['BOTTOM_RIGHT_X'])
detections_2 = sorted(detections_2, key = lambda i: i['BOTTOM_RIGHT_X'])
det_wo_dupl_1 = [detections_1[0]]
det_wo_dupl_2 = [detections_2[0]]
check = 1
min_x_1 = templates[0].template.shape[1]
min_x_2 = templates[1].template.shape[1]
for d in range(1, len(detections_1)):
  min_x_check = detections_1[d]["BOTTOM_RIGHT_X"] - detections_1[d-check]["BOTTOM_RIGHT_X"]
  if min_x_check > min_x_1:
    det_wo_dupl_1.append(detections_1[d])
    check = 1
  else:
    check += 1
check = 1
for d in range(1, len(detections_2)):
  min_x_check = detections_2[d]["BOTTOM_RIGHT_X"] - detections_2[d-check]["BOTTOM_RIGHT_X"]
  if min_x_check > min_x_2:
    det_wo_dupl_2.append(detections_2[d])
    check = 1
  else:
    check += 1
det_wo_dupl = det_wo_dupl_1 + det_wo_dupl_2
print(len(det_wo_dupl))

过滤检测

代码语言:javascript
复制
image_with_detections = image.copy()
min_x = templates[0].template.shape[1]
for detection in det_wo_dupl:
    cv2.rectangle(
        image_with_detections,
        (detection["TOP_LEFT_X"], detection["TOP_LEFT_Y"]),
        (detection["BOTTOM_RIGHT_X"], detection["BOTTOM_RIGHT_Y"]),
        detection["COLOR"],
        20,
    )
plt.figure(figsize = (20,15))
plt.imshow(image_with_detections)

模板匹配的缺点

有人可能会说,实际上应该有5个矩形显示在最上面的架子上,因为其中一个袋子似乎是轻微倾斜/移动。如果使用模板匹配,就很难找到这种方法。我们需要多个不同尺寸的模板来捕获这张图片中的所有空货架区域。

总结

尽管模板匹配在我们这里的用例中工作得很好,并且对于许多其他用例来说是一个很棒的计算机视觉过程,但它可能不是这个场景的最佳选择。对于这样的问题,我们需要一种算法,可以学习理解一个空区域的周围乘积。这将允许更大的灵活性,因为它将能够处理不同大小/颜色的空白区域。

代码语言:javascript
复制
个人微信(如果没有备注不拉群!)请注明:地区+学校/企业+研究方向+昵称


下载1:何恺明顶会分享
在「AI算法与图像处理」公众号后台回复:何恺明,即可下载。总共有6份PDF,涉及 ResNet、Mask RCNN等经典工作的总结分析
下载2:终身受益的编程指南:Google编程风格指南
在「AI算法与图像处理」公众号后台回复:c++,即可下载。历经十年考验,最权威的编程规范!
代码语言:javascript
复制
下载3 CVPR2021
在「AI算法与图像处理」公众号后台回复:CVPR,即可下载1467篇CVPR 2020论文 和 CVPR 2021 最新论文
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI算法与图像处理 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档