# -*- coding:utf-8 -*-
from imutils.perspective import four_point_transform
from imutils import contours
import numpy as np
import cv2 as cv
import sys
ANSWER_KEY_SCORE = {0: 1, 1: 4, 2: 0, 3: 3, 4: 1}
ANSWER_KEY = {0: "A", 1: "B", 2: "C", 3: "D", 4: "E"}
def main(argv):
# 加载一个图片到opencv中
if len(argv) == 2:
img = cv.imread(argv[1])
else:
img = cv.imread('./t1.png')
cv.imshow("orgin", img)
# 转化成灰度图片
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow("gray", gray)
gaussian_bulr = cv.GaussianBlur(gray, (5, 5), 0) # 高斯模糊
cv.imshow("gaussian", gaussian_bulr)
edged = cv.Canny(gaussian_bulr, 75, 200) # 边缘检测,灰度值小于2参这个值的会被丢弃,大于3参这个值会被当成边缘,在中间的部分,自动检测
cv.imshow("edged", edged)
# 寻找轮廓
# image, cts, hierarchy = cv.findContours(edged.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cts, hierarchy = cv.findContours(edged.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
# 给轮廓加标记,便于我们在原图里面观察,注意必须是原图才能画出红色,灰度图是没有颜色的
# cv.drawContours(img, cts, -1, (0,0,255), 3)
# 按面积大小对所有的轮廓排序
list = sorted(cts, key=cv.contourArea, reverse=True)
print("寻找轮廓的个数:", len(cts))
cv.imshow("draw_contours", img)
# 正确题的个数
correct_count = 0
for c in list:
# 周长,第1个参数是轮廓,第二个参数代表是否是闭环的图形
peri = 0.01 * cv.arcLength(c, True)
# 获取多边形的所有定点,如果是四个定点,就代表是矩形
approx = cv.approxPolyDP(c, peri, True)
# 打印定点个数
print("顶点个数:", len(approx))
if len(approx) == 4: # 矩形
# 透视变换提取原图内容部分
ox_sheet = four_point_transform(img, approx.reshape(4, 2))
# 透视变换提取灰度图内容部分
tx_sheet = four_point_transform(gray, approx.reshape(4, 2))
cv.imshow("ox", ox_sheet)
cv.imshow("tx", tx_sheet)
# 使用ostu二值化算法对灰度图做一个二值化处理
ret, thresh2 = cv.threshold(tx_sheet, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
cv.imshow("ostu", thresh2)
# 继续寻找轮廓
r_cnt, r_hierarchy = cv.findContours(thresh2.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
print("找到轮廓个数:", len(r_cnt))
# 使用红色标记所有的轮廓
# cv.drawContours(ox_sheet,r_cnt,-1,(0,0,255),2)
# 把所有找到的轮廓,给标记出来
questionCnts = []
for cxx in r_cnt:
# 通过矩形,标记每一个指定的轮廓
x, y, w, h = cv.boundingRect(cxx)
ar = w / float(h)
if w >= 20 and h >= 20 and ar >= 0.9 and ar <= 1.1:
# 使用红色标记,满足指定条件的图形
# cv.rectangle(ox_sheet, (x, y), (x + w, y + h), (0, 0, 255), 2)
# 把每个选项,保存下来
questionCnts.append(cxx)
cv.imshow("ox_1", ox_sheet)
# 按坐标从上到下排序
questionCnts = contours.sort_contours(questionCnts, method="top-to-bottom")[0]
# 使用np函数,按5个元素,生成一个集合
for (q, i) in enumerate(np.arange(0, len(questionCnts), 5)):
# 获取按从左到右的排序后的5个元素
cnts = contours.sort_contours(questionCnts[i:i + 5])[0]
bubble_rows = []
# 遍历每一个选项
for (j, c) in enumerate(cnts):
# 生成一个大小与透视图一样的全黑背景图布
mask = np.zeros(tx_sheet.shape, dtype="uint8")
# 将指定的轮廓+白色的填充写到画板上,255代表亮度值,亮度=255的时候,颜色是白色,等于0的时候是黑色
cv.drawContours(mask, [c], -1, 255, -1)
# 做两个图片做位运算,把每个选项独自显示到画布上,为了统计非0像素值使用,这部分像素最大的其实就是答案
mask = cv.bitwise_and(thresh2, thresh2, mask=mask)
# cv.imshow("c" + str(i), mask)
# 获取每个答案的像素值
total = cv.countNonZero(mask)
# 存到一个数组里面,tuple里面的参数分别是,像素大小和答案的序号值
# print(total,j)
bubble_rows.append((total, j))
bubble_rows = sorted(bubble_rows, key=lambda x: x[0], reverse=True)
# 选择的答案序号
choice_num = bubble_rows[0][1]
print("答案:{} 数据: {}".format(ANSWER_KEY.get(choice_num), bubble_rows))
fill_color = None
# 如果做对就加1
if ANSWER_KEY_SCORE.get(q) == choice_num:
fill_color = (0, 255, 0) # 正确 绿色
correct_count = correct_count + 1
else:
fill_color = (0, 0, 255) # 错误 红色
cv.drawContours(ox_sheet, cnts[choice_num], -1, fill_color, 2)
cv.imshow("answer_flagged", ox_sheet)
text1 = "total: " + str(len(ANSWER_KEY)) + ""
text2 = "right: " + str(correct_count)
text3 = "score: " + str(correct_count * 1.0 / len(ANSWER_KEY) * 100) + ""
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(ox_sheet, text1 + " " + text2 + " " + text3, (10, 30), font, 0.5, (0, 0, 255), 2)
cv.imshow("score", ox_sheet)
break
cv.waitKey(0)
if __name__ == "__main__":
main(sys.argv)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于OpenCV+python的答题卡识别源码+使用文档+全部资料(高分项目).zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 基于OpenCV+python的答题卡识别源码+使用文档+全部资料(高分项目).zip基于OpenCV+python的答题卡识别源码+使用文档+全部资料(高分项目).zip基于OpenCV+python的答题卡识别源码+使用文档+全部资料(高分项目).zip
资源推荐
资源详情
资源评论
























收起资源包目录






共 4 条
- 1
资源评论

- m0_740582652025-04-24终于找到了超赞的宝藏资源,果断冲冲冲,支持!

盈梓的博客
- 粉丝: 1w+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 监理部质量控制细则(含流程图).docx
- 【精选ppt】大气城市璀璨星空互联网科技产品发布会模板PPT模板ppt课件.pptx
- 有限土条作用下基坑支护设计的浅探.ppt
- KJ90系统培训.ppt
- 哈尔滨某框架结构28571平米15层综合楼综合指标.doc
- 某工程3000m3拱顶油罐施工方案.doc
- 机载嵌入式计算机多级安全防护体系架构研究.docx
- 宏大的工程和精巧的技艺.ppt
- 试论网络虚拟物品的法律保护模式.docx
- 基于JSP的学生选课系统的方案设计书与实现.doc
- 计算机二级Office2010Eexcel公式汇总.docx
- 质量手册-工程勘察设计和工程咨询.doc
- 心电图读图大赛.ppt
- 城市化进程中的基础设施投资效率分析.doc
- 消防值班记录与交接班流程.ppt
- 标准采购作业程序.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
