OpenCV图像处理——(实战)答题卡识别试卷

news2024/9/24 7:19:36

总目录

图像处理总目录←点击这里

二十、答题卡识别试卷

20.1、预处理

灰度图

输出灰度图+高斯滤波去噪

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

在这里插入图片描述

边缘检测

edged = cv2.Canny(blurred, 75, 200)

在这里插入图片描述

20.2、轮廓检测

找到原始图像中边框的四个矩形框的点

cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(contours_img, cnts, -1, (0, 0, 255), 3)

在这里插入图片描述

20.3、透视变换

得到需要的图像范围

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

在这里插入图片描述

20.4、阈值处理

处理已经选择的题目

thresh = cv2.threshold(warped, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

在这里插入图片描述

20.5、轮廓检测(小)

每一个圆圈的轮廓检测

(涂答题卡可能涂到外面)

cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(thresh_Contours, cnts, -1, (0, 0, 255), 3)

在这里插入图片描述

20.6、筛选,排序,选项

筛选出符合条件的圆圈(通过宽高,宽高比例筛选)

将符合条件的进行排序(默认乱序)

  • 先从上到下找到所有行排序
  • 在从左到右对每一行排序
  • 根据像素点对比找到答案

# 遍历筛选
for c in cnts:
    # 计算比例和大小
    (x, y, w, h) = cv2.boundingRect(c)
    ar = w / float(h)

    # 根据实际情况指定标准
    if w >= 20 and h >= 20 and 0.9 <= ar <= 1.1:
        questionCnts.append(c)

# 排序
def sort_contours(cnts, method="left-to-right"):
    # ...
    boundingBoxes = [cv2.boundingRect(c) for c in cnts]
    return cnts, boundingBoxes

# 对所有行排序
questionCnts = sort_contours(questionCnts, method="top-to-bottom")[0]

# 循环,并找答案
for (q, i) in enumerate(np.arange(0, len(questionCnts), 5)):
	# 对每一行进行排序
	cnts = sort_contours(questionCnts[i:i + 5])[0]
	for (j, c) in enumerate(cnts):
		mask = np.zeros(thresh.shape, dtype="uint8")
		if bubbled is None or total > bubbled[0]:
    	# j为答案,total为像素点对比(选出最合适的)
    	bubbled = (total, j)
		# ... 

第一行跑完结果

由 12345与操作得出最后结果

在这里插入图片描述

20.7、结果

答案:BEADB

第4题选错

在这里插入图片描述

答案:BEADB

第1、2、4、5题选错
在这里插入图片描述
答案:BEADB

第1、4 题选错

在这里插入图片描述

答案:BEADB

第1、2、3、5题选错

在这里插入图片描述

答案:BEADB

正确

在这里插入图片描述

原图

# 正确答案 1 4 0 3 1  ------> B E A D B
ANSWER_KEY = {0: 1, 1: 4, 2: 0, 3: 3, 4: 1}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速构建一个简单的对话+问答AI (上)

文章目录前言part0 资源准备基本功能语料停用词问答闲聊语料获取part01句的表达表达one-hot编码词嵌入大致原理实现简单版复杂版如何训练转换后的形状part02 循环神经网络RNNRNN投影图RNN是三维立体的LSTM&GRUpart03意图识别分词FastText分类FastText网络结构优化点构造Fas…

http请求走私漏洞原理,利用,检测,防护

目录 什么是请求走私 漏洞成因与常见类型 Keep-Alive&Pipeline CL&TE 常见走私类型 1.CL不为0 2.CL CL 3.CL TE 4.TE CL 5.TE TE 走私攻击应用实例&#xff08;漏洞利用&#xff09; 使用CL TE走私获取其他用户的请求、Cookie 2.泄露请求头重写请求实现未…

UE4贴图自适应屏幕大小

游戏开发中&#xff0c;不同屏幕下的分辨率不同&#xff0c;模型/物品被拉伸之后贴图也会随之拉伸。 如果需要在不同屏幕下面实现贴图真实大小不变&#xff08;以下简称为自适应&#xff09;&#xff0c;需要对UV进行缩放处理之后再取得对应贴图的颜色。 本文提供一种能够实现不…

为什么国外程序员的创造力比中国程序员强?

1川口耕介是个日本程序员&#xff0c;他曾在Sun公司从事Java、XML和Solaris相关的开发。2004年&#xff0c;他用Java写了叫做一个Hudson的开源工具&#xff0c;专门做持续集成&#xff08;CI&#xff09;。Hudson安装、配置、使用都非常方便&#xff0c;并且支持用插件的形式扩…

有求必应 | 听说这个管线排布,横竖都行?

大家好&#xff0c;今天还是被 yi 情反复拿捏的建模助手。 拿捏归拿捏&#xff0c;企微客服还是很认真得在给大家答疑解惑记bug&#xff0c;刚好有求知若渴的盆友问到管线排布这个角度&#xff0c;是否能有小数点&#xff0c;比如1.2&#xff0c;或者0.8。 对待此类问题&#x…

无线传感器网络:排队论(Queueing Theory)模型

文章目录The arrival ProcessQueueing SystemThe M/M/1 queueThe M/M/1/N queueReferences排队理论已被用于评估通信网络的性能很多年了。早在1917年&#xff0c;丹麦数学家 Erlang 就将该理论用于电话交换机的设计&#xff0c;并开创了现在著名的 Erlang-B 和 Erlang-C 公式&a…

DevData Talks | 知乎艾辉:从工具建设到运营,千人团队研发提效最佳实践

在千人级别的组织层级提升研发效能&#xff0c;是一种什么体验&#xff1f;可以确定的是&#xff0c;千人级组织的效能提升&#xff0c;并不是百人级团队的等比放大。 在数十人乃至小百人的团队&#xff0c;统一规范研发工具与流程的门槛相对较低&#xff0c;参与方也比较简单…

07 索引

1.索引 概述 1. 简介 索引是一种帮助数据库高效获取数据的数据结构&#xff1b;通过索引可以快速获取到符合条件的数据的内存地址&#xff0c;避免全表扫描 2. 索引的优缺点 优点&#xff1a; 可以快速地检索数据&#xff0c;降低数据IO成本通过索引可以对数据进行排序&…

jenkins 共用宿主机中的docker自动化部署

目录 第一节 jenkins 共用宿主机中的docker自动化部署 1.docker命令安装启动jenkins 2.查询jenkins内是否可以执行宿主机中的docker 第二节.jenkins 配置自动化部署 1.界面配置 1.配置mave 2.配置gitee 第三节 创建springboot多模块项目 1.相关配置 1.pom 2.编写docke…

【面试题】作用域和闭包

1. 作用域 作用域是指变量的合法使用范围。 例如下图中&#xff0c;函数fn3内定义的变量a3&#xff0c;无法在函数fn3以外的区域使用。 作用域分为全局作用域&#xff0c;函数作用域&#xff0c;块级作用域&#xff08;ES6新增&#xff09; 全局作用域&#xff1a;变量没有受…

HTML+CSS+JS个人网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

MYSQL索引数据结构----B+树

索引数据结构的考量 我们在考虑数据结构的时候&#xff0c;应该首先要知道数据存放在哪里&#xff1f; 而MYSQL的数据是持久化的&#xff0c;所以其数据&#xff08;数据记录索引&#xff09;应该是保存在磁盘里面的。因此当我们要查询某条数据记录时&#xff0c;就会先从磁盘…

[附源码]计算机毕业设计JAVA某城市参军和退役军人信息管理系统

[附源码]计算机毕业设计JAVA某城市参军和退役军人信息管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff…

一文理解Linux的基本指令(三分钟学会Linux基本指令)

前沿&#xff1a; 本文小马将把Linux一般比较常见的指令给大家一一列举出来&#xff0c;为了大家忘记某些指令后&#xff0c;可以方便查询记忆&#xff0c;再次小马建议&#xff0c;Linux指令并不需要去特别花时间专门记忆&#xff0c;只需要多进行操作实现就行&#xff01; &a…

算法图解学习3 选择排序

random recording 随心记录 What seems to us as bitter trials are often blessings in disguise. 看起来对我们痛苦的试炼&#xff0c;常常是伪装起来的好运。 选择排序 内存工作原理 背景引入 假设你去看演出&#xff0c;需要将东西寄存。寄存处有一个柜子&#xff0c;柜子…

Go | 函数注意事项

细节汇总 函数的形参列表可以是多个&#xff0c;返回值列表也可以是多个形参列表和返回值列表的数据类型&#xff0c;可以是值类型、也可以是引用类型函数的命名遵循标识符命名规范&#xff0c;首字母不能是数字&#xff0c;首字母大写表示该函数可以被本包文件和其它文件使用…

在线就能设计电商主图的智能平台工具

商品要上新要如何设计新品主图&#xff1f;想设计简约分的主图素材在哪&#xff1f;下面小编教你使用这个在线工具乔拓云&#xff0c;工具内包含了设计主图用到的所有工具&#xff0c;还有海量的电商模板以及免扣素材&#xff0c;都是可以直接使用到主图设计中&#xff0c;不需…

Linux中线程的介绍

目录 一.线程概念 1.什么是线程 二.Linux进程与线程 三.pthread库 3.1线程创建 3.2线程等待 3.2线程终止 3.4分离线程 四.线程ID及进程地址空间布局 一.线程概念 1.什么是线程 1.在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&…

2022亚太杯建模B题思路 : 高速列车的优化设计 小美赛数学建模 B题思路

1 B题&#xff1a;高速列车的优化设计 2022年4月12日&#xff0c;中国高铁复兴CR450多机组成功实现单列列车速度435 km/h&#xff0c;相对速度870 km/h&#xff0c;创造了高铁多机组列车穿越明线和隧道速度的世界纪录。新一代标准动车组“复兴”是中国自主研发的具有全知识产权…

外贸线上推广引流的技巧

外贸网站建成后&#xff0c;很多外贸企业通常会面临一个重要的问题。网站装修和产品布局都很漂亮&#xff0c;但是流量很小。由此可见&#xff0c;外贸网站的引流推广是非常重要的。接下来&#xff0c;米贸搜给大家分享一些外贸网站引流推广的技巧&#xff0c;让网站快速获得流…