基于Android和OpenCV的答題卡識(shí)別軟件

基于Android和OpenCV的答題卡識(shí)別軟件

1. 軟件介紹

設(shè)計(jì)目標(biāo)是可以添加不同的考試碾盟,在不同考試下可以設(shè)置模板德频,包括題目數(shù)量路操、答題卡樣式徘禁、每題分值以及每題答案诅诱;掃描結(jié)果按列表顯示,并講識(shí)別出的圖片展示處理送朱,點(diǎn)擊列表項(xiàng)也可以彈出識(shí)別結(jié)果娘荡。

掃描答題卡可以從相機(jī)或者相冊(cè)中選擇。


掃描結(jié)果頁(yè)面

設(shè)置模板頁(yè)面

程序主頁(yè)面

2.識(shí)別原理介紹

以下主要介紹兩個(gè)核心部分:獲取答題區(qū)域和識(shí)別用戶填涂選項(xiàng)驶沼。

2.1獲取答題區(qū)域及矯正

2.1.1總體流程介紹

獲取答題區(qū)域炮沐,首先要對(duì)原始的彩色圖像進(jìn)行預(yù)處理操作,包括轉(zhuǎn)灰度圖像回怜、高斯模糊大年、邊緣檢測(cè)等,然后從得到的圖像尋找輪廓玉雾,并對(duì)輪廓進(jìn)行一定的篩選翔试,接著求出答題卡矩形頂點(diǎn)的坐標(biāo),利用坐標(biāo)進(jìn)行透視變換從而得到答題區(qū)域抹凳《舨停總體流程圖如圖所示。
[圖片上傳失敗...(image-28efa2-1589871209600)]

2.1.2 圖像預(yù)處理

在獲取答題區(qū)域之前赢底,需要對(duì)圖片進(jìn)行預(yù)處理失都。首先將用戶輸入的原始圖像轉(zhuǎn)化為灰度圖像,以減少后續(xù)對(duì)圖像處理的運(yùn)算復(fù)雜度幸冻。然后使用高斯濾波(3*3)對(duì)圖像去噪粹庞,再利用Sobel算子分別求出圖像在X和Y方向上的梯度,將他們進(jìn)行疊加以獲取邊緣洽损。

在進(jìn)行疊加時(shí)庞溜,對(duì)兩個(gè)圖像的疊加權(quán)重適當(dāng)加大,否則可能導(dǎo)致邊緣不夠清晰使甚至斷開尋找輪廓失敗。權(quán)重設(shè)置為1流码,可以理解為X又官、Y方向的圖像進(jìn)行疊加,可以看到矩形的右邊緣不太清晰漫试,在圖片質(zhì)量差的情況下可能會(huì)發(fā)生斷裂不完整六敬,使后續(xù)查找矩形輪廓時(shí)失敗。 權(quán)重設(shè)置為5驾荣,可以理解為將X外构、Y方向的圖像進(jìn)行5次疊加,原本不太清晰的邊緣經(jīng)過(guò)多次疊加后變得清晰播掷。


權(quán)重設(shè)置為1

權(quán)重設(shè)置為1

在這里插入圖片描述

權(quán)重設(shè)置為5

在完成邊緣檢測(cè)后审编,可以看到圖像還是存在很多細(xì)小的噪點(diǎn),為了更好的提取出答題卡歧匈,對(duì)邊緣檢測(cè)后的圖像進(jìn)行二值化處理垒酬,結(jié)果如圖所示,可以看到噪點(diǎn)很好的被去除了眯亦,圖片顯得更清晰了伤溉。

在這里插入圖片描述

二值化的圖像

在二值化之后般码,還對(duì)該圖像進(jìn)行了一次腐蝕操作(3*3)妻率,原因是后續(xù)獲取矩形坐標(biāo)時(shí)是通過(guò)多邊形擬合的方式,在實(shí)際測(cè)試時(shí)發(fā)現(xiàn)若邊緣存在一些噪點(diǎn)板祝,擬合的時(shí)候可能會(huì)導(dǎo)致擬合不出四邊形導(dǎo)致獲取矩形頂點(diǎn)坐標(biāo)失敗宫静。而通過(guò)一次腐蝕操作可以避免這種情況。因此在圖像預(yù)處理的最后增加了一次腐蝕操作券时。最終獲得的圖像如圖所示孤里。


