当前位置: 首页 > news >正文

毕业设计 基于python的答题卡识别评分系统

文章目录0 简介课题简介什么是机器视觉实现步骤详细设计图片读取canny边缘检测四点变换 划出区域处理选择题区域提取选项轮廓判断选项读取正确结果最后0 简介今天学长向大家分享一个毕业设计项目毕业设计 基于python的答题卡识别评分系统项目运行效果毕业设计 基于opencv的答题卡识别 项目分享:见主页简介课题简介今天我们来介绍一个与机器视觉相关的毕业设计基于机器视觉的答题卡识别系统多说一句, 现在越来越多的学校以及导师选题偏向于算法类, 这几年往往做web系统的同学很难通过答辩, 仔细一想这也在情理之中, 毕业设计是大学四年技术水平的体现, 只做出个XXX管理系统未免太寒酸, 而且web系统选题每年都是那几个老师看着也吐了, 不卡学生才怪所以同学们, 毕设选题要慎重, 最好先找已经毕业了的学长学姐们了解一下, 至少弄清自己做的系统会被老师问到什么问题, 不然只会为自己的毕业挖坑而已什么是机器视觉答题卡识别使用的是机器视觉识别算法, 那什么是机器视觉算法呢?机器视觉并不是视觉他不具有人类的视觉理解能力说穿了他只是图像处理技术的工程应用都是由工程师开发的算法来完成任务并且是特定的算法完成特定的任务互相之间没有通用性。废话不多说, 学长到大家看看, 这项技术实现的效果如何.实现步骤答题卡识别步骤:Step #1: 检测到图片中的答题卡Step #2: 应用透视变换来提取图中的答题卡以自上向下的鸟瞰视图Step #3: 从透视变换后的答题卡中提取 the set of 气泡/圆点 (答案选项)Step #4: 将题目/气泡排序成行Step #5: 判断每行中被标记/涂的答案Step #6: 在我们的答案字典中查找正确的答案来判断答题是否正确Step #7: 为其它题目重复上述操作首先打开摄像头扫描答题卡对摄像头获取到的答题卡图片进行二值化腐蚀膨胀边缘检测轮廓计算进行顶点对齐得到下图对图像进行倾斜变换和仿射变换得到下图开始对图像进行二值化边缘检测等操作最终得到结果详细设计图片读取主要采用了pythonopencv因为要做后续分割所以肯定要用到边缘检测所以先灰度化再二值化​#读取图片 imgcv2.imread(images/5.png) #转换为灰度图 gray cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #高斯滤波 blurredcv2.GaussianBlur(gray,(3,3),0) #增强亮度 blurredimgBrightness(blurred,1.5,3 #自适应二值化 blurredcv2.adaptiveThreshold(blurred,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,51,2) adaptiveThreshold函数第一个参数src指原图像原图像应该是灰度图。 第二个参数x指当像素值高于有时是小于阈值时应该被赋予的新的像素值 第三个参数adaptive_method 指 CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C 第四个参数threshold_type 指取阈值类型必须是下者之一 • CV_THRESH_BINARY, • CV_THRESH_BINARY_INV 第五个参数 block_size 指用来计算阈值的象素邻域大小: 3, 5, 7, ... 第六个参数param1 指与方法有关的参数。对方法CV_ADAPTIVE_THRESH_MEAN_C 和 CV_ADAPTIVE_THRESH_GAUSSIAN_C 它是一个从均值或加权均值提取的常数, 尽管它可以是负数。 blurredcv2.copyMakeBorder(blurred,5,5,5,5,cv2.BORDER_CONSTANT,value(255,255,255))处理结果如下canny边缘检测根据轮廓大小将要处理的几部分分割出来如果提取效果不好可能是因为拍摄光线原因导致图片亮度不好增强一下亮度二值化后的图片效果会好一点这样canny边缘检测结果也会好一点​#增强亮度 def imgBrightness(img1, c, b): rows, cols img1.shape blank np.zeros([rows, cols], img1.dtype) rst cv2.addWeighted(img1, c, blank, 1-c, b) return rst​​#canny边缘检测 edged cv2.Canny(blurred,0,255) cnts,hierarchycv2.findContours(edged,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) docCnt [] count0 #确保至少有一个轮廓被找到 if len(cnts)0: #将轮廓按照大小排序 cntssorted(cnts,keycv2.contourArea,reverseTrue) #对排序后的轮廓进行循环处理 for c in cnts: #获取近似的轮廓 peri cv2.arcLength(c,True) approx cv2.approxPolyDP(c,0.02*peri,True) #如果近似轮廓有四个顶点那么就认为找到了答题卡 if len(approx) 4: docCnt.append(approx) count1 if count3: break处理结果如下四点变换 划出区域直接用imutils包中的four_point_transform将需要的区域提取出来彩色图便于展示灰度图用来处理​#四点变换划出选择题区域 paper four_point_transform(img,np.array(docCnt[0]).reshape(4,2)) warped four_point_transform(gray,np.array(docCnt[0]).reshape(4,2)) #四点变换划出准考证区域 ID_Area four_point_transform(img,np.array(docCnt[1]).reshape(4,2)) ID_Area_warped four_point_transform(gray,np.array(docCnt[1]).reshape(4,2)) #四点变换划出科目区域 Subject_Area four_point_transform(img,np.array(docCnt[2]).reshape(4,2)) Subject_Area_warped four_point_transform(gray,np.array(docCnt[2]).reshape(4,2))处理结果如下处理选择题区域提取选项轮廓​ 处理选择题区域统计答题结果 thresh cv2.threshold(warped,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1] thresh cv2.resize(thresh,(2400,2800),cv2.INTER_LANCZOS4) paper cv2.resize(paper,(2400,2800),cv2.INTER_LANCZOS4) warped cv2.resize(warped,(2400,2800),cv2.INTER_LANCZOS4) cnts,hierarchy cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) questionCnts[] answers[] #对每一个轮廓进行循环处理 for c in cnts: #计算轮廓的边界框然后利用边界框数据计算宽高比 (x,y,w,h) cv2.boundingRect(c) ar w/float(h) #判断轮廓是否是答题框 if w40 and h15 and ar1 and ar1.8: M cv2.moments(c) cX int(M[m10]/M[m00]) cY int(M[m01]/M[m00]) questionCnts.append(c) answers.append((cX,cY)) cv2.circle(paper,(cX,cY),7,(255,255,255),-1) ID_Answerjudge_point(answers,modepoint) cv2.drawContours(paper,questionCnts,-1,(255,0,0),3)处理结果如下判断选项​def judgeX(x,mode): if modepoint: if x600: return int(x/100)1 elif x600 and x1250: return int((x-650)/100)6 elif x1250 and x1900: return int((x-1250)/100)11 elif x1900: return int((x-1900)/100)16 elif modeID: return int((x-110)/260)1 elif modesubject: if x1500: return False​​​​def judge(x,y,mode): if judgeY(y,mode)!False and judgeX(x,mode)!False: if modepoint: return (int(y/560)*20judgeX(x,mode),judgeY(y,mode)) elif modeID: return (judgeX(x,mode),judgeY(y,mode)) elif modesubject: return judgeY(y,mode) else: return 0 def judge_point(answers,mode): IDAnswer[] for answer in answers: if(judge(answer[0],answer[1],mode)!0): IDAnswer.append(judge(answer[0],answer[1],mode)) else: continue IDAnswer.sort() return IDAnswer def judge_ID(IDs,mode): student_ID[] for ID in IDs: if(judge(ID[0],ID[1],mode)!False): student_ID.append(judge(ID[0],ID[1],mode)) else: continue student_ID.sort() return student_ID def judge_Subject(subject,mode): return judge(subject[0][0],subject[0][1],mode)读取正确结果​ 读取结果 df pd.read_excel(answer.xlsx) index_list df[[题号]].values.tolist() true_answer_list df[[答案]].values.tolist() index[] true_answer[] score0 #去括号 for i in range(len(index_list)): index.append(index_list[i][0]) for i in range(len(true_answer_list)): true_answer.append(true_answer_list[i][0]) answer_index[] answer_option[] for answer in ID_Answer: answer_index.append(answer[0]) answer_option.append(answer[1]) for i in range(len(index)): if answer_option[i]true_answer[i]: score1 if i1len(answer_option): break最后实现效果毕业设计 基于opencv的答题卡识别 项目分享:见主页简介
http://www.zskr.cn/news/1334888.html

