你好,
我在做实例10.2 从两幅图像中选择最佳的匹配结果时遇到了问题。
下面这一段代码好像并没有使index的值在循环里得到更新,index只是一直停留在初始值-1。而且如果print(any(results[0]))的结果是true, min = 1 也是true, 我不太能够理解这个大于号的意思。
# 获取最佳匹配结果的索引
if min > any(results[0]):
index = i
希望能够得到解答,谢谢!
实例源码不会出现index始终为-1的情况,如果出现了-1,可能是你使用了实例之外的图片作为模板。
但这段代码编写的确有问题,理论上在计算出模板与原图的像素平方差数据之后,应该再计算所有像素的平方差的平均值。平均值越小,则模板与原图越相似。如果模板与原图完全一样,平方差的平均值应该为0。所以实例以1作为阈值,平均值超过1的就认为两图没有关系。我把这个例子修改了一下,可供参考。
import cv2
import numpy as np
image = [] # 存储原始图像的列表
# 向image列表添加原始图像image_221.png
image.append(cv2.imread("image_221.png"))
# 向image列表添加原始图像image_222.png
image.append(cv2.imread("image_222.png"))
templ = cv2.imread("templ.png") # 读取模板图像
index = -1 # 初始化车位编号列表的索引为-1
min = 1 # 像素方差平均值,用于记录相似度,越小越相似
for i in range(0, len(image)): # 循环匹配image列表中的原始图像
# 按照标准平方差方式匹配
results = cv2.matchTemplate(image[i], templ, cv2.TM_SQDIFF_NORMED)
meanVariance = np.mean(results[0]) # 计算出所有像素方差的平均值
if meanVariance < min: # 如果此图像平均值小于最小记录
min = meanVariance # 更新方差平均值最小记录
index = i # 记录当前图像的索引,当前图像与原图相似度最高
cv2.imshow("result", image[index]) # 显示最佳匹配结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
根号申 发表于2021-12-23 16:18
实例源码不会出现index始终为-1的情况,如果出现了-1,可能是你使用了实例之外的图片作为模板。
但这段代码编写的确有问题,理论上在计算出模板与原图的像素平方差数据之后,应该再计算所有像素的平方差的平均值。平均值越小,则模板与原图越相似。如果模板与原图完全一样,平方差的平均值应该为0。所以实例以1作为阈值,平均值超过1的就认为两图没有关系。我把这个例子修改了一下,可供参考。
import cv2
import numpy as np
image = [] # 存储原始图像的列表
# 向image列表添加原始图像image_221.png
image.append(cv2.imread("image_221.png"))
# 向image列表添加原始图像image_222.png
image.append(cv2.imread("image_222.png"))
templ = cv2.imread("templ.png") # 读取模板图像
index = -1 # 初始化车位编号列表的索引为-1
min = 1 # 像素方差平均值,用于记录相似度,越小越相似
for i in range(0, len(image)): # 循环匹配image列表中的原始图像
# 按照标准平方差方式匹配
results = cv2.matchTemplate(image[i], templ, cv2.TM_SQDIFF_NORMED)
meanVariance = np.mean(results[0]) # 计算出所有像素方差的平均值
if meanVariance < min: # 如果此图像平均值小于最小记录
min = meanVariance # 更新方差平均值最小记录
index = i # 记录当前图像的索引,当前图像与原图相似度最高
cv2.imshow("result", image[index]) # 显示最佳匹配结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
老师您好,为什么results[0]代表所有像素呢,results不是计算得出来的平方差的二维数组吗,results【0】怎么会代表所有像素呢
根号申 发表于2021-12-23 16:18
实例源码不会出现index始终为-1的情况,如果出现了-1,可能是你使用了实例之外的图片作为模板。
但这段代码编写的确有问题,理论上在计算出模板与原图的像素平方差数据之后,应该再计算所有像素的平方差的平均值。平均值越小,则模板与原图越相似。如果模板与原图完全一样,平方差的平均值应该为0。所以实例以1作为阈值,平均值超过1的就认为两图没有关系。我把这个例子修改了一下,可供参考。
import cv2
import numpy as np
image = [] # 存储原始图像的列表
# 向image列表添加原始图像image_221.png
image.append(cv2.imread("image_221.png"))
# 向image列表添加原始图像image_222.png
image.append(cv2.imread("image_222.png"))
templ = cv2.imread("templ.png") # 读取模板图像
index = -1 # 初始化车位编号列表的索引为-1
min = 1 # 像素方差平均值,用于记录相似度,越小越相似
for i in range(0, len(image)): # 循环匹配image列表中的原始图像
# 按照标准平方差方式匹配
results = cv2.matchTemplate(image[i], templ, cv2.TM_SQDIFF_NORMED)
meanVariance = np.mean(results[0]) # 计算出所有像素方差的平均值
if meanVariance < min: # 如果此图像平均值小于最小记录
min = meanVariance # 更新方差平均值最小记录
index = i # 记录当前图像的索引,当前图像与原图相似度最高
cv2.imshow("result", image[index]) # 显示最佳匹配结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
实际上书中写的代码是可以运行的吧?
只不过是为了更精细的找出相似的图片,因为大多时候不存在的模板和原图一模一样,所以说只能寻找相似,所以引入了一个方差的平均值。
书中的那个if min那里的语句是不是只是大概把不可能的最先排除掉,然后假如说有更多相似的图片,老师的代码是做了精进找出了最相近的一张图吧,而书中的就有可能是找出很多“相似”的图片