在這里插入圖片描述

預(yù)處理后的圖像

圖像預(yù)處理的整體流程圖如圖所示。
[圖片上傳失敗...(image-67dac4-1589871209600)]
圖 3 6 圖像預(yù)處理流程圖

2.1.3 尋找輪廓及計(jì)算坐標(biāo)

在圖像預(yù)處理之后橘洞,我們可以得到一張擁有比較清晰的答題卡輪廓的圖像捌袜,但圖像中還有一些與答題區(qū)域無(wú)關(guān)的部分,例如紙張外的部分炸枣、紙張的其他部分虏等,我們只需要答題卡矩形方框那一部分。這一節(jié)將找到答題卡矩形的四個(gè)頂點(diǎn)的坐標(biāo)适肠。

首先我們需要找到圖像中的所有輪廓霍衫,正如前文所說(shuō),圖像中具有許多無(wú)關(guān)的部分侯养,我們需要設(shè)定一個(gè)條件來(lái)篩選我們需要的輪廓敦跌。針對(duì)答題卡在圖像中的特點(diǎn),本文設(shè)定的篩選條件時(shí)輪廓的長(zhǎng)>原圖片長(zhǎng)的1/2逛揩,輪廓的寬>原圖片寬的1/4柠傍,當(dāng)然這個(gè)條件在某些情況下可能會(huì)發(fā)生誤判麸俘,例如題目數(shù)量較少時(shí),矩形的寬可能不能大于原圖片寬的1/4惧笛,因此在這種情況下輸入圖片時(shí)盡量利用軟件的裁剪功能使答題區(qū)域占大部分疾掰;另一種改進(jìn)方法是在設(shè)置模板時(shí),根據(jù)題目數(shù)量和答題卡類型徐紧,動(dòng)態(tài)設(shè)置篩選條件静檬,本文沒(méi)有實(shí)現(xiàn)這種做法,但理論上是可以做到的并级。
識(shí)別結(jié)果如圖 所示拂檩,將篩選出的輪廓用藍(lán)色線畫出。

在這里插入圖片描述

圖 識(shí)別出的矩形邊框

在得到了答題卡矩形輪廓后嘲碧,需要計(jì)算出四個(gè)頂點(diǎn)的坐標(biāo)稻励,并確定四個(gè)頂點(diǎn)的相對(duì)位置。
計(jì)算坐標(biāo)采用的是多邊形擬合的方式愈涩,利用approxPolyDP方法將該輪廓擬合成一個(gè)多邊形望抽,判斷擬合的結(jié)果頂點(diǎn)是否為4,若為4則說(shuō)明成功擬合了一個(gè)四邊形履婉,該四邊形的四個(gè)頂點(diǎn)的坐標(biāo)可以認(rèn)為是答題卡矩形輪廓的坐標(biāo)煤篙。

得到四個(gè)頂點(diǎn)坐標(biāo)后,計(jì)算出四個(gè)頂點(diǎn)坐標(biāo)的中心點(diǎn). 通過(guò)比較每個(gè)點(diǎn)與中心點(diǎn)的x和y值來(lái)判斷該頂點(diǎn)所在位置毁腿,例如A點(diǎn)x坐標(biāo)小于O點(diǎn)x坐標(biāo)辑奈,y坐標(biāo)大于O點(diǎn)y坐標(biāo),則說(shuō)明A點(diǎn)是左上頂點(diǎn)已烤,其他點(diǎn)的確定同理鸠窗。因此我們就獲得了答題卡矩形輪廓四個(gè)頂點(diǎn)的坐標(biāo)。

2.1.4 透視變換矯正圖像

在獲取答題卡的圖片時(shí)胯究,拍照角度很難保證剛好垂直紙張稍计,導(dǎo)致會(huì)發(fā)生一定的傾斜,因此獲得的答題卡區(qū)域有可能是傾斜甚至發(fā)生一定的形變的裕循,我們需要對(duì)這種圖片進(jìn)行透視變換校正臣嚣。

