检测相似的物体并从图像中裁剪出来

时间:2019-02-08 09:37:37

标签: python-3.x opencv3.0

我必须提取以下内容:object

来自给定图像:

image我尝试了轮廓检测,但是给出了所有轮廓。但是我特别需要该图像中的那个对象。

我的想法是:

  1. 在图像中找到对象
  2. 在其周围绘制边框
  3. 裁剪并单独保存。

我正在使用 opencv 并使用 python3 ,这是我的新手。

如图所示,存在三个与给定模板相似但大小不同的对象。也有其他框不是您感兴趣的区域。裁剪后,我想将它们另存为三个单独的图像。有这种情况的解决方案吗?

我尝试了将多尺度模板与裁剪后的模板匹配。

这是尝试:

# import the necessary packages
import numpy as np
import argparse
import imutils
import glob
import cv2

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-t", "--template", required=True, help="Path to template image")

args = vars(ap.parse_args())

# load the image image, convert it to grayscale, and detect edges
template = cv2.imread(args["template"])
template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
template = cv2.Canny(template, 50, 200)
(tH, tW) = template.shape[:2]
image = cv2.imread('input.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# loop over the scales of the image
for scale in np.linspace(0.2, 1.0, 20)[::-1]:
# resize the image according to the scale, and keep track
# of the ratio of the resizing
    resized = imutils.resize(gray, width = int(gray.shape[1] * scale))
    r = gray.shape[1] / float(resized.shape[1])
    # if the resized image is smaller than the template, then break
    # from the loop
    if resized.shape[0] < tH or resized.shape[1] < tW:
        break
    # detect edges in the resized, grayscale image and apply template
    # matching to find the template in the image
    edged = cv2.Canny(resized, 50, 200)
    res = cv2.matchTemplate(edged, template, cv2.TM_CCOEFF)
loc = np.where( res >= 0.95)
for pt in zip(*loc[::-1]):
        cv2.rectangle(image, int(pt*r), (int((pt[0] + tW)*r), int((pt[1] + tH)*r)), (0,255,0), 2)

cv2.imwrite('re.png',image)

我得到的结果是: result预期结果是包围所有便利贴盒的边框

1 个答案:

答案 0 :(得分:0)

我目前正在移动设备上,因此我无法真正编写代码,但是this链接确实可以满足您的需求!

如果不清楚,我可以在今晚晚些时候(当我可以使用笔记本电脑时)将代码修改为您的示例。

在您的情况下,我将裁剪出形状的内容(便利贴)和模板匹配内容,仅在边缘上。这样可以确保它不会被里面的文字抛出。

祝你好运!