You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:15:05