透視變換本質(zhì)是將圖像從一個(gè)平面投影到另一個(gè)平面,在這里就是將答題卡圖像所在傾斜的平面投影到一個(gè)水平的平面中费韭。我們知道了矩形四個(gè)頂點(diǎn)在傾斜平面的坐標(biāo)茧球,還需要四個(gè)在水平平面的坐標(biāo),將矩形的四個(gè)頂點(diǎn)投影到水平平面中星持,就可以得到校正后的圖像抢埋。水平平面的坐標(biāo)選取采用了輪廓的外接矩形的四個(gè)頂點(diǎn)坐標(biāo)。
整個(gè)做法流程運(yùn)行結(jié)果對(duì)比如圖所示,可以看到成功提取出了答題區(qū)域和對(duì)該區(qū)域進(jìn)行了校正揪垄,效果還不錯(cuò)穷吮。


在這里插入圖片描述

圖 原始圖像


在這里插入圖片描述

圖 獲取答題區(qū)域校正后圖像

2.2 識(shí)別填涂答案

2.2.1 整體流程介紹

識(shí)別答題卡,判斷一個(gè)選項(xiàng)是否被選中饥努,有兩個(gè)很重要的步驟捡鱼,一是獲得每道題每個(gè)選項(xiàng)的區(qū)域,例如某個(gè)范圍內(nèi)認(rèn)定是第一題的A選項(xiàng)酷愧,另一個(gè)范圍是第一題的B選項(xiàng)等驾诈;二是獲得答題卡上被填涂的區(qū)域,就是用戶實(shí)際涂寫的區(qū)域溶浴;通過(guò)判斷每個(gè)選項(xiàng)區(qū)域內(nèi)用戶涂寫的部分占該區(qū)域的占比來(lái)判斷該選項(xiàng)是否被選中乍迄。整體流程圖如圖所示,其中去噪和二值化與第三章類似士败,就不再贅述闯两。
[圖片上傳失敗...(image-241dd-1589871209600)]
圖 識(shí)別填涂答案整體流程

2.2.2 獲取單個(gè)選項(xiàng)區(qū)域

因?yàn)楸敬未痤}卡設(shè)計(jì)每個(gè)選項(xiàng)采用的不是封閉的矩形,是“[ A ]”這樣的結(jié)構(gòu)谅将,如果直接尋找輪廓會(huì)找到三個(gè)輪廓難以區(qū)分漾狼,因此可以先采取使用圖像腐蝕和膨脹操作對(duì)其處理,具體實(shí)現(xiàn)有兩種思路:

(1) 對(duì)圖像進(jìn)行膨脹操作饥臂,使每個(gè)選項(xiàng)的“[ ”逊躁、“A”、“]”三個(gè)部分變成一個(gè)部分擅笔,然后進(jìn)行腐蝕操作志衣,避免不同選項(xiàng)間連在一起屯援。然后尋找所有的輪廓猛们,理論上每一題應(yīng)該能找到五個(gè)輪廓,題號(hào)加四個(gè)選項(xiàng)狞洋,對(duì)它們根據(jù)坐標(biāo)進(jìn)行排序從而就能夠獲取每個(gè)選項(xiàng)的區(qū)域弯淘。但是這種方式操作難度很大,在進(jìn)行膨脹操作時(shí)不同選項(xiàng)間很容易存在粘連吉懊,再通過(guò)腐蝕去除粘連時(shí)庐橙,題號(hào)的區(qū)域很可能會(huì)變得很小甚至被消去,導(dǎo)致尋找輪廓時(shí)數(shù)量對(duì)不上借嗽,也難以過(guò)濾掉答題卡上的一些干擾區(qū)域态鳖。
如圖所示,若腐蝕參數(shù)選的小恶导,則很難分離出四個(gè)選項(xiàng)區(qū)域浆竭;若腐蝕參數(shù)選擇過(guò)大,可能會(huì)導(dǎo)致序號(hào)區(qū)域被消去,或者選項(xiàng)三個(gè)部分沒(méi)有達(dá)到我們的目的被膨脹成一塊區(qū)域邦泄,同時(shí)對(duì)于答題卡上的一些干擾信息無(wú)法去除删窒。

在這里插入圖片描述

