OpenCV实例(三)答题卡识别

news/2024/5/19 23:27:55/

OpenCV实例(三)答题卡识别

  • 1.答题卡识别概述
  • 2.单道题目的识别
    • 2.1基本流程及原理
    • 2.2代码实例:

作者:Xiou

1.答题卡识别概述

随着信息化的发展,计算机阅卷已经成为一种常规操作。在大型考试中,客观题基本不再需要人工阅卷。

答题卡识别的基本实现原理如图所示,其主要包含以下步骤。
(1)进行反二值化阈值处理,将后续操作中要使用的选项处理为前景(白色),将答题卡上其他不需要进行后续处理的位置处理为背景(黑色)。
(2)将每个选项提取出来,并计算各选项的白色像素点个数。
(3)筛选出白色像素点个数最大的选项,将该选项作为考生作答选项。
(4)将考试作答选项与标准答案进行比较,给出评阅结果。

在这里插入图片描述

2.单道题目的识别

为了方便理解,先讨论单道题目的情况。

2.1基本流程及原理

在这里插入图片描述
下面对具体步骤进行详细介绍。
Step 1:导入库将需要使用的库导入。
Step 2:答案及选项初始化为了方便处理,将各个选项放入一个字典内保存,让不同的选项对应不同的索引。例如,“选项A”对应索引0,“选项B”对应索引1,以此类推。本题目的标准答案为“选项C”。
Step 3:读取原始图像将选项图像读取到系统内。
Step 4:图像预处理图像预处理主要包含色彩空间转换、高斯滤波、阈值变换三个步骤。
Step 5:获取轮廓及排序获取轮廓是图像处理的关键,借助轮廓能够确定每个选项的位置、选项是否被选中等。

Step 6:计算每个选项包含的白色像素点个数本步骤主要完成任务如下。
任务1:提取每一个选项。
任务2:计算每一个选项内的白色像素点个数。

Step 7:识别考生作答选项白色像素点个数最多的选项即考生作答选项。

8)Step 8:输出结果用不同颜色标注考生作答选项正确与否,并打印输出结果。

根据考生作答选项是否与标准答案一致设置要绘制的颜色,
具体如下:
● 考生作答选项与标准答案一致,将考生填涂选项的轮廓设置为绿色。
● 考生作答选项与标准答案不一致,将考生填涂选项的轮廓设置为红色。按照上述规则,在考生作答选项上绘制轮廓,并打印输出文字提示。

2.2代码实例:

