前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用Python开发智能阅卷系统(附源代码)

利用Python开发智能阅卷系统(附源代码)

作者头像
程序员小猿
发布于 2021-01-19 03:05:19
发布于 2021-01-19 03:05:19
1.1K00
代码可运行
举报
文章被收录于专栏:程序IT圈程序IT圈
运行总次数:0
代码可运行

随着现代图像处理人工智能技术的快速发展,不少学者尝试讲CV应用到教学领域,能够代替老师去阅卷,将老师从繁杂劳累的阅卷中解放出来,从而进一步有效的推动教学质量上一个台阶。

传统的人工阅卷,工作繁琐,效率低下,进度难以控制且容易出现试卷遗漏未改、登分失误等现象。

现代的“机器阅卷”,工作便捷、效率高、易操作,只需要一个相机(手机),拍照即可获取成绩,可以导入Excel表格便于存档管理。

下面我们从代码实现的角度来解释一下我们这个简易答题卡识别系统的工作原理。 第一步,导入工具包及一系列的预处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import argparse
import imutils
import cv2
# 设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", default="test_01.png")
args = vars(ap.parse_args())
# 正确答案
ANSWER_KEY = {0: 1, 1: 4, 2: 0, 3: 3, 4: 1} #
def order_points(pts):
   # 一共4个坐标点
   rect = np.zeros((4, 2), dtype = "float32")

   # 按顺序找到对应坐标0,1,2,3分别是 左上,右上,右下,左下
   # 计算左上,右下
   s = pts.sum(axis = 1)
   rect[0] = pts[np.argmin(s)]
   rect[2] = pts[np.argmax(s)]
   # 计算右上和左下
   diff = np.diff(pts, axis = 1)
   rect[1] = pts[np.argmin(diff)]
   rect[3] = pts[np.argmax(diff)]
   return rect

def four_point_transform(image, pts):
   # 获取输入坐标点
   rect = order_points(pts)
   (tl, tr, br, bl) = rect
   # 计算输入的w和h值
   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(int(widthA), int(widthB))
   heightA = np.sqrt(((tr[0]-br[0])**2)+((tr[1]-br[1])**2))
   heightB = np.sqrt(((tl[0]-bl[0])**2)+((tl[1]-bl[1])**2))
   maxHeight = max(int(heightA), int(heightB))
   # 变换后对应坐标位置
   dst = np.array([
      [0, 0],
      [maxWidth - 1, 0],
      [maxWidth - 1, maxHeight - 1],
      [0, maxHeight - 1]], dtype = "float32")
   # 计算变换矩阵
   M = cv2.getPerspectiveTransform(rect, dst)
   warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
   return warped # 返回变换后结果

def sort_contours(cnts, method="left-to-right"):
    reverse = False
    i = 0
    if method == "right-to-left" or method == "bottom-to-top":
        reverse = True
    if method == "top-to-bottom" or method == "bottom-to-top":
        i = 1
    boundingBoxes = [cv2.boundingRect(c) for c in cnts]
    (cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),
                                        key=lambda b: b[1][i], reverse=reverse))
    return cnts, boundingBoxes
def cv_show(name,img):
        cv2.imshow(name, img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

image = cv2.imread(args["image"])
contours_img = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(blurred, 75, 200)
# 轮廓检测
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
   cv2.CHAIN_APPROX_SIMPLE)[1]
cv2.drawContours(contours_img,cnts,-1,(0,0,255),3)
docCnt = None

# 确保检测到了
if len(cnts) > 0:
   # 根据轮廓大小进行排序
   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 = four_point_transform(gray, docCnt.reshape(4, 2))

thresh = cv2.threshold(warped, 0, 255,
   cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
thresh_Contours = thresh.copy()
# 找到每一个圆圈轮廓
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
   cv2.CHAIN_APPROX_SIMPLE)[1]
cv2.drawContours(thresh_Contours,cnts,-1,(0,0,255),3)
questionCnts = []
for c in cnts:# 遍历
   # 计算比例和大小
   (x, y, w, h) = cv2.boundingRect(c)
   ar = w / float(h)
   # 根据实际情况指定标准
   if w >= 20 and h >= 20 and ar >= 0.9 and ar <= 1.1:
      questionCnts.append(c)
# 按照从上到下进行排序
questionCnts = sort_contours(questionCnts,
   method="top-to-bottom")[0]
correct = 0
# 每排有5个选项
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来判断结果
      mask = np.zeros(thresh.shape, dtype="uint8")
      cv2.drawContours(mask, [c], -1, 255, -1) #-1表示填充
      # 通过计算非零点数量来算是否选择这个答案
      mask = cv2.bitwise_and(thresh, thresh, mask=mask)
      total = cv2.countNonZero(mask)
      # 通过阈值判断
      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, [cnts[k]], -1, color, 3) #绘图

   #正确率的文本显示