圖 方法一
(2) 考慮到第一種方式很難去除選項(xiàng)中的粘連,那就考慮直接將選項(xiàng)膨脹參數(shù)調(diào)大顺囊,使四個(gè)選項(xiàng)變成同一個(gè)區(qū)域肌索,再將該區(qū)域平均劃分四部分,每部分對(duì)應(yīng)一個(gè)選項(xiàng)特碳。 本文中采取做法是先進(jìn)行四次膨脹(5*1)诚亚,然后進(jìn)行一次腐蝕操作(1*5),最終效果如圖 4 3所示午乓,可以看到每題選項(xiàng)區(qū)域都被融合在一起亡电,也能很好的區(qū)分題號(hào)和選項(xiàng)區(qū)域,以及過(guò)濾掉一些小的干擾硅瞧。
在這里插入圖片描述

圖 方法二

獲取到每道題選項(xiàng)區(qū)域后份乒,還需要確定每個(gè)區(qū)域?qū)?yīng)的題號(hào),本文采取的策略是先對(duì)輪廓進(jìn)行過(guò)濾腕唧,排除掉題號(hào)的輪廓區(qū)域或辖、一些小的干擾項(xiàng),之后按照輪廓左上頂點(diǎn)進(jìn)行排序枣接,排序策略是根據(jù)y值進(jìn)行排序颂暇,若y相等或相差在10以內(nèi),則根據(jù)x值進(jìn)行排序但惶。Y值的排序策略意思是因?yàn)槊總€(gè)輪廓不一定y都相等耳鸯,可能因?yàn)榕恼战嵌葧?huì)存在一定的誤差,這里將y相差在10以內(nèi)的輪廓都認(rèn)為是同一行膀曾,從而對(duì)拍照角度有一定的容錯(cuò)率县爬。

4.3 獲取填涂區(qū)域
獲取填涂區(qū)域比較好操作,只需要通過(guò)腐蝕去除或者削弱一些沒(méi)有填涂的選項(xiàng)和序號(hào)添谊,使它們滿足不了識(shí)別為選項(xiàng)的條件财喳,即它們?cè)谶x項(xiàng)區(qū)域的占比達(dá)不到要求即可,不需要完全消除這些部分斩狱,否則可能導(dǎo)致填涂的答案也被腐蝕的比較小耳高。對(duì)此,經(jīng)過(guò)多次實(shí)驗(yàn)測(cè)試所踊,本文選擇的方式是進(jìn)行一次腐蝕(5*5)泌枪,得到的效果如圖所示。
可以看到填涂的區(qū)域比較明顯秕岛。若采取多次腐蝕或增大腐蝕參數(shù)碌燕,可以消去其他未填涂的選項(xiàng)乍赫,但是填涂的部分面積也會(huì)變小,采用這種方式已經(jīng)足夠區(qū)分填涂和未填涂的部分了陆蟆。

在這里插入圖片描述

圖 填涂區(qū)域

2.2.3 識(shí)別填涂答案

通過(guò)上述步驟我們可以獲取每題選項(xiàng)的區(qū)域獲取和填涂的區(qū)域雷厂,因此識(shí)別選項(xiàng)是否被標(biāo)記,只需要計(jì)算出每個(gè)選項(xiàng)區(qū)域內(nèi)白色像素點(diǎn)的個(gè)數(shù)占該區(qū)域總像素的比例叠殷,提前設(shè)定好一個(gè)閾值改鲫,超過(guò)這個(gè)值就認(rèn)為該選項(xiàng)被填涂,即可識(shí)別出填涂的選項(xiàng)林束。為直觀看出效果像棘,將第二節(jié)識(shí)別的輪廓畫在識(shí)別出的填涂區(qū)域中,如圖 所示壶冒。將輪廓四等分再統(tǒng)計(jì)四個(gè)區(qū)域的像素值即可實(shí)現(xiàn)選項(xiàng)的識(shí)別缕题。

在這里插入圖片描述

圖 識(shí)別填涂答案

三、測(cè)試結(jié)果

