- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 Python 中实现以下 C++ 代码:https://opencv-code.com/tutorials/fast-template-matching-with-image-pyramid/
如果您检查 C++ 代码,您会看到这个循环:
for (int i = 0; i < contours.size(); i++)
{
cv::Rect r = cv::boundingRect(contours[i]);
cv::matchTemplate(
ref(r + (tpl.size() - cv::Size(1,1))),
tpl,
res(r),
CV_TM_CCORR_NORMED
);
}
我的 Python 代码:
for i in range(0, np.size(contours)-1):
x, y, w, h = cv.boundingRect(contours[i][0])
tpl_X = curr_template.shape[1]-1
tpl_Y = curr_template.shape[0]-1
result[y:h, x:w] = cv.matchTemplate(
curr_image[y:h+tpl_Y, x:w+tpl_X],
curr_template, cv.TM_CCORR_NORMED)
我不断收到错误消息:ValueError: 无法将输入数组从形状 (53,51) 广播到形状 (52,52)
这个数字 (53, 51) (52,52) 可能会随着我对结果或 curr_image 中的坐标稍作修改而改变,但这不是正确的答案。
这是我当前的代码:
import cv2 as cv
import numpy as np
import argparse
import os
"""
This script performs a fast template matching algorithm using the OpenCV
function matchTemplate plus an approximation through pyramid construction to
improve it's performance on large images.
"""
def buildPyramid(image, max_level):
results = [image]
aux = image
for i in range(0,max_level):
aux = cv.pyrDown(aux)
results = [aux] + results
return results
def temp_match(input, template, max_level):
results = []
source_pyr = buildPyramid(input, max_level)
template_pyr = buildPyramid(template, max_level)
for lvl in range(0, int(max_level), 1):
curr_image = source_pyr[lvl]
curr_template = template_pyr[lvl]
dX = curr_image.shape[1] + 1 - curr_template.shape[1]
dY = curr_image.shape[0] + 1 - curr_template.shape[0]
result = np.zeros([dX, dY])
#On the first level performs regular template matching.
if lvl == 0:
result = cv.matchTemplate(curr_image, curr_template,
cv.TM_CCORR_NORMED)
#On every other level, perform pyramid transformation and template
#matching on the predefined ROI areas, obtained using the result of the
#previous level.
else:
mask = cv.pyrUp(r)
mask8u = cv.inRange(mask, 0, 255)
contours = cv.findContours(mask8u, cv.RETR_EXTERNAL,
cv.CHAIN_APPROX_NONE)
#Uses contours to define the region of interest and perform TM on
#the areas.
for i in range(0, np.size(contours)-1):
x, y, w, h = cv.boundingRect(contours[i][0])
tpl_X = curr_template.shape[1]
tpl_Y = curr_template.shape[0]
#result = cv.matchTemplate(curr_image, curr_template,
# cv.TM_CCORR_NORMED)
result[y:y+h, x:x+w] = cv.matchTemplate(
curr_image[y:y+h+tpl_Y, x:x+w+tpl_X],
curr_template, cv.TM_CCORR_NORMED)
T, r = cv.threshold(result, 0.94, 1., cv.THRESH_TOZERO)
cv.imshow("test", r)
cv.waitKey()
results.append(r)
return results
def ftm_pyramid(input_file, template_file, max_level = 5):
if file_exists(input_file) == False:
raise IOError("Input file not found.")
if file_exists(template_file) == False:
raise IOError("Input file not found.")
img = cv.imread(input_file)
tpl = cv.imread(template_file)
image = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
template = cv.cvtColor(tpl, cv.COLOR_BGR2GRAY)
tm_results = temp_match(image, template, max_level)
c = 0
flag = False
while flag == False and c < np.size(tm_results):
current = tm_results[c]
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(current)
if max_val > 0.9:
cv.rectangle(img,
max_loc,
(max_loc[0] + template.shape[1],
max_loc[1] + template.shape[0]),
(0,0,255), 2)
else:
flag = True
c = c+1
cv.imshow("Result", img)
cv.waitKey()
return 0
# Auxiliary methods
def file_exists(input_file):
"""
:param input_file: path to the input file
:return: true or false wether the file exists or not.
"""
if input_file == '':
raise ValueError("The input file can't be ''.")
if input_file == None:
raise ValueError("The input file can't be a None object")
return os.path.isfile(input_file)
if __name__ == '__main__':
#CLI arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", required="True",
help="Path to the input image.")
ap.add_argument("-t", "--template", required="True",
help="Path to the template image.")
ap.add_argument("-l", "--levels", help="Number of levels of the pyramid.")
args = vars(ap.parse_args())
#Loading values
input_file = args["input"]
template = args["template"]
max_lvl = args["levels"]
if max_lvl == None:
max_lvl = 5
ftm_pyramid(input_file, template, max_lvl)
非常感谢任何帮助!
最佳答案
在图像金字塔中做图像模板匹配从粗到精
,很多领域的基本思想。
你的代码有问题,我引用了原来的CPP代码和你的Python代码重写了
这是引用图像
和模板图像
:
这是结果
:
#!/usr/bin/python3
# 2017.10.04 14:50:50 CST START
# 2017.10.04 17:32:39 CST FINISH
import cv2
import numpy as np
import argparse
import os
def fileExists(filename):
"""Judge wether the file exists!
"""
if filename in ('', None):
raise ValueError("The input file can't be '' or None.")
return os.path.isfile(filename)
def buildPyramid(image, maxleval):
"""Build image pyramid for level [0,...,maxlevel]
"""
imgpyr = [image]
aux = image
for i in range(0,maxleval):
aux = cv2.pyrDown(aux)
imgpyr.append(aux)
imgpyr.reverse()
return imgpyr
def fastTemplateMatchPyramid(src_refimg, src_tplimg, maxleval):
"""Do fast template matching using matchTemplate plus an approximation
through pyramid construction to improve it's performance on large images.
"""
results = []
## Change BGR to Grayscale
gray_refimg = cv2.cvtColor(src_refimg, cv2.COLOR_BGR2GRAY)
gray_tplimg = cv2.cvtColor(src_tplimg, cv2.COLOR_BGR2GRAY)
## Build image pyramid
refimgs = buildPyramid(gray_refimg, maxleval)
tplimgs = buildPyramid(gray_tplimg, maxleval)
## Do template match
for idx in range(0, maxleval+1):
refimg = refimgs[idx]
tplimg = tplimgs[idx]
# On the first level performs regular template matching.
# On every other level, perform pyramid transformation and template matching
# on the predefined ROI areas, obtained using the result of the previous level.
# Uses contours to define the region of interest and perform TM on the areas.
if idx == 0:
result = cv2.matchTemplate(refimg, tplimg, cv2.TM_CCORR_NORMED)
else:
mask = cv2.pyrUp(threshed)
mask8u = cv2.inRange(mask, 0, 255)
contours = cv2.findContours(mask8u, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2]
tH, tW = tplimg.shape[:2]
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
src = refimg[y:y+h+tH, x:x+w+tW]
result = cv2.matchTemplate(src, tplimg, cv2.TM_CCORR_NORMED)
T, threshed = cv2.threshold(result, 0.90, 1., cv2.THRESH_TOZERO)
results.append(threshed)
return threshed
#return results
def fastTemplateMatch(refname, tplname, maxleval = 5):
"""Fast template match.
"""
## Read the image pairs.
if fileExists(refname) == False:
raise IOError("Input file not found.")
if fileExists(tplname) == False:
raise IOError("Input file not found.")
refimg = cv2.imread(refname)
tplimg = cv2.imread(tplname)
cv2.imwrite("cat.png",refimg)
## Call fastTemplateMatchInPyramid()
result = fastTemplateMatchPyramid(refimg, tplimg, maxleval)
## Analysis the result
minval, maxval, minloc, maxloc = cv2.minMaxLoc(result)
if maxval > 0.9:
pt1 = maxloc
pt2 = (maxloc[0] + tplimg.shape[1], maxloc[1] + tplimg.shape[0])
print("Found the template region: {} => {}".format(pt1,pt2))
dst = refimg.copy()
cv2.rectangle(dst, pt1, pt2, (0,255,0), 2)
cv2.imshow("Result", dst)
cv2.imwrite("template_matching_result.png",dst)
cv2.waitKey()
else:
print("Cannot find the template in the origin image!")
if __name__ == '__main__':
## CLI arguments
"""
ap = argparse.ArgumentParser()
ap.add_argument("-r", "--referer", required="True",
help="Path to the referer image.")
ap.add_argument("-t", "--template", required="True",
help="Path to the template image.")
ap.add_argument("-l", "--levels", help="Number of levels of the pyramid.")
args = vars(ap.parse_args())
## Loading values
refname = args["referer"]
tplname = args["template"]
maxlevel = args["levels"]
"""
## Set parmeters
refname = "/home/auss/Pictures/cat.jpg"
tplname = "cat_face.png"
maxlevel = 5
## call the function
fastTemplateMatch(refname, tplname, maxlevel)
关于python - 在 Python 中使用 Pyramids 进行快速模板匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29605119/
我喜欢 smartcase,也喜欢 * 和 # 搜索命令。但我更希望 * 和 # 搜索命令区分大小写,而/和 ?搜索命令遵循 smartcase 启发式。 是否有隐藏在某个地方我还没有找到的设置?我宁
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
从以下网站,我找到了执行java AD身份验证的代码。 http://java2db.com/jndi-ldap-programming/solution-to-sslhandshakeexcepti
似乎 melt 会使用 id 列和堆叠的测量变量 reshape 您的数据框,然后通过转换让您执行聚合。 ddply,从 plyr 包看起来非常相似..你给它一个数据框,几个用于分组的列变量和一个聚合
我的问题是关于 memcached。 Facebook 使用 memcached 作为其结构化数据的缓存,以减少用户的延迟。他们在 Linux 上使用 UDP 优化了 memcached 的性能。 h
在 Camel route ,我正在使用 exec 组件通过 grep 进行 curl ,但使用 ${HOSTNAME} 的 grep 无法正常工作,下面是我的 Camel 路线。请在这方面寻求帮助。
我正在尝试执行相当复杂的查询,在其中我可以排除与特定条件集匹配的项目。这是一个 super 简化的模型来解释我的困境: class Thing(models.Model) user = mod
我正在尝试执行相当复杂的查询,我可以在其中排除符合特定条件集的项目。这里有一个 super 简化的模型来解释我的困境: class Thing(models.Model) user = mod
我发现了很多嵌入/内容项目的旧方法,并且我遵循了在这里找到的最新方法(我假设):https://blog.angular-university.io/angular-ng-content/ 我正在尝试
我正在寻找如何使用 fastify-nextjs 启动 fastify-cli 的建议 我曾尝试将代码简单地添加到建议的位置,但它不起作用。 'use strict' const path = req
我正在尝试将振幅 js 与 React 和 Gatsby 集成。做 gatsby developer 时一切看起来都不错,因为它发生在浏览器中,但是当我尝试 gatsby build 时,我收到以下错
我试图避免过度执行空值检查,但同时我想在需要使代码健壮的时候进行空值检查。但有时我觉得它开始变得如此防御,因为我没有实现 API。然后我避免了一些空检查,但是当我开始单元测试时,它开始总是等待运行时异
尝试进行包含一些 NOT 的 Kibana 搜索,但获得包含 NOT 的结果,因此猜测我的语法不正确: "chocolate" AND "milk" AND NOT "cow" AND NOT "tr
我正在使用开源代码共享包在 iOS 中进行 facebook 集成,但收到错误“FT_Load_Glyph failed: glyph 65535: error 6”。我在另一台 mac 机器上尝试了
我正在尝试估计一个标准的 tobit 模型,该模型被审查为零。 变量是 因变量 : 幸福 自变量 : 城市(芝加哥,纽约), 性别(男,女), 就业(0=失业,1=就业), 工作类型(失业,蓝色,白色
我有一个像这样的项目布局 样本/ 一种/ 源/ 主要的/ java / java 资源/ .jpg 乙/ 源/ 主要的/ java / B.java 资源/ B.jpg 构建.gradle 设置.gr
如何循环遍历数组中的多个属性以及如何使用map函数将数组中的多个属性显示到网页 import React, { Component } from 'react'; import './App.css'
我有一个 JavaScript 函数,它进行 AJAX 调用以返回一些数据,该调用是在选择列表更改事件上触发的。 我尝试了多种方法来在等待时显示加载程序,因为它当前暂停了选择列表,从客户的 Angul
可能以前问过,但找不到。 我正在用以下形式写很多语句: if (bar.getFoo() != null) { this.foo = bar.getFoo(); } 我想到了三元运算符,但我认
我有一个表单,在将其发送到 PHP 之前我正在执行一些验证 JavaScript,验证后的 JavaScript 函数会发布用户在 中输入的文本。页面底部的标签;然而,此消息显示短暂,然后消失...
我是一名优秀的程序员,十分优秀!