文档章节

opencv+python机读卡识别(三)对选择题识别

Digimon
 Digimon
发布于 2017/07/09 15:31
字数 769
阅读 782
收藏 15
点赞 2
评论 1

第一部分预处理:https://my.oschina.net/u/3268732/blog/1236298

第二部分图像切割:https://my.oschina.net/u/3268732/blog/1236344

第四部分数字识别:https://my.oschina.net/u/3268732/blog/1239954

1.对选择题图像部分预处理 经过四点变换后的图像需要经过重新转换标准长宽,以便对选择题部分标定题号及答案。这里的图像定义为2400*2800 。选择题部分最大的特点是需要将黑块突出,以及过滤掉没填涂的选项,以便确认。预处理方法选择均值滤波及二进制二值化的方法。

# 对灰度图应用二值化算法
thresh=cv2.adaptiveThreshold(warped,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,53,2)
#重塑可能用到的图像
thresh = cv2.resize(thresh, (width1, height1), cv2.INTER_LANCZOS4)
paper = cv2.resize(paper, (width1, height1), cv2.INTER_LANCZOS4)
warped = cv2.resize(warped, (width1, height1), cv2.INTER_LANCZOS4)
#均值滤波
ChQImg = cv2.blur(thresh, (23, 23))
#二进制二值化
ChQImg = cv2.threshold(ChQImg, 100, 225, cv2.THRESH_BINARY)[1]
 '''
    threshold参数说明
    第一个参数 src    指原图像,原图像应该是灰度图。
   第二个参数 x      指用来对像素值进行分类的阈值。
   第三个参数 y      指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
   第四个参数 Methods  指,不同的不同的阈值方法,这些方法包括:
                •cv2.THRESH_BINARY        
                •cv2.THRESH_BINARY_INV    
                •cv2.THRESH_TRUNC        
                •cv2.THRESH_TOZERO        
                •cv2.THRESH_TOZERO_INV    
    '''

选择题部分预处理

2.寻找结果中黑块坐标 这里寻找坐标的目的是为了确定黑块所代表的题号及选项,用轮廓中心来进行描述

# 在二值图像中查找轮廓
cnts = cv2.findContours(ChQImg, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]
for c in cnts:
     # 计算轮廓的边界框,然后利用边界框数据计算宽高比
      (x, y, w, h) = cv2.boundingRect(c)
      if (w > 60 & h > 20)and y>900 and y<2000:
            M = cv2.moments(c)
            cX = int(M["m10"] / M["m00"])
            cY = int(M["m01"] / M["m00"])
            #绘制中心及其轮廓
            cv2.drawContours(paper, c, -1, (0, 0, 255), 5, lineType=0)
            cv2.circle(paper, (cX, cY), 7, (255, 255, 255), -1)
            #保存题目坐标信息
            Answer.append((cX, cY))

选择题轮廓勾勒

3.计算选择题题号及答案 比较绕,主要还是根据取余和倍数关系

def judgey0(y):
    if (y / 5 < 1):
        return  y + 1
    elif y / 5 < 2 and y/5>=1:
        return y % 5 + 20 + 1
    else:
        return y % 5 + 40 + 1
def judgex0(x):
    if(x%5==1):
        return 'A'
    elif(x%5==2):
        return 'B'
    elif(x%5==3):
        return 'C'
    elif(x%5==4):
        return 'D'
def judge0(x,y):
    if x/5<1 :
        #print(judgey0(y))
        return (judgey0(y),judgex0(x))
    elif x/5<2 and x/5>=1:
        #print(judgey0(y)+5)
        return (judgey0(y)+5,judgex0(x))
    elif x/5<3 and x/5>=2:
       # print(judgey0(y)+10)
        return (judgey0(y)+10,judgex0(x))
    else:
        #print(judgey0(y)+15)
        return (judgey0(y)+15,judgex0(x))

输出运算结果:

IDAnswer=[]
for i in Answer:
    for j in range(0,len(xt1)-1):
        if i[0]>xt1[j] and i[0]<xt1[j+1]:
            for k in range(0,len(yt1)-1):
                if i[1]>yt1[k] and i[1]<yt1[k+1]:
                    judge0(j,k)
                    IDAnswer.append(judge0(j,k))
#对答案部分重新排序,以最好的方式输出
IDAnswer.sort()
print(IDAnswer)
print(len(IDAnswer))

