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

重磅干货,第一时间送达

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

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

模板匹配

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

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

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

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

import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("/content/drive/MyDrive/Computer Vision/new_shelf.jpg")plt.figure(figsize = (20,15))plt.imshow(img)

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

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模板匹配博客和代码:

*******************************************************************/* 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.85class 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_thresholdimage = 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))]

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

*******************************************************************/* 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功能:

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正在存储副本。为了解决这个问题,我们只需要确保我们只会使用一个不与其他矩形重叠的矩形:

消除重复检测

#Sorting detections by BOTTOM_RIGHT_X coordinatedetections_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 = 1min_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 += 1check = 1for 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 += 1det_wo_dupl = det_wo_dupl_1 + det_wo_dupl_2print(len(det_wo_dupl))

过滤检测

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个矩形显示在最上面的架子上,因为其中一个袋子似乎是轻微倾斜/移动。如果使用模板匹配,就很难找到这种方法。我们需要多个不同尺寸的模板来捕获这张图片中的所有空货架区域。

总结

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

下载1:OpenCV-Contrib扩展模块中文版教程
(0)

相关推荐

  • OpenCV实战(1)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 最近 ...

  • 项目实践 | 行人跟踪与摔倒检测报警(文末获取完整源码)

    重磅干货,第一时间送达 来源:AI 人工智能初学者 1.简介 本项目的目的是为了给大家提供跟多的实战思路,抛砖引玉为大家提供一个案例,也希望读者可以根据该方法实现更多的思想与想法,也希望读者可以改进该 ...

  • 【从零学习OpenCV 4】图像模板匹配

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 临床中合病应该如何识别处理

    今日头条:中医林佳明 荔枝微课:中医林佳明 更新时间:每天更新 今天是我写日记第983天. 大家在林氏医门群里讨论讨论很热烈,分享关于自己治疗的经验,对于常见病,多发病都取得了不错的效果. 燕嫦说:师 ...

  • [中衍期货] 如何识别非法证券期货活动

    近年来,随着政府对非法证券期货活动打击力度的不断加大,不法分子从事非法证券期货活动的手法不断翻新,非法证券期货活动的隐蔽性也越来越强.识别非法证券期货活动,可以从以下四个方面来判断: (1)看业务资质 ...

  • OpenCV中cv2的用法

    一.读入图像 使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整路径 flags:读入图片的标志  cv2.IMREAD_COLOR:默认参数 ...

  • opencv中自适应阈值函数的实现(c++)

    根据<面向飞机蒙皮接缝的线结构光检测技术研究_张卡>论文中的原理,编写了自适应阈值函数 原理: 1 //计算灰度最大最小值 2 void MaxGrayValue(Mat image,in ...

  • (6条消息) OpenCV中的findContours函数参数详解

    OpenCV中的findContours函数参数详解 小白的进阶 2017-07-30 18:02:28 55008 收藏 303分类专栏:OpenCV 文章标签:opencvOpenCV中通过使用f ...

  • 在OpenCV中基于深度学习的边缘检测

    重磅干货,第一时间送达 本文转自:AI算法与图像处理 导读 分析了Canny的优劣,并给出了OpenCV使用深度学习做边缘检测的流程,文末有代码链接. 在这篇文章中,我们将学习如何在OpenCV中使用 ...

  • 115、如何处理交易中的假突破 期货 股市中的真假突破识别技巧

    在期货股市当中常出现一种现象,看见上涨趋买就会跌,看见跌就去卖结果会上涨,当股民和炒期货的人遇到这种情况就会埋怨是市场的问题或者是主力庄家的问题,其实在这里我想说的是需要想想自己,为什么要在涨的时候去 ...

  • 自动驾驶中的交通标志识别原理及控制应用

    自动驾驶中的交通标志识别原理及控制应用