# -*- coding: utf-8 -*-
# ==================导入库=======================
import numpy as np
import cv2
# ==================答案及选项初始化=======================
# 将选项放入字典内
ANSWER_KEY = {0: "A", 1: "B", 2: "C", 3: "D"}
# 标准答案
ANSWER = "C"
# ==================读取原始图像=======================
img = cv2.imread('xiaogang.jpg')
cv2.imshow("original",img)
# ==================图像预处理=======================
# 转换为灰度图像
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 高斯滤波
gaussian_bulr = cv2.GaussianBlur(gray, (5, 5), 0)  
# 阈值变换,将所有选项处理为前景(白色)
ret,thresh = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
# cv2.imshow("thresh",thresh)
# cv2.imwrite("thresh.jpg",thresh)
# ==================获取轮廓及排序=======================
# 获取轮廓
cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 将轮廓按照从左到右排列,方便后续处理
boundingBoxes = [cv2.boundingRect(c) for c in cnts]
(cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),key=lambda b: b[1][0], reverse=False))
# ==================构建列表,用来存储每个选项非零值个数及序号===================
options=[]
# 自左向右,遍历每一个选项的轮廓
for (j, c) in enumerate(cnts):# 构造一个与原始图像大小一致的灰度图像,用来保存每一个选项用mask = np.zeros(gray.shape, dtype="uint8")# 获取单个选项# 这里通过循环,将每一个选项单独放入一个mask中cv2.drawContours(mask, [c], -1, 255, -1)# 获取thresh中mask指定部分,每次循环,mask对应ABCD的不同选项cv2.imshow("s1",mask)cv2.imwrite("s1.jpg",mask)cv2.imshow("thresh",thresh)cv2.imwrite("thresh.jpg",thresh)mask = cv2.bitwise_and(thresh, thresh, mask=mask)  cv2.imshow("s2",mask)cv2.imwrite("s2.jpg",mask)# cv2.imshow("mask"+str(j),mask)# cv2.imwrite("mask"+str(j)+".jpg",mask)# 计算每一个选项的非零值(白色像素点)# 涂为答案的选项,非零值较多;没有涂选的选项,非零值较少   total = cv2.countNonZero(mask)#将选项非零值个数、选项序号放入列表options内options.append((total,j))# print(options)  #在循环中打印存储的非零值(白色点个数)及序号
# =================识别考生的选项========================
# 将所有选项按照非零值个数降序排序
options=sorted(options,key=lambda x: x[0],reverse=True)
# 获取包含最多白色像素点的选项索引(序号)
choice_num=options[0][1]
# 根据索引确定选项值:ABCD
choice= ANSWER_KEY.get(choice_num)
print("该生的选项:",choice)
# =================根据选项正确与否,用不同颜色标注考生选项==============
# 设定标注的颜色类型,绿对红错
if choice == ANSWER:color = (0, 255, 0)   #回答正确,用绿色表示msg="回答正确"
else:color = (0, 0, 255)   #回答错误,用红色表示msg="回答错误"
#  在选项位置上标注颜色(绿对红错)
cv2.drawContours(img, cnts[choice_num], -1, color, 2)
cv2.imshow("result",img)
# 打印识别结果
print(msg)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行上述程序,将根据考生作答情况打印出对应提示信息,同时会在答题卡上提示,具体情况如下:
● 当考生作答选项与标准答案一致时,在填涂的答案处绘制绿色边框。
● 当考生作答选项与标准答案不一致时,在填涂的答案处绘制红色边框。

输出结果:

在这里插入图片描述


http://www.ppmy.cn/news/46672.html

相关文章

Trimble RealWorks处理点云数据(七)之点云导入3dmax

效果 背景 有时候我们需要通过点云数据来逆向建模,而建模软件常用的有3dmax,SketchUp等,那如何将点云数据导入3dmax来建模呢,下面我们来了解下 步骤 1、las导入Trimble RealWorks 2、对点云数据预处理 可以参考这篇文章 TrimbleRealWorks点云数据预处理 3、导出rcp格式…

普通人如何使用ChatGPT接单挣钱-第一弹

嘿,我是灵牧,今天这一期给大家带来的是普通人如何使用chatGPT挣钱的第一期 第一弹:通过GPT写一个Tkinter数独案例赚取¥50 事情原委: 今天在接单群里看到一个Tkinter写数独的需求案例,想要加一个独立的弹…

中文英文翻译-英翻中文在线翻译

如果您需要将大量的英文文件或网页翻译成中文,那么我们的批量翻译英文翻译中文的软件将是您最佳的选择。我们的软件是一款高效、准确、节省时间的翻译工具,可以在最短时间内完成大量英文文本的翻译,让您在工作生活中处处流畅地处理英语文本。…

网络之TCP中的快速重传和慢启动

小白: 大牛你好,我是一名即将毕业的大学生,最近正在准备找工作,但是我对TCP中的快速重传和慢启动不是很了解,能否请您帮我解释一下呢? 大牛: 当然可以,TCP中的快速重传和慢启动是TCP拥塞控制算法中非常重要…

2023年全国最新道路运输从业人员精选真题及答案55

百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 39.道路运输车辆维护分为()、一级维护和…

牛客 华为研发工程师编程题

1.汽水瓶 某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。 小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。 数据范围:输入的正整数满足 1≤n≤100 注意…

Spark学习:spark读写postgreSql

读写PostgreSql 一、环境搭建二、写三、读四、ETL一、环境搭建 1、spark安装包,官网地址,我下的是如下版本 2、postgreSql数据库jdbc驱动,官网地址,我下的是如下版本 3、java版本1.8;scala版本2.12.15 4、spark安装包解压到任意目录,把postgreSql的jdbc驱动jar包放在spark的…