至此完成选择题部分 选择题演示

© 著作权归作者所有

共有 人打赏支持
Digimon
粉丝 40
博文 17
码字总数 14810
作品 0
成都
程序员
加载中

评论(1)

dereklin
dereklin
xt1,yt1 怎么来的?
关于机器识别或图像识别的问题求助?

把机读卡扫描成图片,通过对图片的处理,得到学生的得分。尽管有现成的机读卡,但是这个卡是定制的,所以只有通过自己做识别了,但是还没有思路,求大家集思广益。

小昭归来 ⋅ 2017/02/17 ⋅ 2

北京中安未来电子护照阅读器(最新版本)

一、产品描述: 北京中安未来电子护照阅读器是一款外形轻巧美观的证件识读设备,它配备高清500万像素成像系统,采用TH-OCR技术可识别多种身份证件。可识读符合国际民航组织ICAO DOC 9303标准...

wenzuoyong123 ⋅ 04/23 ⋅ 0

浅谈RFID技术在电子巡更中的作用

“电子巡更机”,很多人都不太认识这个是什么? 那么对于电子技术专业的人来说,如果,说起“RFID” 可能就会认识。 今天我们来聊一聊,基于RFID技术的智能巡更系统。 我们都知道读卡技术中,...

英泽FCARD ⋅ 06/20 ⋅ 0

“智享未来 知行合一”,开为科技助力企业开启人工智能新时代

开为科技在春节后还将举行一场纵向产品发布会,以“新零售、新未来”为主题,届时会公布他们在新零售领域实现的两款杀手级产品。 2月6日,开为科技在中新南京生态科技岛召开了2018年首场产品...

行者武松 ⋅ 04/11 ⋅ 0

有了 iText,你截图,腾讯、Google OCR 帮你识别文字

比如,在看类似上面的扫描版 PDF 时,想要复制其中的文字,怎么办?手打?太累。试试我新开发的工具 iText 吧。 iText 是 macOS 平台的 OCR 工具,自带截图功能,选择屏幕任意区域,即可识别...

atJason ⋅ 2017/11/30 ⋅ 0

麒麟开源堡垒主机在等保上的合规性分析

信息安全等级保护工作包括定级、备案、安全建设和整改、信息安全等级测评、信息安全检查五个阶段。 我国的信息安全等级保护共分为五级,级别越高,要求越严格。 我国的信息安全等级保护主要标...

网安1476 ⋅ 2016/05/14 ⋅ 1

我的机器人

人类的终极问题:为什么会有宇宙? 我不知道造物主是谁,但是我也可以当造物主。 站在造物主的角度思考,能帮助自己分析高级文明。 机器人最重要的是“大脑”部分,所以先从软件部分开始。 ...

Mooke ⋅ 2016/03/14 ⋅ 2

推广|人脸识别,从黑科技到日常生活

摘要 从智能安防到智慧交通,从智能签到再到智慧生活,汉柏科技的人脸识别系列产品正在进入人们的视野。 曾几何时,人脸识别初问世,人们惊叹于这样新奇的人工智能技术,并称之为黑科技,意指...

拉风的极客geek ⋅ 2017/12/08 ⋅ 0

Arduino下HY502B读卡实验

HY502B模块支持SPI接口,数字电路具有双电压工作模式(TTL和COMS),主要在一些计费系统和身份识别读卡器系统中应用,该系列模块功耗低,工作电压范围2.7v—5.5v。 现在简单介绍下Arduino接H...

pc朵拉 ⋅ 2013/07/02 ⋅ 0

高考替考事件为指纹识别技术敲响警钟

指纹识别技术存在严重安全漏洞 河南高考替考案中暴露出来的指纹膜以假乱真,也让反作弊问题浮出水面。指纹识别认证受环境温度和个人皮肤条件影响较大等原因,部分考生指纹不易 采集,且市场上...

kouxunli1 ⋅ 2014/07/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 21分钟前 ⋅ 0

设计模式 之 享元模式

设计模式 之 享元模式 定义 使用共享技术来有效地支持大量细粒度对象的复用 关键点:防止类多次创建,造成内存溢出; 使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,...

GMarshal ⋅ 36分钟前 ⋅ 0

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 今天 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 今天 ⋅ 8

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部