网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

点击“机器学习算法与Python实战”,“置顶”公众号

重磅干货,第一时间送达

本文为“机器学习交流群”群友华兵同学投稿

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

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

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

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

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)

最终实现的效果如下:

戳一下右下角在看,小小举动,大大支持~

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
网传伊斯兰革命卫队总司令艾哈迈德·瓦希迪被美军击毙

网传伊斯兰革命卫队总司令艾哈迈德·瓦希迪被美军击毙

西虹市闲话
2026-07-13 11:44:07
DeepSeek分析:10年后最可能贬成“白菜价”的10大资产!请留意

DeepSeek分析:10年后最可能贬成“白菜价”的10大资产!请留意

蜉蝣说
2026-07-13 15:45:18
伊朗导弹没打垮以色列,却打出了一个让美国都开始警惕的新问题

伊朗导弹没打垮以色列,却打出了一个让美国都开始警惕的新问题

一簌月光
2026-07-14 01:35:42
跨越3000公里追讨“仅退款”,65岁女老板为省钱买了张无座火车票丨在场

跨越3000公里追讨“仅退款”,65岁女老板为省钱买了张无座火车票丨在场

红星新闻
2026-07-13 20:12:06
蒋方舟正式道歉:肖鹰举报立大功劳,人大撤销一切荣誉,开挂造神跌落神坛,网友怒斥不断!

蒋方舟正式道歉:肖鹰举报立大功劳,人大撤销一切荣誉,开挂造神跌落神坛,网友怒斥不断!

眼光很亮
2026-07-13 21:09:49
Here we go!罗马诺:曼联将签下蒂勒曼斯,激活4100万欧解约条款

Here we go!罗马诺:曼联将签下蒂勒曼斯,激活4100万欧解约条款

懂球帝
2026-07-13 18:30:05
目光犀利、令人敬畏的朝鲜首席大法官

目光犀利、令人敬畏的朝鲜首席大法官

IN朝鲜
2026-07-13 14:20:39
自然资源部与中国气象局联合发布红色地质灾害气象风险预警

自然资源部与中国气象局联合发布红色地质灾害气象风险预警

界面新闻
2026-07-13 18:08:27
NSF 拟出台新政,几乎全面禁止与中国科学家合作

NSF 拟出台新政,几乎全面禁止与中国科学家合作

生物学霸
2026-07-13 18:02:23
如出一辙!周星驰《功夫女足》上映不到一天,多年积怨全爆发

如出一辙!周星驰《功夫女足》上映不到一天,多年积怨全爆发

不似少年游
2026-07-12 11:27:26
知乎高赞!这个时代最大的红利是你可以选择不玩了,一个月1500就可以吃饱

知乎高赞!这个时代最大的红利是你可以选择不玩了,一个月1500就可以吃饱

六子吃凉粉
2026-07-13 15:12:13
建议暂缓长鑫科技上市

建议暂缓长鑫科技上市

风风顺
2026-07-14 00:00:05
我今年38岁,以为分房睡能惩罚老公,一个月后才知道自己有多蠢

我今年38岁,以为分房睡能惩罚老公,一个月后才知道自己有多蠢

千秋文化
2026-06-30 19:40:46
博主带父母从广州打车去拉萨:全程3475公里,事先和司机谈好一口价2.5万,历时7天,打算请司机好吃顿饭,预期视频能破百万点赞

博主带父母从广州打车去拉萨:全程3475公里,事先和司机谈好一口价2.5万,历时7天,打算请司机好吃顿饭,预期视频能破百万点赞

台州交通广播
2026-07-12 22:51:01
25岁独居女子从家中被“掳走”,“好好想想你犯了什么事”

25岁独居女子从家中被“掳走”,“好好想想你犯了什么事”

中国新闻周刊
2026-07-13 19:00:49
史无前例!中国城市集体“啃”老

史无前例!中国城市集体“啃”老

华商韬略
2026-07-13 14:31:16
若帮助西班牙赢得世界杯冠军,罗德里将成为第11位金满贯球员

若帮助西班牙赢得世界杯冠军,罗德里将成为第11位金满贯球员

懂球帝
2026-07-14 01:15:07
炸裂,A股大跳水,原因找到了!关键信号出现,这次真要小心了!

炸裂,A股大跳水,原因找到了!关键信号出现,这次真要小心了!

星图金融研究院
2026-07-13 15:38:37
如果彭副处长她爸妈是下岗职工,那我就是眼神清澈的腹肌男大

如果彭副处长她爸妈是下岗职工,那我就是眼神清澈的腹肌男大

熊太行
2026-07-13 13:40:06
量化砸盘被讨伐!a股跌破年线,科技股连续暴跌,海力士股民大量爆仓

量化砸盘被讨伐!a股跌破年线,科技股连续暴跌,海力士股民大量爆仓

看财经show
2026-07-13 17:05:49
2026-07-14 05:35:00
Ai学习的老章 incentive-icons
Ai学习的老章
Ai学习的老章
3469文章数 11172关注度
往期回顾 全部

科技要闻

OpenAI与Anthropic互掐,最强AI也怕你不用

头条要闻

前妻施南生离世 徐克深夜在医院门口发声

头条要闻

前妻施南生离世 徐克深夜在医院门口发声

体育要闻

世界杯月赚1.7亿,51岁的他仍是顶流

娱乐要闻

具俊晔“深情人设”崩塌,遗产瓜开撕

财经要闻

SK海力士暴跌15%原因找到了?

汽车要闻

小米澎程N90 Max工信部信息曝光 全尺寸旗舰 露营版首秀

态度原创

房产
家居
艺术
手机
数码

房产要闻

重磅出炉!海南最新住宅全装修交付标准来了!

家居要闻

2026建博会(广州) 公装联探展交流活动

艺术要闻

被抢的时候,贼会拿你家的破烂吗?流失海外的中国文物之所以大多是顶级精品,是因为它们本就是被“精挑细选”出来的。

手机要闻

iQOO 16细节再曝,或9月发布

数码要闻

华为耳机联动豆包功能全量上线:支持FreeClip 2、FreeBuds Pro 5

无障碍浏览 进入关怀版