score = (correct / 5.0) * 100
print("[INFO] score: {:.2f}%".format(score))
cv2.putText(warped, "{:.2f}%".format(score), (10, 30),
   cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
cv2.imshow("Input", image)
cv2.imshow("Output", warped)
cv2.waitKey(0)

最终实现的效果如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【黄啊码】微软IE浏览器将退役 网友说:以后考试报名咋办?
5月16日,微软官方消息称,6月16日,IE(Internet Explorer)浏览器正式退役,此后由Edge(Microsoft Edge)接力。
黄啊码
2022/05/18
3710
【黄啊码】微软IE浏览器将退役 网友说:以后考试报名咋办?
【小技巧】解决你的Mac电脑报名教师资格证,为什么一直进不去?
火狐插件大法 正则表达式,匹配任意地址*.neea.edu.cn/apply/memapp/ieNote
瑞新
2020/07/07
4.7K0
CCleaner-系统清洁工具
导读 CCleaner是清理电脑的头号工具。它保护您的隐私,使您的计算机更快,更安全! 网站地址:https://www.piriform.com/ccleaner 链接:https://pan.baidu.com/s/1o7NPMHW 密码:n72q 使用方法: 1、打开CCleaner。 2、转到“清理程序”选项卡,面临的是一个非常混乱的复选框阵容。 从浏览器中检查想清除的项目以及任何其他建议的程序。如“”在Internet Explorer下检查临时互联网文件,Cookie和上次下载位置。大多数用
企鹅号小编
2018/01/26
7070
Chromium版Edge浏览器已能够开启IE内核兼容模式
尽管微软已决定将 Microsoft Edge 的内核迁移至 Google Chromium,但年迈的 Internet Explorer 并不会很快消失,毕竟许多企业客户专为 IE 打造的应用需求还摆在那。有鉴于此,微软也在积极将 IE 内核集成到 Chromium 版 Edge 浏览器中。据说在最新的 Edge 预览开发编译版本中,测试者们已经可以在浏览器设置中成功开启这项功能。
Zip
2019/07/30
1.3K0
ie兼容性视图在哪里设置win10_ie11兼容性视图设置
在访问一些网站时被告知只能使用IE浏览器进行访问,我个人更新了win11的预览版本之后更是在系统中找不到IE的踪迹,edge中的“兼容性视图”选项并没有直接在设置出显示出来,于是一番努力后我发现了在edge中使用IE兼容性视图的设置方法。
全栈程序员站长
2022/10/04
1.8K0
ie兼容性视图在哪里设置win10_ie11兼容性视图设置
HTML Meta中添加X-UA-Compatible和IE=Edge,chrome=1有什么作用
这是一个文档兼容模式的定义。主要用于加强代码对IE的兼容性,强制IE使用当前本地最新版标准模式渲染或者用chrome内核渲染。
全栈程序员站长
2022/07/08
1.9K0
HTML Meta中添加X-UA-Compatible和IE=Edge,chrome=1有什么作用
IE长跑27年终被弃:从全球市占率95%,到退役下岗Edge接棒
---- 新智元报道   编辑:袁榭 拉燕 【新智元导读】5月中旬,微软Edge浏览器的新浪微博官方账号提醒大家:IE在6月15号就要被退役了。 2022年6月16日,一代人终将记住这一天。 服役27年的IE浏览器将在这一天退役,多少人的关于IE的记忆就此画上句号。 5月16零点整,微软Edge浏览器官方微博表示,将在1个月后,让IE浏览器「光荣退役」。 IE退役,一代人的共同记忆逝去 也难为Edge了,老大哥下岗,自己还得卡着点恭送。 不过,没有功劳也有苦劳,IE浏览器好歹为大家服务了27年
新智元
2022/05/23
5600
IE长跑27年终被弃:从全球市占率95%,到退役下岗Edge接棒
Web Developers : 真的再见了 , IE !
我们想想当年的前端开发,连都没有的时代,拿着JQuery,处理着各种头痛的IE问题,写着各种,就会感慨,这是一个好的时代,各种技术百花齐放,轮子满天飞...
Peter谭金杰
2022/03/22
4380
Web Developers : 真的再见了 , IE !
HTML5实战与剖析之HTMLDocument变化(readyreState属性、兼容模式和head属性)「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。   之前为大家介绍了些许关于HTML5新添加的小东东,想必大家也有所了解了。今天为大家介绍HTML5中有关HTMLDocument方面新添加的内容。那么HT
全栈程序员站长
2022/09/09
6510
HTML5实战与剖析之HTMLDocument变化(readyreState属性、兼容模式和head属性)「建议收藏」
Microsoft Edge开启IE兼容模式
如何在Microsoft Edge浏览器里开启IE兼容模式 第一步 image.png 在浏览器输入edge://settings/defaultbrowser image.png 第二步 image.png 在浏览器输入edge://settings/appearance image.png 第三步在需要切换ie的页面点击切换按钮 image.png
用户1215037
2022/02/23
4.9K0
【转】http-equiv="X-UA-Compatible" 设置IE浏览器兼容模式详解
文件兼容性用于定义让IE如何编译你的网页。此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式。
书童小二
2018/09/03
2.1K0
pd虚拟机专用windows系统镜像(m1/intel)
入手了Mac电脑后,由于需要用到Windows软件,又嫌安装双系统太复杂,这时候Mac就用到了安装虚拟机,目前最好用的虚拟机是Parallels Desktop,win镜像版本要根据自己的喜好选对,在此提供分别兼容M1和Intel的win10、11镜像文件。
对影三人
2023/03/28
2.7K0
pd虚拟机专用windows系统镜像(m1/intel)
虚拟机开启就会蓝屏的解决方法是_虚拟机无限蓝屏
禁用该功能,并打开win+X(Windows PowerShell选择管理员),输入 bcdedit /set hypervisorlaunchtype off
全栈程序员站长
2022/10/03
12.8K0
虚拟机开启就会蓝屏的解决方法是_虚拟机无限蓝屏
IE对文档的解析模式及兼容性问题
深入研究这个问题源于最近制作的几个页面,交给前端后,发现在IE8下,对于JS动态控制的内容,页面高度不能够随着动态的调整。
大江小浪
2018/07/25
1.2K0
html如何设置ie6兼容性视图,IE6浏览器兼容性视图设置在哪里[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 ie6浏览器算是旧版本了,如果你想要设置兼容性视图,该怎么设置呢?下面由学习啦小编为大家整理了IE6浏览器的兼容性视图设置在哪里的方法,希望对大家有帮助!
全栈程序员站长
2022/10/04
1.9K0
html如何设置ie6兼容性视图,IE6浏览器兼容性视图设置在哪里[通俗易懂]
ie11兼容性视图设置怎么能自动兼容_ie11兼容模式ie8
Edge浏览器已然成为最新win10系统的默认浏览器,但是用户量却远远不及IE11,IE11虽然性能得到了大的改进,但在浏览网页的时候还是会出现一些兼容性的问题,下面小编就讲为大家分享IE 11浏览器网页不兼容的四个有效解决方法。
全栈程序员站长
2022/10/29
2.9K0
ie11兼容性视图设置怎么能自动兼容_ie11兼容模式ie8
ie兼容性视图怎么设置_电脑找不到兼容性视图
许多用户在升级操作系统之后,里面自带的ie浏览器也会跟着一起升级,然而有些网站可能需要使用低版本的ie浏览器才可以打开,该怎么办呢,其实我们只要设置ie兼容性视图模式就可以了,不过很多用户可能还不知道ie兼容性视图设置在哪,为此,小编这就告诉大家ie兼容性视图的详细设置方法。
全栈程序员站长
2022/10/04
2.2K0
ie兼容性视图怎么设置_电脑找不到兼容性视图
计算机保护插件无法安装,电脑无法安装ActiveX控件怎么办「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。 ActiveX控件是网站常用的一款网页辅助工具,有时候我们可能需要安装它,但是却发现浏览器阻止了它安装,那么你知道电脑无法安装ActiveX控件怎么办吗?下面
全栈程序员站长
2022/08/27
3.5K0
计算机保护插件无法安装,电脑无法安装ActiveX控件怎么办「建议收藏」
【一个小功能】从js判断ie版本,浅谈navigator对象的appName属性[通俗易懂]
判断IE版本主要的是获取两个属性,a.当前浏览器名称,b.当前浏览器版本,为此不得不了解navigator对象。
全栈程序员站长
2022/09/07
1.9K0
【一个小功能】从js判断ie版本,浅谈navigator对象的appName属性[通俗易懂]
IE浏览器终于完蛋啦!
大数据文摘授权转载自果壳 作者:Owl、小毛巾 编辑:odette Internet Explorer,也被称为IE的这个古老浏览器,终于要入土为安了。 前几天,微软Edge浏览器在微博上宣布IE浏览器6月16日正式退役。这个曾经与我的文档、我的电脑图标共同霸占电脑桌面的浏览器,终于等来了它的“死期”。 官方带头黑IE|微软Edge浏览器/微博 在互联网刚刚普及的日子里,IE浏览器简直就是上网的代名词。4399小游戏、新闻资讯门户网站、搜索引擎……双击这个蓝色e图标,一度是人们点开拨号上网后的第一选择。
大数据文摘
2022/05/20
9300
IE浏览器终于完蛋啦!
推荐阅读
相关推荐
【黄啊码】微软IE浏览器将退役 网友说:以后考试报名咋办?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档