2026/8/30 16:10:03

ddddocr + opencv拖动滑动拼图总偏几个像素

ddddocr + opencv拖动滑动拼图总偏几个像素 ddddocr cv总是“偏一点”通常不是识别错而是坐标定义、透明边距或缩放比例导致的系统性偏差。目前ddddocr.slide_match()返回的是匹配框target[x1,y1,x2,y2]而不同版本/封装里target_x的含义可能并不完全适合直接拿来当拖动距离官方示例也建议直接看target框。透明滑块默认走边缘匹配非透明滑块才更适合simple_targetTrue。如果是你自己的验证码/测试环境我建议先这样改res slide.slide_match(target_bytes, bg_bytes)x1, y1, x2, y2 res[target]print(匹配框:, x1, y1, x2, y2)# 不要直接假设 target_x 就等于最终位移match_x x1然后重点检查滑块 PNG 左边有没有透明空白。比如滑块实际轮廓从第 7px 才开始那么 ddddocr 匹配的是轮廓但你的拖动起点可能按整个 PNG 左边缘计算就会稳定差 510px。可以先把透明边距算出来import cv2import numpy as npimg cv2.imdecode(np.frombuffer(target_bytes, np.uint8),cv2.IMREAD_UNCHANGED)if img.shape[2] 4:alpha img[:, :, 3]ys, xs np.where(alpha 20)left_padding xs.min()right_padding img.shape[1] - 1 - xs.max()print(left padding:, left_padding)print(right padding:, right_padding)如果你发现ddddocr x 168实际正确位置 174left_padding 6那基本就对上了correct_x x1 left_padding另一个很常见的问题是页面显示尺寸和原图尺寸不一致。例如后台图片原始宽度是 600网页实际显示只有 300pxscale displayed_width / image_widthdrag_x correct_x * scale比如image_width 600displayed_width 300drag_x correct_x * 300 / 600会直接差一倍。如果只是固定差 3~8 px则更像透明边缘/阴影如果偏差随目标位置越来越大例如左边差 2px、右边差 15px那基本就是缩放比例问题。OpenCV 也可以做二次定位避免 ddddocr 的 Canny 边缘落在阴影外沿target cv2.imdecode(np.frombuffer(target_bytes, np.uint8),cv2.IMREAD_GRAYSCALE)bg cv2.imdecode(np.frombuffer(bg_bytes, np.uint8),cv2.IMREAD_GRAYSCALE)target_edge cv2.Canny(target, 80, 160)bg_edge cv2.Canny(bg, 80, 160)result cv2.matchTemplate(bg_edge,target_edge,cv2.TM_CCOEFF_NORMED)_, score, _, loc cv2.minMaxLoc(result)cv_x loc[0]print(ddddocr:, x1)print(opencv:, cv_x)print(score:, score)ddddocr 当前实现本身也是灰度/边缘检测后做滑块匹配所以这种偏移很可能来自轮廓取法而不是 OCR 模型。你可以先判断一个规律偏差现象 最可能原因每次固定偏 5px 左右 滑块透明边距/阴影位置越靠右偏得越多 图片 CSS 缩放有时左偏、有时右偏 Canny 边缘匹配不稳定固定差半个滑块宽度 用了中心坐标而不是左边界Retina/手机页面约差 2 倍 DPR / canvas 尺寸问题