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

如何用CV/ML识别重叠图片中的项目里程碑符号?

项目里程碑符号识别与日期匹配解决方案

一、改进传统计算机视觉方法(快速验证、低成本)

1. 形状+颜色联合识别方案

针对同色系不同形状的区分问题,结合轮廓形状特征与颜色特征实现精准识别:

  • 预处理与轮廓提取:先将图像转为灰度图,通过自适应阈值分割(cv2.adaptiveThreshold)提取前景区域,再用cv2.findContours获取所有符号的轮廓,同时保留轮廓的层次信息(处理重叠问题)。
  • 形状特征计算:
    • 用cv2.approxPolyDP将轮廓近似为多边形,通过多边形的边数区分正方形(4边)、三角形(3边)、菱形(4边但角度不同);
    • 计算轮廓的Hu矩(cv2.HuMoments),这是具有旋转、缩放不变性的形状描述符,可区分方向不同的三角形(如左指向/右指向);
    • 计算轮廓的宽高比、面积/周长比,辅助区分相似形状。
  • 颜色特征匹配:对每个轮廓的 bounding box 提取HSV颜色空间的均值(HSV比RGB更适合颜色区分),结合形状特征完成符号类型的判定。
  • 重叠处理:利用cv2.findContours返回的hierarchy参数判断轮廓的嵌套关系,或使用分水岭算法(cv2.watershed)分割重叠区域。

2. 优化模板匹配的实用思路

你的模板匹配无效大概率是因为模板与原图的尺寸、旋转不一致,可通过以下方式优化:

  • 生成多尺度模板库:将原始模板按0.8-1.2的比例缩放,步长0.1,生成不同尺寸的模板;
  • 加入旋转鲁棒性:对模板做0-360度旋转(步长10度),生成旋转模板集合;
  • 匹配后执行非极大值抑制(NMS):过滤重叠的匹配框,保留置信度最高的结果。

二、轻量机器学习方案(平衡效果与标注成本)

1. 基于手工特征的传统分类器

如果不想训练复杂模型,可利用上述提取的形状+颜色特征,训练轻量分类器:

  • 选择SVM或随机森林(sklearn库可快速实现),仅需标注少量样本(每个符号类型标注20-30个即可),从1000张图中挑选典型样本标注,成本极低;
  • 特征组合:将Hu矩、颜色直方图、轮廓边数、宽高比等特征拼接成特征向量,输入分类器完成类型判定。

2. 微调轻量目标检测模型(数据量足够)

1000张图的规模对于轻量目标检测模型(如YOLOv8n、MobileNet-SSD)完全足够,且可同时完成符号的定位与分类:

  • 简化标注:用LabelImg工具仅需框出符号并标注类型(如red_left_triangle、gray_square),无需精细分割;
  • 半监督减少标注量:先标注100-200张图训练初始模型,再用模型自动标注剩余图像,人工修正错误标注即可大幅减少工作量;
  • 训练时可冻结预训练模型的 backbone 层,仅微调头部,训练速度快、资源消耗低。

三、符号与坐标轴日期的匹配逻辑

  1. 利用你已实现的日期识别逻辑,记录每个日期在坐标轴上的x坐标(假设日期位于x轴);
  2. 对每个识别出的符号,计算其 bounding box 的中心点x坐标;
  3. 找到与该x坐标距离最近的日期坐标,完成符号与日期的匹配。

你尝试的模板匹配代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('7053.jpg')
logo = cv2.imread('yellow.png')
height, width, _ = logo.shape

cv2.imshow('logo', logo)
cv2.waitKey(0)
cv2.destroyAllWindows()

methods = [cv2.TM_CCOEFF, cv2.TM_CCOEFF_NORMED, cv2.TM_CCORR, cv2.TM_CCORR_NORMED, cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]
titles = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', 'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']

for i in range(len(methods)):
    curImg = img.copy()
    method = methods[i]
    result = cv2.matchTemplate(img, logo, method)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

    if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc

    bottom_right = (top_left[0] + width, top_left[1] + height)
    cv2.rectangle(curImg, top_left, bottom_right, 255, 10)

    cv2.imshow('img', curImg)
    cv2.waitKey(0)

内容的提问来源于stack exchange,提问作者Florana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:34:55