文档章节

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

Digimon
 Digimon
发布于 2017/07/09 15:31
字数 769
阅读 869
收藏 15

第一部分预处理: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
博文 18
码字总数 14810
作品 0
成都
程序员
加载中

评论(1)

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

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

小昭归来
2017/02/17
167
2
北京中安未来电子护照阅读器(最新版本)

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

wenzuoyong123
04/23
0
0
浅谈RFID技术在电子巡更中的作用

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

英泽FCARD
06/20
0
0
“智享未来 知行合一”,开为科技助力企业开启人工智能新时代

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

行者武松
04/11
0
0
麒麟开源堡垒主机在等保上的合规性分析

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

网安1476
2016/05/14
2.6K
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 恨不得给你买张飞机挂票

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @开源中国首席灵魂师:分享张希/曹方的单曲《认真地老去》 来不及认真的年轻过,就认真的老去! 《认真地老去》- 张希/曹方 手机党少年们想听...

小小编辑
42分钟前
87
6
如何实现靠谱的分布式锁?

分布式锁,是用来控制分布式系统中互斥访问共享资源的一种手段,从而避免并行导致的结果不可控。基本的实现原理和单进程锁是一致的,通过一个共享标识来确定唯一性,对共享标识进行修改时能够...

郑加威
今天
1
0
Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
3
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
4
0
打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部