如何用Python识别图片中六边形刻度计分卡并转换为数据集?
用Python实现六边形刻度计分卡识别完全可行
明确说:完全可以用Python实现这个需求,核心依托OpenCV完成图像预处理与形状检测,搭配numpy处理数据,最终能把识别出的分数整理成CSV、JSON等标准数据集格式。
先修复你当前的OpenCV代码问题
你这段代码的报错根源有两个:
cv2.threshold返回值处理错误:该函数会返回两个值——阈值(ret)和二值化后的图像(thresh_img),你直接把返回值赋值给thresh,导致后续传给findContours的不是合法图像对象。cv2.findContours的返回值适配问题:OpenCV 4.x版本仅返回contours和hierarchy两个值,你当前的写法没有正确接收。
修正后的可运行代码示例:
import cv2 # 读取目标图片 img = cv2.imread("your_score_card.jpg") # 转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理:正确接收两个返回值,用INV适配深色刻度场景(可根据实际调整) ret, thresh_img = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) # 查找轮廓:适配OpenCV 4.x版本 contours, hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 验证:打印轮廓数量确认是否正常获取 print(f"检测到轮廓总数:{len(contours)}")
后续实现计分卡识别的核心步骤
解决轮廓问题后,可按以下流程完成分数识别与数据集存储:
- 六边形筛选:遍历所有轮廓,用
cv2.approxPolyDP做多边形逼近,筛选出边数为6的轮廓,同时通过面积、宽高比过滤掉无关干扰轮廓。 - 刻度对应分数:定位六边形内部的刻度标记(填充块、线条等),通过计算刻度的位置、数量或状态,映射为对应分数。
- 数据集存储:将识别出的分数与对应图片文件名等信息,用Python内置的
csv或json模块写入文件,形成结构化数据集。
优化提示
- 若原图有噪声,先通过
cv2.medianBlur或cv2.GaussianBlur去噪,提升轮廓检测精度。 - 二值化阈值可改用
cv2.adaptiveThreshold,适配不同光照条件下的图片。 - 若刻度识别难度高,可结合
cv2.matchTemplate模板匹配,或用简单的KNN模型辅助分类刻度状态。
内容的提问来源于stack exchange,提问作者andy chui
相关产品推荐
相关产品推荐

