来自给定图像:
我尝试了轮廓检测,但是给出了所有轮廓。但是我特别需要该图像中的那个对象。
我的想法是:
我正在使用 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)
答案 0 :(得分:0)
我目前正在移动设备上,因此我无法真正编写代码,但是this链接确实可以满足您的需求!
如果不清楚,我可以在今晚晚些时候(当我可以使用笔记本电脑时)将代码修改为您的示例。
在您的情况下,我将裁剪出形状的内容(便利贴)和模板匹配内容,仅在边缘上。这样可以确保它不会被里面的文字抛出。
祝你好运!