# 基于 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 = Nonecnts = 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 = approxbreakwarped_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 = 0for (q, i) in enumerate(np.arange(0, len(questionCnts), 5)):cnts = sort_contours(questionCnts[i:i + 5])[0]bubbled = Nonefor (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 += 1cv2.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://www.mzph.cn/web/73996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python黑科技:无痛修改第三方库源码

需求不符合 很多时候&#xff0c;我们下载的 第三方库 是不会有需求不满足的情况&#xff0c;但也有极少的情况&#xff0c;第三方库 没有兼顾到需求&#xff0c;导致开发者无法实现相关功能。 如何通过一些操作将 第三方库 源码进行修改&#xff0c;是我们将要遇到的一个难点…

第十三章:优化内存管理_《C++性能优化指南》_notes

优化内存管理 一、内存管理基础概念二、自定义分配器三、智能指针优化重点知识代码示例&#xff1a;智能指针性能对比 四、性能优化关键点总结多选题设计题答案与详解多选题答案设计题示例答案&#xff08;第1题&#xff09; 一、内存管理基础概念 重点知识 动态内存分配开销…

python笔记之函数

函数初探 python在要写出函数很简单&#xff0c;通过关键字def即可写出&#xff0c;简单示例如下 def add(a, b):return ab 以上即可以定义出一个简单的函数&#xff1a;接收两个变量a和b&#xff0c;返回a和b相加的结果&#xff0c;当然这么说也不全对&#xff0c;原因就是…

【服务器操作指南 - GPU 使用与文件传输】轻松掌握 GPU 状态查看和服务器文件传输技巧

0. 引言 在使用服务器时&#xff0c;高效管理 GPU 和文件传输是两项不可或缺的技能。 本指南旨在帮助您快速掌握服务器环境下的 GPU 使用状态监测方法&#xff0c;并简要介绍如何在服务器之间进行文件传输操作。 1. 查看服务器上的 gpu 使用状态 1.1 安装 gpustat 这条指令…

0330-YYYY-MM-DD格式日期比较大小

最简单的&#xff08;python&#xff09; from datetime import datetime def compare_time(time1,time2): time1_t datetime.strptime(time1,“%Y-%m-%d”) time2_t datetime.strptime(time2,“%Y-%m-%d”) if time1_t < time2_t: return time1_t elif time1_t > ti…

QFlightInstruments飞行仪表控件库

QFlightInstruments 是一个开源的飞行仪表控件库&#xff0c;专为基于 Qt 的应用程序设计。它提供了一系列仿真实飞机仪表的组件&#xff0c;适用于飞行模拟软件、航空电子系统或任何需要高仿真飞行仪表显示的项目。 主要功能 高仿真飞行仪表&#xff1a;包括空速表、高度表、…

VSCode 市场发现恶意扩展正在传播勒索软件!

在VSCode 市场中发现了两个隐藏着勒索软件的恶意扩展。其中一个于去年 10 月出现在微软商店&#xff0c;但很长时间没有引起注意。 这些是扩展ahban.shiba 和 ahban.cychelloworld&#xff0c;目前已从商店中删除。 此外&#xff0c;ahban.cychelloworld 扩展于 2024 年 10 月…

国信华源携AI+水利创新成果亮相第十五届防汛抗旱信息化技术交流会

直击展会现场 近日&#xff0c;以“人工智能赋能防汛抗旱 融合创新共御极端灾害”为主题的第十五届防汛抗旱信息化技术交流会在河南郑州召开。作为水旱灾害防御领域的专精企业&#xff0c;北京国信华源科技有限公司携自主研发的入户叫应预警系统及覆盖防汛抗旱全链条的智慧化场…

MATLAB语言的链表反转

MATLAB语言的链表反转 链表是一种常见的数据结构&#xff0c;与数组相比&#xff0c;链表在插入和删除操作方面具有更高的灵活性。然而&#xff0c;链表的一些操作&#xff0c;比如反转链表&#xff0c;对一些初学者来说可能是一个挑战。本篇文章将重点讨论如何使用MATLAB语言…

Oracle数据库数据编程SQL<2.2 DDL 视图、序列>