測(cè)試用例圖片說(shuō)明:按照?qǐng)D片處理順序如下
- src: 原圖
- sobel: 用sobel算子進(jìn)行邊緣檢測(cè)后的結(jié)果
- threshold: 二值化
- dilate: 對(duì)二值化圖像進(jìn)行腐蝕胖腾,排除邊界的噪音烟零,防止擬合矩形失敗
- sheetArea: 對(duì)識(shí)別出的輪廓進(jìn)行透視變換和裁剪,得到的答題卡區(qū)域
- select: 獲取填涂的選項(xiàng)
- ansArea: 腐蝕圖片咸作,獲取每一題選項(xiàng)區(qū)域锨阿。對(duì)該區(qū)域劃分四部分,每部分即對(duì)應(yīng)的四個(gè)選項(xiàng)
- rect:將識(shí)別出的每題的選項(xiàng)區(qū)域標(biāo)出记罚,不是必要的墅诡,用于觀察結(jié)果。
- result:將識(shí)別出的填涂的選項(xiàng)標(biāo)記在圖片中

部分測(cè)試結(jié)果如下: 以下測(cè)試均識(shí)別成功

  1. 正常拍攝
    [圖片上傳失敗...(image-4cd5c2-1589871209600)]
  2. 圖片部分傾斜
    [圖片上傳失敗...(image-aedf69-1589871209600)]
  3. 紙面彎曲
    [圖片上傳失敗...(image-1166ab-1589871209600)]
  4. 存在折痕
    [圖片上傳失敗...(image-186b4b-1589871209600)]

四桐智、局限

對(duì)于答題卡矩形的識(shí)別中末早,對(duì)輪廓的篩選采用了固定的方式,即長(zhǎng)寬分別超過(guò)原圖的一定比例说庭,若題目數(shù)量少的答題卡可能會(huì)無(wú)法滿足而導(dǎo)致答題卡的矩形被過(guò)濾然磷,最終無(wú)法識(shí)別。后續(xù)可以考慮根據(jù)題目數(shù)量采用動(dòng)態(tài)的過(guò)濾條件口渔,避免這種誤判样屠。此外,因?yàn)?strong>對(duì)圖像處理過(guò)程是固定的缺脉,可能不使用于所有情況,例如放大悦穿、縮小超出一定范圍則會(huì)無(wú)法識(shí)別攻礼,后續(xù)可考慮使用動(dòng)態(tài)的處理方式,根據(jù)答題卡具體情況選擇對(duì)圖像處理方式(例如對(duì)圖像腐蝕的次數(shù)等)栗柒。

此外礁扮,改軟件存在兼容性的問(wèn)題知举,生成圖片時(shí)因?yàn)椴捎玫氖枪潭ㄏ袼兀诓煌謾C(jī)上可能顯示會(huì)出問(wèn)題(例如題號(hào)溢出到方框外)太伊,精力有限沒(méi)有去繼續(xù)研究這部分了雇锡,但是識(shí)別應(yīng)該是一樣的。

歡迎批評(píng)指正交流僚焦,若留言沒(méi)看見(jiàn)可以加微信:aaaalulala锰提。
部分圖片鏈接掛了可以上csdn看:https://blog.csdn.net/qq_39034790/article/details/106213553

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芳悲,隨后出現(xiàn)的幾起案子立肘,更是在濱河造成了極大的恐慌,老刑警劉巖名扛,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谅年,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肮韧,警方通過(guò)查閱死者的電腦和手機(jī)融蹂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弄企,“玉大人殿较,你說(shuō)我怎么就攤上這事∽兀” “怎么了淋纲?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)院究。 經(jīng)常有香客問(wèn)我洽瞬,道長(zhǎng),這世上最難降的妖魔是什么业汰? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任伙窃,我火速辦了婚禮,結(jié)果婚禮上样漆,老公的妹妹穿的比我還像新娘为障。我一直安慰自己,他們只是感情好放祟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布鳍怨。 她就那樣靜靜地躺著,像睡著了一般跪妥。 火紅的嫁衣襯著肌膚如雪鞋喇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天眉撵,我揣著相機(jī)與錄音侦香,去河邊找鬼落塑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛罐韩,可吹牛的內(nèi)容都是我干的憾赁。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼散吵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼龙考!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起错蝴,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤洲愤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后顷锰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柬赐,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年官紫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肛宋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡束世,死狀恐怖酝陈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毁涉,我是刑警寧澤沉帮,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站贫堰,受9級(jí)特大地震影響穆壕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜其屏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一喇勋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偎行,春花似錦川背、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至汗盘,卻和暖如春皱碘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隐孽。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工癌椿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人菱阵。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓踢俄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親晴及。 傳聞我的和親對(duì)象是個(gè)殘疾皇子都办,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361