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