已有184人关注
关于第10章模板匹配中的实例10.2
发表在Python图书答疑 2021-12-21 《Python OpenCV从入门到实践》第10章 模板匹配
是否精华
版块置顶:

你好,


我在做实例10.2 从两幅图像中选择最佳的匹配结果时遇到了问题。

下面这一段代码好像并没有使index的值在循环里得到更新,index只是一直停留在初始值-1。而且如果print(any(results[0]))的结果是true, min = 1 也是true, 我不太能够理解这个大于号的意思。


 # 获取最佳匹配结果的索引

 if min > any(results[0]):

       index = i


希望能够得到解答,谢谢!


分享到:
精彩评论 5
根号申
学分:4736 LV12
TA的每日心情
2021-07-16 23:48:46
2021-12-23
沙发

    实例源码不会出现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()  # 释放所有窗体


根号申
学分:4736 LV12
TA的每日心情
2021-07-16 23:48:46
game99258
学分:2266 LV10
2022-08-03
地板

index = i ,表示循环

K凛丶Ts_1670240580
学分:2 LV1
2022-12-05
4L

根号申 发表于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】怎么会代表所有像素呢

K凛丶Ts_1670240580
学分:2 LV1
2022-12-05
5L

根号申 发表于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那里的语句是不是只是大概把不可能的最先排除掉,然后假如说有更多相似的图片,老师的代码是做了精进找出了最相近的一张图吧,而书中的就有可能是找出很多“相似”的图片

首页上一页 1 下一页尾页 5 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照