引言
在教育考试场景中,手动批改答题卡效率低下且容易出错。本文将介绍如何使用Python和OpenCV实现一个答题卡自动识别与评分系统,通过计算机视觉技术完成答题卡的透视校正、选项识别和得分计算。该系统可广泛应用于学校考试、培训测评等场景,大幅提升批改效率。
环境准备
- Python 3.7+
- OpenCV(
pip install opencv-python) - NumPy(
pip install numpy)
核心功能模块解析
整个系统分为以下核心步骤:
图像预处理 → 轮廓检测 → 透视变换 → 选项定位 → 答案匹配 → 结果输出
1. 导入依赖库
import numpy as np
import cv2
numpy:用于数值计算和数组操作。cv2:OpenCV库,提供图像处理和计算机视觉算法。
2. 辅助函数定义
2.1 坐标点排序函数 order_points
答题卡的四个角点需要按左上→右上→右下→左下的顺序排列,否则透视变换会出错。
该函数通过计算坐标的和与差实现排序:
def order_points(pts):
rect = np.zeros((4, 2), dtype="float32")
s = pts.sum(axis=1) # 计算(x+y),左上角点(x+y)最小,右下角点最大
rect[0] = pts[np.argmin(s)] # 左上
rect[2] = pts[np.argmax(s)] # 右下
diff = np.diff(pts, axis=1) # 计算(y-x),右上角点(y-x)最小(接近0),左下角点最大
rect[1] = pts[np.argmin(diff)] # 右上
rect[3] = pts[np.argmax(diff)] # 左下
return rect
2.2 透视变换函数 four_point_transform
通过透视变换将倾斜的答题卡校正为正视图。
关键步骤:
- 计算变换前的四个角点(
rect)。 - 确定变换后的目标尺寸(
maxWidth和maxHeight)。 - 生成透视变换矩阵(
M)并应用变换。
def four_point_transform(image, pts):
rect = order_points(pts)
(tl, tr, br, bl) = rect # 解包四个角点
# 计算变换后的宽度和高度(取两组对边的最大值)
widthA = np.sqrt(((br[0]-bl[0])**2) + ((br[1]-bl[1])**2))
widthB = np.sqrt(((tr[0]-tl[0])**2) + ((tr[1]-tl[1])**2))
maxWidth = max(

最低0.47元/天 解锁文章
2784

被折叠的 条评论
为什么被折叠?



