当前位置: 首页 > news >正文

# 基于 OpenCV 的选择题自动批改系统实现

在教育领域,选择题的批改工作通常较为繁琐且重复性高。为了提高批改效率,我们可以利用计算机视觉技术,通过 OpenCV 实现选择题的自动批改。本文将详细介绍如何使用 Python 和 OpenCV 实现一个简单的选择题自动批改系统。

1. 项目背景

选择题的批改通常是通过人工检查答题卡上的涂黑点来完成的。这种方式不仅耗时,还容易出错。如果能够通过计算机自动识别答题卡上的涂黑点,并与标准答案进行比对,就可以大大提高批改效率。OpenCV 是一个强大的计算机视觉库,提供了丰富的图像处理功能,非常适合用于实现这种自动批改系统。

2. 系统实现步骤

2.1 图像预处理

首先,我们需要读取答题卡的图像,并对其进行预处理,以便后续的轮廓检测和透视变换。预处理步骤包括灰度化、高斯模糊和边缘检测。

image = cv2.imread(r'./images/test_01.png')
contours_img = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
cv_show('blurred', blurred)
edged = cv2.Canny(blurred, 75, 200)
cv_show('edged', edged)
  • 灰度化:将彩色图像转换为灰度图像,减少数据量,便于后续处理。
  • 高斯模糊:去除图像中的噪声,使图像更加平滑,有助于边缘检测。
  • 边缘检测:使用 Canny 算法检测图像中的边缘,为轮廓检测做准备。

2.2 轮廓检测与透视变换

接下来,我们需要检测答题卡的轮廓,并对其进行透视变换,以便将答题卡的图像转换为一个规则的矩形图像。这一步是实现自动批改的关键。

cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
cv2.drawContours(contours_img, cnts, -1, (0, 0, 255), 3)
cv_show('contours_img', contours_img)
docCnt = None

cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
    if len(approx) == 4:
        docCnt = approx
        break

warped_t = four_point_transform(image, docCnt.reshape(4,2))
warped_new = warped_t.copy()
cv_show('warped', warped_t)
  • 轮廓检测:使用 cv2.findContours 函数检测图像中的轮廓,并按轮廓面积从大到小排序。
  • 透视变换:通过 four_point_transform 函数对答题卡的轮廓进行透视变换,将其转换为规则的矩形图像。

2.3 阈值处理与圆圈轮廓检测

为了识别答题卡上的涂黑点,我们需要对透视变换后的图像进行阈值处理,并检测圆圈轮廓。