数据库系统概论(第五版) 王珊 第四章 课后习题答案

目录 (一)数据库安全性の概念 1. 什么是数据库的安全性 2.数据库安全性和计算机系统的安全性有什么关系? 4.试述实现数据库安全性控制的常用方法和技术 5.什么是数据库中的自主存取控制方法和强制存取控制方法? (二)考试…

Jenkins版本升级(v2.107.1 -_ v2.204.1)

文章目录 背景解决第1步:备份jenkins_home第2步:备份tomcat第3步:修改tomcat端口第4步:修改catalina.sh,设置jenkins_home第5步:下载2.204.1的jenkins包第6步:启动tomcat背景 jenkins版本:2.107.1 应用服务器:Tomcat8.5 重启jenkins后,发现很多插件都加载失败了,导…

手机如何访问电脑文件?(iOS和Android)

可以通过手机访问电脑文件吗? “我需要在我的电脑上查看一个文件,但我现在在外面无法实际访问它。我可以通过手机访问我的电脑文件吗?” 答案当然是可以的,无论您使用的是iOS设备还是Android设备,您都可以通过手机…

数据结构—顺序表

目录 1.顺序表概念 2.顺序表分类: 3.实现动态顺序表 3.1初始化顺序表 SLInit 3.2 检查顺序表容量 SLCheckCapacity 3.3 打印顺序表 SLPrint 3.4尾插 SLPushBack 3.5头插 SLPushFront 3.6尾删 SLPopback 3.7头删 SLPopFront 3.8 顺序表查找 SLFind 3.9 顺…

【springcloud开发教程】负载均衡——Ribbon

Ribbon是什么? Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。简单的说,Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一起。Ribbon 的…

ChatGPT帮我和老板吵架,半分钟做了个思维导图...

大家好,我是小z,也可以叫我阿粥 最近那个疑似成都电科的截图已经传疯了,贴一张图回味下: 这种壮士断腕式的吵法,可以说几乎是单方面的虐杀。但是有朋友问了,在职场中还是有所顾忌,有没有更体面点…

机器视觉检测技术在工业零部件的应用

众所周知,在工业生产中,传统的检测技术需要大量的检测工作者,不仅影响生产效率,而且带来不可靠的因素。 视觉检测技术克服了传统检测技术的缺点,确保了检测的安全性。 可靠性和自动化程度高,已成为当前检测…

jQuery制作一个简单的打地鼠游戏(超详细讲解)

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:老茶icon 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,计…

如何定位Spark数据倾斜问题,解决方案

文章目录 前言一、数据倾斜和数据过量二、 数据倾斜的表现三、定位数据倾斜问题定位思路:查看任务-》查看Stage-》查看代码 四、7种典型的数据倾斜场景解决方案一:聚合元数据解决方案二:过滤导致倾斜的key解决方案三:提高shuffle操…

【技术分享】接口自动化测试中,如何做断言验证?

在服务端自动化测试过程中,发起请求之后还需要对响应值进行验证。验证响应信息符合预期值之后,这一条接口自动化测试用例才算完整的通过。所以这一章节,将会讲解在接口自动化测试中,如何对服务端返回的响应内容做断言验证。 实战…

JavaScript学习笔记(二)

文章目录 第4章:变量、作用域与内存1. 原始值与引用值2. 执行上下文与作用域3. 垃圾回收 第5章:基本引用类型1. Date:参考了Java早期版本中的java.util.Date2. RegExp3. 原始值包装类型 第6章:集合引用类型1. Object2. Array&…

第07章_面向对象编程(进阶)

第07章_面向对象编程(进阶) 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 关键字:this 1.1 this是什么? 在Java中,this关键字不算难理解…

【Webpack】前端工程化与webpack

文章目录 前端工程化1、小白眼中的前端开发 vs 实际的前端开发2、什么是前端工程化3、前端工程化的解决方案 Webpack的基本使用1、什么是 webpack2、创建列表隔行变色项目3、在项目中安装webpack4、在项目中配置webpack Webpack中的插件1、webpack插件的作用2、webpack-dev -se…