Python基于SIFT关键点匹配实现logo存在判断的IF语句编写指导
SIFT logo存在性判断实现步骤
- 第一步:过滤低质量匹配。SIFT返回的匹配结果中,
match.distance属性越小代表匹配精度越高,我们先过滤掉距离过大的误匹配,可采用动态阈值(最小匹配距离的3倍)或固定阈值(比如200)过滤。 - 第二步:设置判定阈值。提前测试10-20张带目标logo和不带logo的样本图,统计有效匹配数的分界值,比如测试下来有效匹配数≥15时均为带logo的图,就将阈值设为15,可根据实际效果调整。
- 第三步:编写判断逻辑,将结果传入模板渲染。
- 可选优化:加入单应性变换校验,通过RANSAC算法验证匹配点的空间位置是否符合透视变换规则,能大幅降低误判概率。
修改后完整代码
import os import cv2 import matplotlib.pyplot as plt from flask import Flask, render_template, url_for app = Flask(__name__) # 请自行配置上传文件夹路径 app.config['UPLOAD_FOLDER'] = 'your_upload_folder_path' @app.route('/identify/<filename>') def identify(filename): """ After uploading the image, show the identification of the uploaded image """ # 加载上传的背景图 image_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) image_url = url_for('images', filename=filename) background_image = cv2.imread(image_path) background_image = cv2.cvtColor(background_image, cv2.COLOR_BGR2RGB) # 加载目标logo图 logo = cv2.imread("chevy-open-road-logo-300.png") logo = cv2.cvtColor(logo, cv2.COLOR_BGR2RGB) # SIFT关键点和描述子提取 sift = cv2.xfeatures2d.SIFT_create() background_keypoints, background_descriptors = sift.detectAndCompute(background_image, None) logo_keypoints, logo_descriptors = sift.detectAndCompute(logo, None) # 特征匹配 bf = cv2.BFMatcher(cv2.NORM_L1, crossCheck=True) matches = bf.match(background_descriptors,logo_descriptors) matches = sorted(matches, key = lambda x:x.distance) # --------------------------新增判断逻辑开始-------------------------- # 1. 过滤低质量匹配,取最小匹配距离的3倍作为阈值,最小距离避免为0 min_distance = max(matches[0].distance, 10) if matches else 10 good_matches = [m for m in matches if m.distance < 3 * min_distance] # 2. 设置判定阈值,可根据实际测试效果调整 MATCH_THRESHOLD = 15 if len(good_matches) >= MATCH_THRESHOLD: result = "是,背景中存在该logo" else: result = "否,背景中不存在该logo" # --------------------------新增判断逻辑结束-------------------------- # 匹配可视化代码可按需保留 # image_match = cv2.drawMatches(background_image, background_keypoints, logo, logo_keypoints, matches[:45], logo, flags=2) # plt.imshow(image_match), plt.show() # 将结果传入模板,在identify.html中通过{{ result }}即可显示判断结果 return render_template('identify.html', image = image_url, result = result )
说明
- 代码中的
MATCH_THRESHOLD阈值请根据你自己的logo大小、复杂度和测试结果调整,logo越复杂阈值可以设得越高。 - 如果要进一步降低误判,可以在过滤出
good_matches之后,加入cv2.findHomography计算单应性矩阵,判断内点数量是否达标,再输出结果。
内容的提问来源于stack exchange,提问作者CJ All
相关产品推荐
相关产品推荐