warped = cv2.cvtColor(warped_t, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(warped, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cv_show('thresh', thresh)
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
warped_Contours = cv2.drawContours(warped_t, cnts, -1, (0, 255, 0), 1)
cv_show('warped_Contours', warped_Contours)
  • 阈值处理:使用 Otsu 方法自动计算阈值,并将图像转换为二值图像。
  • 圆圈轮廓检测:检测二值图像中的轮廓,并筛选出符合圆圈特征的轮廓。

2.4 答案识别与评分

最后,我们需要识别每个选项的涂黑情况,并与标准答案进行比对,计算得分。

questionCnts = []
for c in cnts:
    (x, y, w, h) = cv2.boundingRect(c)
    ar = w / float(h)
    if w >= 20 and h >= 20 and 0.9 <= ar <= 1.1:
        questionCnts.append(c)

questionCnts = sort_contours(questionCnts, method="top-to-bottom")[0]
correct = 0

for (q, i) in enumerate(np.arange(0, len(questionCnts), 5)):
    cnts = sort_contours(questionCnts[i:i + 5])[0]
    bubbled = None
    for (j, c) in enumerate(cnts):
        mask = np.zeros(thresh.shape, dtype="uint8")
        cv2.drawContours(mask, [c], -1, 255, -1)
        cv_show('mask', mask)
        thresh_mask_and = cv2.bitwise_and(thresh, thresh, mask=mask)
        cv_show('thresh_mask_and', thresh_mask_and)
        total = cv2.countNonZero(thresh_mask_and)
        if bubbled is None or total > bubbled[0]:
            bubbled = (total, j)

    color = (0, 0, 255)
    k = ANSWER_KEY[q]
    if k == bubbled[1]:
        color = (0, 255, 0)
        correct += 1

    cv2.drawContours(warped_new, [cnts[k]], -1, color, 3)
    cv_show('warpeding', warped_new)

score = (correct / 5.0) * 100
print("[INFO score: {:.2f}%".format(score))
cv2.putText(warped_new, "{:.2f}%".format(score), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
cv2.imshow("Original", image)
cv2.imshow("Exam", warped_new)
cv2.waitKey(0)
  • 答案识别:通过掩膜操作和非零点计数,识别每个选项的涂黑情况。
  • 评分:将识别出的答案与标准答案进行比对,计算得分,并在图像上标注正确和错误的选项。

3. 实验结果

通过上述步骤,我们成功实现了选择题的自动批改。实验结果表明,该系统能够准确识别答题卡上的涂黑点,并与标准答案进行比对,计算出得分。以下是实验结果的示例:

  • 原始图像:显示答题卡的原始图像。
  • 透视变换后的图像:显示经过透视变换后的答题卡图像。
  • 阈值处理后的图像:显示经过阈值处理后的二值图像。
  • 最终结果:显示批改后的答题卡图像,正确选项用绿色标记,错误选项用红色标记,并显示得分。

运行结果
在这里插入图片描述

4. 总结与展望

本文介绍了一个基于 OpenCV 的选择题自动批改系统。通过图像预处理、轮廓检测、透视变换、阈值处理和答案识别等步骤,实现了对答题卡的自动批改。该系统能够大大提高批改效率,减少人工操作的繁琐性。

然而,该系统仍有一些可以改进的地方。例如,目前系统只能处理单选题,对于多选题的识别和批改还需要进一步优化。此外,系统的鲁棒性还可以进一步提高,以应对不同光照条件和答题卡质量的情况。

未来,我们可以探索更多计算机视觉技术在教育领域的应用,例如自动识别手写文字、自动批改简答题等,为教育信息化做出更大的贡献。


文章转载自:
http://animalization.hfytgp.cn
http://apery.hfytgp.cn
http://apart.hfytgp.cn
http://beehive.hfytgp.cn
http://barrelhead.hfytgp.cn
http://cate.hfytgp.cn
http://ancestry.hfytgp.cn
http://abaxial.hfytgp.cn
http://bearberry.hfytgp.cn
http://antitheses.hfytgp.cn
http://agglutinin.hfytgp.cn
http://busby.hfytgp.cn
http://blameful.hfytgp.cn
http://algetic.hfytgp.cn
http://bedpost.hfytgp.cn
http://agromania.hfytgp.cn
http://avengement.hfytgp.cn
http://bogle.hfytgp.cn
http://belsen.hfytgp.cn
http://birefringence.hfytgp.cn
http://cabotine.hfytgp.cn
http://campanology.hfytgp.cn
http://anagenesis.hfytgp.cn
http://capstan.hfytgp.cn
http://chisel.hfytgp.cn
http://charlene.hfytgp.cn
http://antitheses.hfytgp.cn
http://area.hfytgp.cn
http://chairwoman.hfytgp.cn
http://beaker.hfytgp.cn
http://www.dtcms.com/a/101370.html

相关文章:

  • 预测地震的方法,如何使用AI和量子传感器发挥作用?
  • 基于PySide6与CATIA API的装配体位置管理工具开发实践
  • 使用Python爬虫获取淘宝App商品详情
  • HTML5贪吃蛇游戏开发经验分享
  • 在DE2-115板子上用 Verilog编程实现一个 分秒计数器,并具备按键暂停、按键消抖功能
  • 拼多多 anti-token unidbg 分析
  • androidstudio安装完成后创建新的示例项目编译报错解决
  • VRRP交换机三层架构综合实验
  • Java 图书管理系统
  • 预览器的使用-查看多端设备预览效果
  • 人形机器人遥操作方式和作用
  • NAS这个名称的由来和翻译
  • 华为昇腾910B编程实战:大模型推理性能优化全攻略
  • python中的面向对象
  • 数据库系统概论|第二章:关系数据库—课程笔记3
  • Java 小白到高手:AI 工具缩短 60% 学习周期的路径
  • 机器视觉框架源码——解读2(常用的布局控件和属性)
  • Jar包和War包的区别
  • 【SpringBoot】深入解析使用配置文件解决硬编码问题综合练习(三):解析验证码拓展问题
  • Python Cookbook-4.16 用字典分派方法和函数
  • 广州SMT贴片加工厂精密制造工艺解析
  • Nyquist插件基础:LISP语法-变量及赋值
  • 小型诊疗预约平台(代码+数据库+LW)
  • 使用Golang解决动作冒险游戏帧同步问题
  • 《八大排序算法》
  • 谷歌将 Android OS 完全转变为 “内部开发”
  • java学习
  • Android设计模式之代理模式
  • MacOS安装NVM 切换node版本
  • CP15 协处理器