相关文章:

  • 【Perplexity工程知识查询黄金标准】:基于127个真实故障案例构建的Query构造Checklist(含SOP模板)
  • Linux守护进程--进程、进程组、会话、终端
  • 2026年5月靠谱的湖北发电机出租联系方式哪家强厂家推荐榜,静音型/常规型/大型发电车租赁厂家选择指南 - 海棠依旧大
  • QGIS 3.28.3 保姆级教程:手把手教你下载天地图影像/矢量瓦片(附完整参数与避坑指南)
  • 终极Android虚拟定位指南:无需Root,让你的手机“瞬间移动“到世界任何角落!
  • YOLOv8模型魔改实战:用RT-DETR的AIFI模块替换SPPF,性能对比与效果实测
  • 2026年积分兑换柜优质品牌推荐榜:智慧电子门牌/智能电子班牌/校园兑换柜/校园电子班牌/电子去向牌/礼品兑换柜/选择指南 - 优质品牌商家
  • 淘宝淘金币自动化脚本:每天节省25分钟的数字生活革命
  • 小程序第三方请求插件
  • GD32F4xx内部FLASH读写避坑指南:从用户手册到代码调试,手把手教你搞定0x08040000地址操作
  • 保姆级教程:在Ubuntu 18.04上搞定ZED2i相机驱动与ROS联动(含网络报错解决)
  • 2026嵌入式核心模块定制指南,派普蓝电子如何赋能智能硬件
  • Claude API 流式输出(SSE)实战:从打字机效果到工具调用全流程
  • Perplexity×艺术档案馆深度整合方案:打通Getty、MoMA、VA元数据的7种API级调用策略
  • 智能手表核心升级:三星OLED与4nm处理器如何重塑用户体验
  • MySql学习杂谈 --- “连接“”
  • i.MX8M Mini核心板Linux 6.1 BSP升级:内存带宽翻倍与嵌入式开发实战
  • 5015系列圆形连接器选型避坑指南
  • 还在用Win7/XP做测试?手把手教你用VMware Workstation 10 Pro搭建老系统环境(附10.0.7下载)
  • CentOS7时间不准?一个timedatectl命令搞定时区和手动校准
  • 从Vue/React到移动端:用Cordova 12把你的Web项目打包成Android App实战
  • 某包丨图片+视频去水印去除工具
  • 注册培训师、咨询师——杨刚老师简介
  • Lua 脚本执行 Redis 队列逻辑出现 ERR 错误怎么排查?
  • Seedance2.0内容创作干货!学会这四点教你用 Seedance 2.0 拍出电影感!
  • 合肥假发店TOP5评测|专业形象管理指南,揭秘靠谱之选! - 行业深度观察C
  • 2026年积分兑换柜优质品牌推荐榜:电子去向牌、礼品兑换柜、五育兑换柜、五金电子门牌、人员去向电子牌、会议电子门牌选择指南 - 优质品牌商家
  • rust语言学习笔记Trait(七) IntoIterator(由集合创建迭代器)
  • 2026年移动广告联盟TOP5盘点:APP变现、APP商业化变现、APP广告收益提升、APP广告素材合规、APP想接入广告选择指南 - 优质品牌商家
  • 2026年q2物业托管技术全解析:成都清洁外包/成都物业公司/成都物业外包/攀枝花保洁公司/选型与落地核心推荐 - 优质品牌商家