韋溢輝 劉漢英
摘要:為降低閱卷的人力成本,提高考試情況分析的準(zhǔn)確率和效率,對答題卡模板生成以及答題卡識(shí)別的算法進(jìn)行研究和設(shè)計(jì)。實(shí)現(xiàn)動(dòng)態(tài)設(shè)置答題卡信息,用word文檔形式生成答題卡模板,以圖片形式讀入實(shí)物答題卡,通過圖像識(shí)別獲取答題卡填涂內(nèi)容,將識(shí)別結(jié)果與設(shè)定的答案信息進(jìn)行比對,得出考試結(jié)果。系統(tǒng)運(yùn)用OpenCV計(jì)算機(jī)視覺庫對答題卡圖片進(jìn)行灰度化、降噪、模板匹配、透視變換、二值化等一系列圖像處理,最終實(shí)現(xiàn)答題卡模板生成以及答題卡識(shí)別。
關(guān)鍵詞:答題卡生成;答題卡識(shí)別;OpenCV圖像處理;模板匹配
中圖分類號(hào):TP391.41 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)29-0023-05
1 背景
網(wǎng)上閱卷系統(tǒng)已經(jīng)應(yīng)用于中考、高考和國考等大規(guī)??荚?,然而在復(fù)雜環(huán)境下的中小規(guī)??荚嚾缭驴己蜏y試等,該系統(tǒng)并未得到廣泛應(yīng)用,基本上仍在進(jìn)行手工閱卷[1]。本文以桂林理工大學(xué)的答題卡樣式為例,設(shè)計(jì)一種可以根據(jù)使用者要求生成答題卡兼閱卷并對考試情況進(jìn)行分析的軟件,最大限度降低成本和軟件對設(shè)備的要求,如答題卡打印紙張采用普通A4紙即可,使用方式盡可能簡單,以減輕教師的工作負(fù)擔(dān)。
2 系統(tǒng)分析
答題卡生成與批閱分析系統(tǒng)可以依照使用者對答題卡信息、客觀題題型和題數(shù)的設(shè)置生成相應(yīng)的答題卡模板并導(dǎo)出word文檔,提供答題卡批量識(shí)別功能,根據(jù)使用者預(yù)設(shè)的答案數(shù)據(jù)得出答題卡的填涂結(jié)果,并根據(jù)預(yù)設(shè)的知識(shí)點(diǎn)類型,統(tǒng)計(jì)每個(gè)知識(shí)點(diǎn)和每道題的得分率。
3 系統(tǒng)設(shè)計(jì)
3.1 系統(tǒng)功能設(shè)計(jì)
本系統(tǒng)的整體功能圖如圖1所示。
3.1.1新建答題卡模板
在新建答題卡模板的功能里,使用者可以自定義答題卡的基本信息,如題目數(shù)量、題目選項(xiàng)數(shù)量、題目分值、知識(shí)點(diǎn)數(shù)量等;根據(jù)使用者的設(shè)置,生成相應(yīng)數(shù)量的文本框等控件讓用戶定義知識(shí)點(diǎn)、答案等,最后,以Word文檔形式生成相應(yīng)信息、題量的答題卡模板,以供使用者打印。
3.1.2已存答題卡模板
在已存答題卡的頁面,顯示使用者已創(chuàng)建的所有答題卡模板,可對答題卡模板進(jìn)行“批量識(shí)別”“導(dǎo)出”“刪除”等操作。
1)實(shí)現(xiàn)批量識(shí)別實(shí)物答題卡,將需要識(shí)別的答題卡單獨(dú)拍照,然后全部導(dǎo)人程序進(jìn)行識(shí)別,記錄答題卡識(shí)別結(jié)果。
2)實(shí)現(xiàn)答題卡模板導(dǎo)出功能,使用者可以重復(fù)導(dǎo)出答題卡。
3)實(shí)現(xiàn)刪除答題卡模板功能,使用者可以隨時(shí)刪除不需要的答題卡模板。
4)把實(shí)物答題卡識(shí)別結(jié)果與使用者定義的答案數(shù)據(jù)進(jìn)行比較、判斷,并輸出每張實(shí)物答題卡的得分和每道題的正確率以及每個(gè)知識(shí)點(diǎn)的得分率。
3.2 標(biāo)準(zhǔn)答題卡模板設(shè)計(jì)
本系統(tǒng)所設(shè)答題卡標(biāo)準(zhǔn)模板如圖2所示,圖中黑色圓塊作為整體定位錨點(diǎn),最下邊和最右邊的黑色矩形作為學(xué)號(hào)區(qū)域和答題區(qū)的定位錨點(diǎn),代表題目選項(xiàng)和學(xué)號(hào)選項(xiàng)位置的縱坐標(biāo)和橫坐標(biāo)。將答題卡模板生成時(shí)需要插入內(nèi)容的區(qū)域添加為書簽。
4 系統(tǒng)實(shí)現(xiàn)
4.1 答題卡模板生成的實(shí)現(xiàn)
創(chuàng)建答題卡模板的流程如圖3所示。
4.1.1 題目數(shù)量溢出判斷
判斷題目數(shù)量n是否超出限制,即題目數(shù)量是否在答題卡模板的題目容量范圍。根據(jù)答題卡標(biāo)準(zhǔn)模板的設(shè)計(jì),用于插入題目選項(xiàng)內(nèi)容的區(qū)域共23行、19列,在每一行里,題號(hào)占一列,每個(gè)選項(xiàng)占一列,兩道題間的間距占一列,所以每道題所占列數(shù)為選項(xiàng)數(shù)量s+2,特殊的,每行最后一題無須留出與下一題的
4.2 答題卡識(shí)別的實(shí)現(xiàn)
答題卡識(shí)別,是把答題卡以照片形式導(dǎo)人,通過對圖片的一系列處理如轉(zhuǎn)換灰度圖、降噪、模板匹配、透視變換、區(qū)域投影、膨脹腐蝕、閾值判定等,從而得出答題卡的識(shí)別結(jié)果,再與標(biāo)準(zhǔn)答案數(shù)據(jù)比較,進(jìn)行結(jié)果分析[2]。答題卡識(shí)別流程如圖4所示。
4.2.1 模板匹配
根據(jù)答題卡模板的設(shè)計(jì)規(guī)則,把答題卡分割成左上、左下、右上、右下四個(gè)相等大小的區(qū)域時(shí),每個(gè)區(qū)域上必然有且只有一個(gè)黑色圓點(diǎn),分別對4個(gè)區(qū)域進(jìn)行模板匹配,就可以得出4個(gè)整體定位錨點(diǎn)的坐標(biāo)。在此以左上角的區(qū)域?yàn)槔M(jìn)行介紹。
在完成了對圖像的灰度化、高斯濾波降噪、二值化后,進(jìn)行模板匹配,算法主要流程如圖5所示。
1) OpenCV提供模板匹配函數(shù)matchTemplate匹配模板塊和輸入圖像[3],圖6(a)是左上區(qū)域原始圖像,獲得匹配結(jié)果圖像,越亮的點(diǎn)匹配度越高,左上區(qū)域模板匹配結(jié)果如圖6(b)所小。
2)歸一化是把數(shù)據(jù)經(jīng)過處理后限制在需要的一定范圍內(nèi),使得數(shù)據(jù)之間對比性明顯[4]。OpenCV提供函數(shù)normalize進(jìn)行歸一化處理,圖7為對模板匹配結(jié)果做歸一化處理。
3)OpenCV提供函數(shù)minMaxLoc在給定矩陣中獲取最大和最小值(包括它們的位置[5]。通過該函數(shù)可得匹配度最高的點(diǎn)的坐標(biāo),再經(jīng)過計(jì)算得出該點(diǎn)在原圖的坐標(biāo)。
實(shí)現(xiàn)模板匹配獲取4個(gè)整體定位錨點(diǎn)坐標(biāo)的主要偽代碼為[6]:
void getlmageTag(Mat匹配原圖,Mat原圖局部圖片,Point2f坐標(biāo)容器[])
f double寬}匹配原圖.rows;
double長}匹配原圖.cols;
double tmpLoc[4][4]={{0, 0},
{cols/2,0),{0,rows/2},
(cols/2,rows/2)};
Mat tmplmg[4]; //區(qū)域:0左上,1右上,2左下,3右下
Mat reslmg;
//匹配結(jié)果圖
double minVal, maxVal;//最小,大匹配值
Point minLoc, maxLoc;//最小,大匹配值坐標(biāo)
for (inti=0;i<4;i++)
{ tmplmgfil一匹配原圖(Rect(tmpLoc[i] [0], tmpLoc[i] [1],cols/2,rows/2》;
matchTemplate(tmplmg[i],原圖局部圖片,reslmg,5);
normalize(reslmg, reslmg,0,l,NORM_MINMAX, -1,Mat0);
minMaxLoc(reslmg, &minVal, &maxVal, &minLoc, &max-Loc, Mat0);
坐標(biāo)容器[i]= Point(maxLoc.x+ tmpLoc[i][O],maxLoc.y+tmp-LocLilIID;))
4.2.2透視變換
透視變換(Perspective Transformation)是將圖片投影到一個(gè)新的視平面(Viewing Plane),也稱作投影映射(Projective Map-ping)[7]。
透視變換的數(shù)學(xué)公式為:
OpenCV提供getPerspectiveTransform函數(shù)和warpPerspec-tive函數(shù)進(jìn)行透視變換[8]。getPerspectiveTransform根據(jù)答題卡標(biāo)準(zhǔn)模板中4個(gè)整體定位錨點(diǎn)的坐標(biāo)與前文模板匹配所得到的4個(gè)坐標(biāo)計(jì)算出透視變換矩陣,warpPerspective根據(jù)所得透視變換矩陣對圖片執(zhí)行透視變換。透視變換效果如圖8所示。
4.2.3區(qū)域投影計(jì)算
學(xué)號(hào)選項(xiàng)和答案選項(xiàng)的定位,是通過答題底部和最右側(cè)的黑色矩形來確定坐標(biāo)。
投影計(jì)算的思路是計(jì)算區(qū)域中每一行或每一列非零像素的數(shù)量,再通過判斷閾值和區(qū)域連續(xù)確定每個(gè)黑色矩形的起始坐標(biāo)[9]。
區(qū)域投影計(jì)算流程如圖9所示。
以對底部黑色矩形區(qū)域的處理為例,根據(jù)模板匹配得到的整體定位錨點(diǎn)坐標(biāo),對底部黑色矩形區(qū)域進(jìn)行裁剪。
為了方便計(jì)算像素灰度值,須將圖片處理成只有零(黑色)和非零值(白色),可以通過圖像二值化的方法實(shí)現(xiàn)。圖像二值化就是將圖像上的像素點(diǎn)的灰度值設(shè)置為兩個(gè)值,一般為0,255或者指定的某個(gè)值,這樣將使整個(gè)圖像呈現(xiàn)出明顯的黑白效果,從而能凸顯出目標(biāo)的輪廓[10]。
OpenCV提供了countNonZero函數(shù)獲取非零像素點(diǎn)數(shù),而需要進(jìn)行識(shí)別的是黑色矩形(灰度值為0),所以先將圖像使用大津法OTSU進(jìn)行二值化,凸顯黑色矩形區(qū)域。
再將圖像用反二進(jìn)制閾值法THRESH BINARY INV進(jìn)行二值化,達(dá)到置目標(biāo)區(qū)域灰度值非零,效果如圖10所示。
對二值化處理后的圖像以列為單位進(jìn)行遍歷,通過count-NonZero得出每一列的非零像素點(diǎn)數(shù),并按順序記錄到容器,然后遍歷容器里的數(shù)據(jù),相鄰兩個(gè)數(shù)據(jù)做比較,設(shè)差異閾值為10,如兩個(gè)數(shù)據(jù)存在差異,則視此處為邊界,并記錄數(shù)據(jù)。
實(shí)現(xiàn)投影計(jì)算的主要偽代碼為[9]:
void getBordLocation (Mat源圖片,vector&上沿坐標(biāo)容器,vector&下沿坐標(biāo)容器,int排列類型,int間距值)
{
Mat原圖片←源圖片.clone();
vector像素值記錄容器;
int干擾線條最大寬度←10;//線條寬度影響
if0==排列類型then
{
fori一0to原圖片列數(shù)
(
Mat單列數(shù)據(jù)←原圖片.col(i);
int非零像素?cái)?shù)量←countNonZero(單列數(shù)據(jù));
像素值記錄容器.push_back(非零像素?cái)?shù)量);
)
)
else f
fori←0to原圖片行數(shù)
{
Mat單行數(shù)據(jù)←原圖片.row(i);
int非零像素?cái)?shù)量←countNonZero(單行數(shù)據(jù));
像素值記錄容器.push_back(非零像素?cái)?shù)量);
)
}
//整形,去除長度小于gap的零的空洞
if像素值記錄容器.size0<=間距值then retum;
for i←0 to像素值記錄容器.size0 間距值
{if像素值記錄容器[i]>=干擾線條最大寬度&&像素值記錄容器[i+間距值】>=干擾線條最大寬度then
{
f'or j ←i to i+間距值
{
像素值記錄容器[i]=干擾線條最大寬度;
}
i=i+間距值-1;
)
}
//記錄上下沿
for i←1 to像素值記錄容器.size0
{
if(像素值記錄容器[i一1]<干擾線條最大寬度&&像素值記錄容器[i]>=干擾線條最大寬度)
上沿坐標(biāo)容器.push_back(i);
if(像素值記錄容器[i一1]>=干擾線條最大寬度&&像素值記錄容器[i]<干擾線條最大寬度)
下沿坐標(biāo)容器.push_back(i);)
if上沿坐標(biāo)容器.size0<下沿坐標(biāo)容器.sizeo then
上沿坐標(biāo)容器.insert(上沿坐標(biāo)容器.begin0,0);
}
)
4.2.4比較閾值判斷是否填涂
經(jīng)過對圖片的一系列處理以及錨點(diǎn)坐標(biāo)的獲取,可以找到選項(xiàng)所在的區(qū)域,并判斷是否填涂。要從答題卡獲得的有學(xué)號(hào)信息和作答信息,在進(jìn)行判斷之前先把透視變換后的圖片二值化,然后對圖像進(jìn)行膨脹和腐蝕,可以更進(jìn)一步降噪,凸顯目標(biāo)區(qū)域[10]。如圖11所示。
對于判斷是否填涂所用閾值,規(guī)定填涂區(qū)域大于黑色矩形尺寸的1/4時(shí)即視為填涂。
5 系統(tǒng)測試
軟件開發(fā)過程中對軟件進(jìn)行測試是必要的,在軟件開發(fā)過程中需要進(jìn)行多次測試,查明系統(tǒng)中的bug,然后分析和解決問題,以便最大限度地改善軟件。
5.1答題卡模板生成測試
在答題卡模板的生成中,影響題目排序的關(guān)鍵數(shù)據(jù)是單選題數(shù)量、單選題選項(xiàng)數(shù)量、多選題數(shù)量、多選題選項(xiàng)數(shù)量、判斷題數(shù)量,在不計(jì)較其他輸入的情況下用表1的數(shù)據(jù)進(jìn)行答題卡模板生成測試。測試效果顯示,答題卡模板生成結(jié)果與理論預(yù)測結(jié)果一致。
5.2 答題卡識(shí)別測試
本系統(tǒng)總共進(jìn)行了46次答題卡識(shí)別的實(shí)驗(yàn),其中有37次完全識(shí)別;5次遺漏識(shí)別,原因是填涂模糊;4次無法識(shí)別,原因是照片陰影太重;0次誤判識(shí)別,識(shí)別率80.4%。答題卡識(shí)別完成后會(huì)給出分析結(jié)果,可以根據(jù)設(shè)置的數(shù)據(jù)來驗(yàn)證結(jié)果是否正確,在此列舉其中一次試驗(yàn)結(jié)果。
表2是測試答題卡預(yù)測結(jié)果數(shù)據(jù),圖12(a)是答題卡,圖12(b)是答題卡識(shí)別效果,圖13是答題卡識(shí)別分析結(jié)果圖,其顯示結(jié)果與表2測試答題卡預(yù)測結(jié)果數(shù)據(jù)表的相應(yīng)數(shù)據(jù)完全一致,且在識(shí)別過程中對填涂區(qū)域的識(shí)別也非常準(zhǔn)確。
6 結(jié)束語
本系統(tǒng)實(shí)現(xiàn)了用戶自定義生成答題卡Word模板,通過對圖片的一系列處理來識(shí)別答題卡,并對識(shí)別結(jié)果進(jìn)行統(tǒng)計(jì)分析。由于是以拍照的形式獲取答題卡圖片,所以照片的完整性、清晰度越高,識(shí)別的準(zhǔn)確率就越高。因此,在答題卡損壞、模糊的情況下,識(shí)別結(jié)果出錯(cuò)是難以避免的。拋開這些因素,系統(tǒng)生成答題卡方便,可以識(shí)別答題卡以及分析考試情況,能夠極大程度上提高工作效率和準(zhǔn)確率。
參考文獻(xiàn):
[1]孟超.網(wǎng)上閱卷系統(tǒng)中答題卡模板自動(dòng)生成技術(shù)研究[D].長沙:湖南師范大學(xué),2013.
[2]張站,劉政怡,吳建國,等.基于圖像識(shí)別的閱卷系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2011,30(4):44-47.
[3] Laghrib A,Ezzaki M,El Rhabi M,et aI.Simultaneous deconvolu-tion and denoising using a second order variational approachapplied to image super resolution[J].Computer Vision and Im-age Understanding,2018,168:50-63.
[4]陳博華,戴少鵬.基于OpenCV的圖像處理方法[J].電子技術(shù)與軟件工程,2015(19):125.
[5]李華琛,基于opencv圖像邊緣檢測技術(shù)[J].數(shù)字技術(shù)與應(yīng)用,2016(11):40,42.
[6]唐良,何偉,秦波,等.一種基于OpenCV和MFC的圖像輸出方法[J].懷化學(xué)院學(xué)報(bào),2018,37(5):61-65.
[7]劉培軍,馬明棟,王得玉.基于OpenCV圖像處理系統(tǒng)的開發(fā)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2019,29(3):127-131.
[8]軟件開發(fā)技術(shù)聯(lián)盟.visuaIC++開發(fā)實(shí)例大全(基礎(chǔ)卷)[M].北京:清華大學(xué)出版社,2016_
[9]軟件開發(fā)技術(shù)聯(lián)盟.Visual C++開發(fā)實(shí)例大全(提高卷)[M],北京:清華大學(xué)出版社,2016.
[10]望熙榮,望熙貴.OpenCV和Visual Studio圖像識(shí)別應(yīng)用開發(fā)[M].李強(qiáng),譯.北京:人民郵電出版社.2017.
【通聯(lián)編輯:謝媛媛】
作者簡介:韋溢輝(1996-),學(xué)士,主要研究方向?yàn)檐浖_發(fā);劉漢英,高級(jí)實(shí)驗(yàn)師,碩士,主要研究方向?yàn)閿?shù)字圖像處理。