# AnswerSheetScanner **Repository Path**: kellyworld0/answer-sheet-scanner ## Basic Information - **Project Name**: AnswerSheetScanner - **Description**: 这是一个基于 OpenCV 的答题卡自动识别与阅卷系统。用户只需拍摄一张答题卡照片,程序便会自动通过边缘检测定位答题卡区域,利用透视变换将倾斜变形的图像矫正为规整视图,然后通过轮廓分析筛选出所有圆形选项,并利用掩膜技术统计每个选项的填涂像素数量,从而判断学生的作答结果,最后与标准答案比对并自动计算得分,同时在答题卡上标注出对错情况。整个流程无需人工干预,可快速、准确地完成答题卡的批阅工作。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-16 - **Last Updated**: 2026-04-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AnswerSheetScanner 📝 ## 📖 项目简介 AnswerSheetScanner 是一个使用计算机视觉技术自动识别答题卡并判卷的 Python 工具。只需拍摄一张答题卡照片,系统就能自动完成答题卡定位、透视矫正、答案识别和评分全流程。 **核心流程**:矩形定位 → 透视矫正 → 圆形检测 → 答案比对 → 自动评分 ## ✨ 功能特点 - 🎯 **自动定位** - 智能检测答题卡边框,从复杂背景中准确定位 - 🔧 **透视矫正** - 自动将倾斜、变形的答题卡矫正为规整矩形 - 👁️ **答案识别** - 精准识别每道题的填涂选项 - 📊 **自动判卷** - 对比标准答案,计算得分并标注错误题目 - 🎨 **可视化输出** - 在答题卡上标注正确(绿色)/错误(红色)答案 ## 🛠️ 技术栈 | 技术 | 用途 | | ---------- | -------------------- | | Python 3.x | 主要开发语言 | | OpenCV 4.x | 图像处理与计算机视觉 | | NumPy | 数值计算与数组操作 | | imutils | 图像处理辅助工具 | ## 📁 项目结构 AnswerSheetScanner/ ├── get_answer.py # 主程序 ├── images/ # 答题卡图片存放目录 │ └── test_01.png # 测试图片示例 └── README.md # 项目说明 ## 🚀 快速开始 ### 环境安装 # 安装依赖包 pip install opencv-python numpy imutils ### 运行方式 bash ``` # 基本用法 python get_answer.py --image images/test_01.png # 简写形式 python get_answer.py -i images/test_01.png ``` ### 自定义正确答案 在代码中修改 `ANSWER_KEY` 字典: ```python # 格式:{题号: 答案选项} # 选项对应:0=A, 1=B, 2=C, 3=D, 4=E ANSWER_KEY = {0: 1, 1: 4, 2: 0, 3: 3, 4: 1} ``` ## 📝 实现原理 ### 1. 图像预处理 - 灰度化:将彩色图像转为灰度图 - 高斯滤波:去除图像噪声 - Canny边缘检测:提取图像边缘信息 ### 2. 答题卡定位 - 轮廓检测:找出所有图像轮廓 - 多边形近似:筛选出4个顶点的矩形区域 - 透视变换:将倾斜的答题卡矫正为正向视图 ### 3. 答案识别 - 二值化:使用OTSU算法将图像转为黑白 - 轮廓筛选:找出所有圆形选项(宽高比≈1:1) - 掩膜技术:逐個统计每个选项的填涂像素数量 ### 4. 自动评分 - 识别每道题被填涂的选项 - 对比预设的标准答案 - 计算得分并在答题卡上标注 ## 📊 处理流程图 text ``` 输入图片 ↓ 灰度化 + 高斯滤波 ↓ Canny边缘检测 ↓ 查找答题卡矩形轮廓 ↓ 透视变换(矫正歪斜) ↓ OTSU二值化 ↓ 筛选圆形选项 ↓ 掩膜统计填涂结果 ↓ 对比标准答案 ↓ 输出分数 + 可视化标注 ``` ## ⚙️ 参数调优 如果遇到识别问题,可调整以下参数: ### Canny边缘检测阈值 ```python # 第58行附近 edged = cv2.Canny(blurred, 75, 200) # 降低阈值:检测更多边缘(适合对比度低的图片) # 提高阈值:检测更少边缘(适合噪声多的图片) ``` ### 选项圆圈筛选条件 ```python # 第89行附近 if w >= 20 and h >= 20 and ar >= 0.9 and ar <= 1.1: # 调整最小尺寸:根据实际答题卡选项大小 # 调整宽高比:0.8~1.2 可检测椭圆(透视矫正不完美时) ``` ### 透视变换精度 ```python # 第70行附近 approx = cv2.approxPolyDP(c, 0.02 * peri, True) # 增大0.02:更易检测到4边形(适合边缘不清晰的图片) # 减小0.02:更精确(适合扫描的高清图片) ``` ## 📌 注意事项 - ✅ 确保答题卡拍摄时光线充足、对比度清晰 - ✅ 答题卡边框需要完整出现在画面中 - ✅ 建议使用扫描仪或手机垂直拍摄以获得最佳效果 - ⚠️ 拍摄角度不宜过大,否则可能影响识别准确率 - ⚠️ 确保答题卡上的选项圆圈没有被污渍遮挡 ## 🐛 常见问题 ### Q: 提示 `error: (-215:Assertion failed) npoints > 0` **A**: 未检测到轮廓,请检查: - 图片路径是否正确 - 答题卡边框是否清晰可见 - 调整Canny阈值参数 ### Q: 识别出的选项数量不对 **A**: 调整选项筛选条件: - 修改 `w >= 20 and h >= 20` 的最小尺寸 - 调整 `ar >= 0.9 and ar <= 1.1` 的宽高比范围 ### Q: 透视矫正后图像是歪的 **A**: 确保答题卡边框是完整的矩形,调整多边形近似的精度参数 ## 🔮 改进方向 - 支持多页答题卡批量处理 - 添加GUI图形界面 - 支持答题卡模板自定义 - 增加答题卡二维码/考号识别 - 支持手写数字识别 - 导出评分报表(Excel/PDF)