Python图像角点检测优化:仅识别指定贴纸角点以提速
解决方案
核心思路
只检测4个红色叉号标记的角点,通过计算网格间距批量推导所有贴纸坐标,彻底替代原代码26-28行的重复检测逻辑,大幅提升处理速度。
具体实现步骤
1. 快速定位4个红色叉号角点
利用颜色过滤+轮廓检测,精准提取红叉并按坐标排序,拿到前4个目标点后立即停止检测:
import cv2 import numpy as np # 读取图像 img = cv2.imread("sticker_sheet.jpg") hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 提取红色区域(HSV双区间覆盖红色色域) lower_red1 = np.array([0, 120, 70]) upper_red1 = np.array([10, 255, 255]) lower_red2 = np.array([170, 120, 70]) upper_red2 = np.array([180, 255, 255]) red_mask = cv2.bitwise_or( cv2.inRange(hsv_img, lower_red1, upper_red1), cv2.inRange(hsv_img, lower_red2, upper_red2) ) # 去除噪点,优化轮廓检测效果 kernel = np.ones((3, 3), np.uint8) red_mask = cv2.morphologyEx(red_mask, cv2.MORPH_OPEN, kernel) # 检测红叉轮廓并筛选有效目标 contours, _ = cv2.findContours(red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) target_corners = [] for cnt in contours: area = cv2.contourArea(cnt) # 按红叉实际大小调整面积阈值,过滤噪点和干扰 if 50 < area < 500: x, y, w, h = cv2.boundingRect(cnt) # 取轮廓中心作为角点坐标 target_corners.append((x + w//2, y + h//2)) # 按「从上到下,从左到右」排序,确保前4个是指定的标记点 target_corners.sort(key=lambda p: (p[1], p[0])) # 仅保留前4个目标角点 selected_corners = target_corners[:4]
2. 推导所有贴纸坐标
假设贴纸为规则网格排列(50张通常是5列×10行或10列×5行),通过4个标记点计算横向/纵向间距,批量生成所有贴纸的定位坐标:
# 假设前2个点是第一行左右角点,后2个是第二行左右角点 # 计算横向间距dx,纵向间距dy dx = selected_corners[1][0] - selected_corners[0][0] dy = selected_corners[2][1] - selected_corners[0][1] # 根据实际贴纸数量设置行列数(示例为5列×10行=50张) cols = 5 rows = 10 # 批量生成所有贴纸的左上角坐标(可根据你的裁剪逻辑调整为其他角点) all_sticker_pos = [] for row in range(rows): for col in range(cols): x = selected_corners[0][0] + col * dx y = selected_corners[0][1] + row * dy all_sticker_pos.append((x, y))
3. 替换原检测逻辑
直接使用all_sticker_pos中的坐标进行贴纸裁剪和OCR,完全跳过原代码26-28行的重复角点检测步骤。
关键注意事项
- HSV颜色范围调整:如果红叉提取不准确,用cv2调试工具(如
cv2.createTrackbar)微调红色的HSV阈值。 - 轮廓筛选优化:根据红叉的实际大小调整面积阈值,避免误检噪点或遗漏目标。
- 网格验证:生成坐标后,可通过
cv2.circle在原图上标记所有推导的点,确认是否与实际贴纸位置对齐。 - 坐标适配:如果你的裁剪逻辑需要贴纸的四个角点而非单点,可基于推导的左上角坐标+贴纸尺寸(从标记点间距或原贴纸尺寸获取)生成完整裁剪框。
内容的提问来源于stack exchange,提问作者user20384021
相关产品推荐
相关产品推荐