目录 一、Oracle 视图(Views) &#xff08;一&#xff09; Oracle 视图特点 &#xff08;二&#xff09;Oracle 视图创建语法 关键参数&#xff1a; &#xff08;三&#xff09;Oracle 视图类型 1、普通视图 2、连接视图&#xff08;可更新&#xff09; 3、对象视图 4…

QtAdvancedStylesheets使用

QtAdvancedStylesheets 是一个基于 Qt Widgets 的样式表(QSS)增强库,允许开发者通过类似 CSS 的方式深度定制 Qt 应用程序的界面风格,支持动态主题切换、动画效果和复杂控件样式设计。 1. 核心功能 高级样式表支持 使用 CSS-like 语法美化 Qt Widgets(如 QPushButton、Q…

QtAV入门

QtAV 是一个基于 FFmpeg 和 Qt 的高性能多媒体播放框架,提供强大的音视频解码、渲染和处理能力,适合开发跨平台的播放器、视频编辑和流媒体应用。 1. 核心功能 多格式支持 支持 H.264/H.265、VP9、AV1 等视频编码。 支持 MP3、AAC、Opus 等音频编码。 封装格式:MP4、MKV、…

[ C++ ] | C++11 从左值引用到右值引用

&#xff08;目录占位&#xff09; 1. 前言&#xff1a; C 11 是在 C 98 之后又一个变化比较大的标准。为C增加了很多东西&#xff0c;其中有一部分是有用的&#xff0c;有一部分是我自认为作用不是很大东西。这一章呢&#xff1f;我们就来说说C11我&#xff0c;我认为对性能…

基于MCU实现的电机转速精确控制方案:软件设计与实现

本文将详细介绍一篇基于微控制器&#xff08;MCU&#xff09;的电机转速精确控制的软件方案。通过采样PWM信号控制和ADC采样技术&#xff0c;结合PID闭环控制算法&#xff0c;实现了电机转速的高效、稳定调节。以下是软件方案流程图&#xff0c;下文将对其进行展开讲解。 原图太…

Jmeter触发脚本备份

JMeter 在以下情况会触发脚本备份&#xff1a; 手动保存测试计划时&#xff1a;如果测试计划有未保存的修改&#xff0c;当用户手动保存测试计划&#xff08;脚本&#xff09;时&#xff0c;JMeter 都会自动将当前脚本备份到${JMETER_HOME}/backups文件夹下。 关闭 JMeter 时…

AI人工智能-PyCharm的介绍安装应用

下载与安装 创建python项目 项目路径&#xff1a;C:\Users\miloq\Desktop\python_project 配置环境 提前找到conda配置的python-base路径 配置conda环境 运行项目 运行结果

Flink内存模型--flink1.19.1

Flink 的 JobManager 和 TaskManager 在内存分配上有不同的职责和结构。以下是两者的内存分类及详细说明&#xff1a; 一、JobManager 内存分类 JobManager 主要负责作业调度、协调&#xff08;如 Checkpoint 协调&#xff09;、资源管理等&#xff0c;其内存需求相对较低&…

华为数字化转型-方法篇

1 方法篇-3-愿景驱动的数字化转型规划 1.2 业务战略是数字化转型的龙头 1.3 数字时代&#xff0c;企业需要适时地调整业务战略 1.3.1 引入数字化商业模式 引入数字化商业模式包括改变与客户做生意的方式&#xff0c;改变销售的渠道&#xff0c;基于产业互联网重新定位与行 业…

常用的排序算法------练习4

1. 题目 2. 思路和题解 这道题是很经典的荷兰国旗问题&#xff0c;根据题目意思&#xff0c;要对这个数组按照颜色排序&#xff0c;而此时现在的红、白、蓝三个颜色分别对应0&#xff0c;1&#xff0c;2&#xff0c;因此可以想到使用冒泡排序对该数组进行排序。 代码如下&…

传统神经网络、CNN与RNN

在网络上找了很多关于深度学习的资料&#xff0c;也总结了一点小心得&#xff0c;于是就有了下面这篇文章。这里内容较为简单&#xff0c;适合初学者查看&#xff0c;所以大佬看到这里就可以走了。 话不多说&#xff0c;上图 #mermaid-svg-Z3k5YhiQ2o5AnvZE {font-family:&quo…