胡俐蕊,吳建國
(1.安徽大學 計算智能與信號處理教育部重點實驗室,安徽 合肥230039;2.南通大學計算機科學與技術學院,江蘇 南通226019;3.安徽大學 計算機科學與技術學院,安徽 合肥230039)
選舉會議中大量采用計算機進行信息處理。近年來,隨著光學字符識別(optical character recognition,OCR)技術的發展,投票軟件系統也取得了較大進展。強調從工程的觀點出發來完整地實現一個投票系統,該系統要滿足各項苛刻要求[1];給出了基于OCR的網絡投票系統架構[2];指出了采用紙質選票進行投票還是比較成功的,尤其能夠較好地控制錯誤率[3];對CCD獲取的低對比度圖像也能很好地處理[4]。但是,OCR在紙質選票圖像識別中還存在一些問題[5]。為了進一步提高識別的準確性和快速度,出現了使用不同的選票版面理解算法的OCR投票系統[6-9],以及利用表格和應用系統自身的特點,而提出的“確定有效識別區域,比較深色像素數目”的方法[10],都取得了較好的效果。這些系統在機械裝置、紙張質量、選票制作等方面的要求大大降低,處理速度也大大加快,對選票的要求進一步降低。但是,對于前者,當選票版面較復雜、表格域數量較多、表格圖像表格線斷裂較嚴重時,提取表格域所耗時間也會較多,不利于快速性的要求,降低了系統的性能,選票的使用范圍受到較大的限制;對于后者,選票版面基本上是不變的。與一些只適用于中小型規模的投票系統[11-12]不同,本系統是在研究現有較先進的電子投票系統[13-14]基礎上開發出來的適用于較大規模的網絡投票系統。該系統的硬、軟件全部獨立設計,具有國家發明專利2項(基于圖像符號識別的電子票箱,專利號:CN1815510[15];一種矩形碼編碼方法及基于該方法的矩形碼,專利號:CN1437157)。由于主機端軟件中的選票設計功能強大,使得票箱端圖像識別軟件獨特快速,而選票本身仍然信息豐富,能適應更廣泛的需求。主機軟件在整個系統中功不可沒,它采用Visual C++開發。
系統由主機、票箱、人工錄入終端三部分組成,多個票箱、多個錄入終端通過局域網與主機連接通信,其拓撲結構如圖1所示。主機、每個票箱、每個錄入終端都是一個計算機系統,整個系統的軟件就由主機端軟件、票箱端軟件、錄入終端軟件3部分組成。

圖1 系統的拓撲結構
投票前,主機端將本次選舉的有關數據和多種選票的選票格式數據下傳到各個票箱,票箱端設置每種選票的應到會議人數、實到會議人數、已發出的選票數。
投票時,一方面,票箱識別每張選票,將候選人得票的識別結果寫入到候選人得票結果數據中;同時,選票中如果有另選他人,就還要對另選他人的姓名進行截圖,并獲得該另選人得票的識別結果,并將它寫入手寫姓名圖片的數據結構中;此時應該注意,由于還不知道另選人姓名,只能通過該手寫姓名圖片來記錄另選人的得票結果。然后,再進行選票有效性的判斷:如果選票是單頁選票,就根據選舉規則立即進行選票有效性分析;如果選票是多頁選票,就要等多頁選票投完或者投票人投完所持選票,再進行選票有效性分析;并按選舉項更新已投選票數、有效選票數、無效選票數數據。最后,如果該選票中選舉項的投票是有效的,就將以上所述的相關數據(候選人得票結果、另選人的姓名截圖圖片、手寫姓名圖片數據、已投選票數、有效選票數、無效選票數等數據)上傳給主機;否則,就只上傳已投選票數、有效選票數、無效選票數等相關數據,并刪除候選人得票結果、另選他人的姓名截圖以及手寫姓名圖片數據鏈表中記錄的數據節點。另一方面,主機按照此次選舉的選票種類總數和人工錄入終端總數,盡量平均分配選票種類給人工錄入終端,即將該選票種類的另選他人姓名截圖和該圖的得票結果等數據發送給相應的錄入終端,在錄入終端進行人工判斷姓名并錄入,每隔兩分鐘,錄入終端將錄入和統計的另選他人得票結果數據發回給主機。
投票后,主機可立即得出各選舉項的候選人計票結果,并根據選舉規則統計當選結果,若有,輸出顯示并打印;若無,輸出提示,進行二次選舉。
主機軟件是本系統中最重要的部分。它涉及選舉信息、選票設計、選舉計票和統計等方面,并且要與票箱、錄入終端進行大量數據交互,考慮到軟件的通用性,數據存儲采用文件形式,這使得軟件必須很好地定義數據結構,才可能做好數據驅動及處理工作。該軟件結構如圖2所示。下面主要介紹選舉信息、選票、選舉、統計四大模塊。

圖2 主機軟件結構
本軟件充分考慮選舉要求,用選票種類來組織相關數據。該模塊采取目錄樹進行導航,樹的根節點是選舉會議,以下節點層次依次是選票種類、選舉項、候選人,如果候選人分類別,就在候選人節點下產生相應類別數的候選人類別節點。
選舉會議節點設置會議名稱和選票種類總數。
選票種類節點設置選舉項總數。
選舉項節點設置選舉項名稱、該選舉項的候選人是否分類別及類別數、以及相關名稱、填寫欄、另選統計規則。其中,特別要注意填寫欄設置,從實際選票的填寫欄個數來看,可將填寫欄分為1欄和2欄兩種情況,填寫符號為√、○、×、\、—、∕或不填。
候選人節點設置候選人總數、應選人總數、選票中另選人總數、選票總數、最低當選票數、填寫說明。如果候選人不分類別,還要在此錄入候選人姓名、設置候選人排序方式。如果候選人分類別,就在候選人類別節點設置每個類別的候選人類別名稱、候選人數、另選人數、選票中另選人數、填寫說明;錄入候選人姓名、設置候選人排序方式。此時,候選人節點設置的相關總數就是各類別對應數據之和。
具體到每個候選人數據結構,它包括選票種類序號、選舉項序號、候選人類別序號、候選人序號、候選人姓名、同意票數、反對票數、棄權票數、是否當選幾個方面。
本模塊的軟件界面如圖3所示,其中圖的右邊就是單擊目錄樹的選舉項節點的設置情況。

圖3 選舉信息模塊界面
本軟件的最大特點就是:在一次選舉中,允許有多種選票,每種選票可以有多個選舉項,每個選舉項下可以有多個候選人類別。顯然,這更能滿足用戶的需求。但這個多種選票、多個選舉項、多個候選人類別卻大大增加了軟件的設計和實現難度。因為這里的數據與后面的選票、選舉、統計、查詢等諸環節直接相關,所以如何組織好這些數據對系統的實現尤為重要。為此,在定義數據結構時,通過引入相關序號來解決。比如:選舉項數據結構中就有選票種類序號、選舉項序號;候選人類別數據結構中就有選票種類序號、選舉項序號、候選人類別序號。這樣,不僅解決了選票種類、選舉項、候選人、候選人類別之間的層次關系,而且在每個具體的候選人數據、今后的選票數據、選舉數據、統計報表數據、另選人數據等都可以利用序號來解決其對應關系。有了這種對應關系,編程實現算法也就總體上確定下來了,而且這樣組織數據,其邏輯關系非常清晰,實現起來不易出錯、簡潔明了。由于本系統采用文件記錄數據,而文件涉及選舉信息、選票、選舉過程、統計報表等大量數據,編寫文件驅動程序也是一大塊內容,而有了序號,實現起來,就方便多了。
考慮到實際選票的多樣性和不確定性,本軟件的選票設計非常有特色,而且功能強大。它的設計為今后票箱中的圖像識別打下堅實的基礎。這里的每種選票就對應了選舉信息中的選票種類,并且選票支持單頁選票和多頁選票,但多頁選票只有一個選舉項。在具體設計每頁選票時,首先對該頁面的所有數據信息進行分析并將其進行分解組合,可構成一個以選舉會議為根節點的目錄樹。一次選舉會議可以由多個選票構成、選票作為根節點的下一層節點,選票可以是單頁選票也可以是多頁選票、它構成選票的下一層節點,每頁選票由標題、選舉項、其它(用戶需要說明的內容)組成、它們構成選票頁的下一層節點,選舉項有選舉項標題、候選人表格、另選人表格(如果有的話)、填寫說明組成,它們構成選舉項的下一層節點,候選人表格或另選人表格都是由表頭和表體組成、它們構成候選人表格或另選人表格的下一層節點。然后分別定義選票、頁、會標、選票標題總數、選票標題、選舉項、選舉項標題總數、選舉項標題、候選人表格、候選人表格表頭、候選人表格表體、候選人表格表體中各行的列數、另選人表格、另選人表格表頭、另選人表格表體、另選人表格表體中各行的列數、填寫說明標題、填寫說明數據結構。在定義這些數據結構時,不僅要注意紙張大小、頁邊距、水平位置、垂直位置、表頭欄高、表頭列數、填寫欄數、表體行高、表體行數等詳細信息,而且同樣要引入相關序號,來解決其對應關系。比如以下數據結構:
選票:選票序號,選舉項總數,頁總數。
選舉項:選票序號,頁序號,選舉項序號,候選人表格數,另選人表格數。
候選人表格:選票序號,頁序號,選舉項序號,候選人表格序號,表格位置(居左,居中,居右),表格水平偏移,表格垂直位置,表格邊框線寬,表格邊框線顏色,表格線寬,表格線顏色,表格間隔線顏色,表格間隔線寬。
候選人表格表頭:選票序號,頁序號,選舉項序號,候選人表格序號,欄高,表頭列數,填寫欄數(1欄,2欄),填寫欄寬,填寫欄文字方向,填寫欄字數,填寫欄填寫字體,填寫欄填寫字體顏色,填寫欄字符位置(居左,居中,居右),候選人欄文字方向,候選人欄寬,候選人欄字數,候選人欄字體,候選人欄字體顏色,候選人欄字符位置(居左,居中,居右)。
候選人表格表體:選票序號,頁序號,選舉項序號,候選人表格序號,行數,行高,候選人姓名文字方向,候選人姓名排版方向(橫向,縱向),候選人姓名字體,候選人姓名字體顏色,候選人姓名位置(居左,居中,居右)。
候選人表格表體中各行的列數:選票序號,頁序號,選舉項序號,候選人表格序號,候選人表格表體中行序號,該行的列數。
由于其它數據結構也可照此思路定義,在此不再一一列舉。
定義好數據結構后,就可以通過一系列對話框來設置這些數據,同時進行可視化繪圖,并將該頁選票的設置數據全部記錄在文件中,其中一些數據在票箱的選票圖像識別中起到重要作用。換句話說,可以利用這些數據,對選票圖像中要識別的符號、手寫姓名所在位置進行定位。軟件界面如圖4所示,其中對話框中的數據設置是基于表頭數據結構的。

圖4 選票設計界面
考慮到選票設計有如此多的細節,因此系統提供了模板設計。用戶可以自行設計選票模板,系統本身也提供了豐富的選票模板。用戶只要在當前選票設計中添加選票模板,系統利用序號的對應關系,找到選舉信息錄入的相關數據(比如:填寫欄設置、候選人姓名等),即可生成當前選票。不滿意,還可以在可視化的界面中進行修改。最后,軟件在選票頁的底邊距內的固定位置還要添加選票種類序號、該種類的頁碼兩個矩形碼。這樣做主要是由于在選票圖像識別時,首先要確定這張選票是哪一個選票種類的哪一頁,然后才能進行圖像識別和截圖操作,并將結果寫到對應的數據中。
選票設計完成后,可直接打印出選票,用于選舉。
由此可見,在選票實現中,不僅能很好地組織起這些數據,而且能與選舉信息的設置達到完整的統一,算法結構清晰、不易出錯。繪圖采用VC的雙緩沖繪圖機制,視覺效果非常好,用戶使用起來非常直觀。當用戶做完本次選舉的模板設計后,還可以直接用于下一次選舉,生成當前選票,使用起來更為方便。
該模塊主要完成選舉過程的數據通信、處理等相關操作。數據通信采用基于Windows Sockets和串行化數據傳輸來實現。模塊功能主要包括選舉清零和選舉計票兩部分。
選舉清零:選舉前,各個票箱通過網絡連接到主機,主機對這些票箱發出清零命令,票箱接收到命令后,清除本機原來的所有數據,然后發回信息給主機,主機查看到票箱已完成清零操作后,就可以選擇本次選舉所需的選票種類數據發送給選定的票箱,該選票種類數據包括:該票箱選舉過程的相關總數數據(由于票箱中途故障已上傳到主機的數據,比如:已投選票數、有效選票數、無效選票數等)、候選人得票結果數據(初始化為零)、選票格式數據(選票設計時,記錄下的數據)。票箱接收完這些數據后,就可以進入正式投票了。軟件界面如圖5所示。

圖5 選舉清零界面
選舉計票:一方面,主機接收各個票箱傳來的候選人得票結果、相關總數、另選人姓名截圖、另選人得票結果數據,更新、記錄相關數據并顯示其中一些數據。另一方面,主機還要與人工錄入終端進行數據交互:主機傳送另選人姓名截圖、得票結果以及選舉信息中的相關信息給錄入終端,終端完成另選人姓名的人工錄入,并每隔兩分鐘統計一次,將另選人的得票結果數據發回給主機。主機接收數據后,更新另選人的得票結果并顯示。軟件界面如圖6所示。

圖6 選舉計票界面
該模塊主要有3個特點:
(1)能夠實時保存票箱端和錄入終端的相關數據。為了實現這一功能,需要定義完整的數據結構。
主機端:
票箱相關總數:票箱IP地址,票箱名稱,選票種類序號,選舉項序號,應到會議人數,實到會議人數,已發出的選票總數,已收回的選票總數,已投票總數,有效票總數,無效票總數。
票箱選舉結果:票箱IP地址,票箱名稱,選票種類序號,候選人總數,候選人得票結果。
這兩個數據結構用來記錄票箱的投票情況。
在上面的“票箱相關總數”數據結構中去掉“票箱IP地址”和“票箱名稱”,剩下的項目就構成總的“相關總數”數據結構。解析“票箱選舉結果”數據,可得到具體候選人的得票結果。
票箱手寫姓名圖片數據總數:票箱IP地址,票箱名稱,選票種類序號,選舉項序號,候選人類別序號,手寫姓名圖片的總數。
票箱手寫姓名圖片數據:票箱IP地址,票箱名稱,選票種類序號,選舉項序號,候選人類別序號,手寫姓名圖片序號,手寫姓名的得票結果,手寫姓名圖片名稱。
同樣,這兩個數據結構用來記錄票箱的另選人截圖情況。分別去掉“票箱IP地址”和“票箱名稱”,剩下的項目就構成總的“手寫姓名圖片數據總數”和總的“手寫姓名圖片數據”數據結構。
錄入終端另選人:錄入終端IP地址,錄入終端名稱,選票種類序號,選舉項序號,候選人類別序號,另選人序號,另選人姓名,同意票數,反對票數,棄權票數,是否當選。
錄入終端手寫姓名圖片數據:錄入終端IP地址,錄入終端名稱,選票種類序號,選舉項序號,候選人類別序號,手寫姓名圖片序號,手寫姓名的得票結果,手寫姓名圖片名稱。
同樣,這兩個數據結構用來記錄錄入終端的另選人錄入情況。在“錄入終端另選人”數據結構中去掉“錄入終端IP地址”和“錄入終端名稱”,剩下的項目就構成總的“另選人”數據結構。
利用這些數據結構,就可以記錄票箱端和錄入終端的相關數據,并可以得到候選人和另選人的得票結果和相關總數。
顯然,在票箱端和錄入終端,只要定義上述數據結構其中一部分即可。
(2)有效地獲得了另選人的得票結果。利用上述數據結構記錄的相關信息,就可以得到另選人的得票結果。具體方法是:在票箱端,充分利用選票中另選人姓名和填寫欄所在的位置,記錄下姓名截圖和對應的得票結果數據,把二者聯系起來,再同時可以確定姓名截圖這個數據是屬于哪一個選票種類的哪一個選舉項的另選人。如果候選人分類,就還可以進一步確定它是屬于哪一個類別。主機獲得這些數據后,將它們發送到人工錄入終端,由錄入終端人工識別錄入姓名,再傳回給主機。
(3)采用串行化數據傳輸,大大減小了網絡編程的工作量。由于本系統的數據量大、數據類型多,利用串行化數據傳輸,只要注意發送和接收一一對應即可,而不必考慮數據類型的轉化問題,編程效率大大提高,這特別適合本系統。
在整個選舉過程中,各票箱、錄入終端的相關數據都即時更新,同時還被上傳到主機中。也就是說,主機保存了各票箱和各錄入終端的相關數據,一旦票箱或終端發生故障,原來已有的數據信息均可恢復,繼續進行選舉活動。另一方面,每個票箱都保存了原始的選票圖像,投票結束后,將它們傳送給主機,供查找、核對、解疑。
統計主要考慮計票結果、當選結果以及查詢3部分。統計結果是按選舉項進行統計。這里的關鍵是生成報表。報表的設計界面與選票設計界面十分相似,也是采用目錄樹進行導航。對于計票結果,該樹的根節點為報表,下一層節點為單頁(或多頁時的第幾頁),頁節點的下一層節點為標題、正文、選舉項、其它,其中選舉項節點的下一層節點為候選人表格、另選人表格(當有多個候選人類別時,就有多個候選人表格和另選人表格),候選人表格(另選人表格)節點的下一層節點為表頭、表體。然后,詳細定義以上各節點的數據結構(與選票設計定義數據結構的思路類似)。有了這些數據結構,再從選舉信息中提取候選人和另選人的得票結果、排序方式以及投票的相關總數等數據,分析這些數據,編寫算法,就可以初始化它們的值,從而自動生成報表。對于當選結果,只需用到目錄樹的根節點、頁節點和第三層的標題、正文、其它節點,再利用當選結果、排序方式等數據,即可自動生成報表。用戶利用報表設計界面,可重新設置數據和添加數據。修改、添加數據時,報表的變化情況都會在視圖中即時被看到。顯然,這樣能很好地滿足用戶的需求。
報表制作完后,可立即打印。同時,系統還保存了所有的數據,方便今后的查詢、打印。
該軟件充分考慮用戶需求,支持差額選舉、等額選舉、二次選舉;選舉信息全面;選票設計功能強大,版面可以較復雜,并且可直接打印;選票填寫十分方便,填寫用筆幾乎沒有限制;選票種類總數不受限制(如果計算機內存、硬盤足夠大),一次選舉可使用多種選票;報表自動生成且可編輯;用戶界面簡潔明了;全面實現與票箱和錄入終端數據通信及相關處理;數據考慮全面,還具有票箱和錄入終端的數據恢復功能;利用選票制作的相關數據,設計的票箱端識別軟件運行速度更快。這一系列特點使得基于該主機軟件的選舉投票系統的適用范圍更加廣泛。
[1]Bertrand Haas.Engineering better voting systems[C].New York,USA:Proceedings of the ACM Symposium on Document Engineering,2006:56-58.
[2]Goirizelaia I,Huarte M,Unzilla J,et al.An optical scan e-voting system based on N-version programming[J].IEEE Security and Privacy,2008,6(3):47-53.
[3]Sarah P Everett,Kristen K Greene,Michael D Byrne,et al.Electronic voting machines versus traditional methods:Improved preference,similar performance[C].New York,USA:Proceeding of the Twenty-Sixth Annual SIGCHI Conference on Human Factors in Computing Systems,2008:883-892.
[4]Marosi I.OCR voting methods for recognizing low contrast printed documents[C].Lyon,France:Proceedings of the Second International Conference on Document Image Analysis for Libraries,2006:111-115.
[5]Daniel Lopresti,George Nagy,Elisa Barney Smith.Document analysis issues in reading optical scan ballots[C].New York,USA:Proceedings of the 9th IAPR International Workshop on Document Analysis Systems,2010:105-112.
[6]XIAO Gang,LIU Hai-ping,CHEN Jiu-jun,et al.Understanding algorithm of ballot layout structure based on undirected graph[J].Computer Engineering,2008,34(18):223-225(in Chinese).[肖剛,劉海萍,陳久軍,等.基于無向圖的選票版面結構理解算法[J].計算機工程,2008,34(18):223-225.]
[7]XIAO Gang,LU Jia-wei,CHEN Jiu-jun,et al.A method of fast recognition and statistic based on understanding of ballot layout and system[P].China:CN101447017,2009-06-03(in Chinese).[肖剛,陸佳煒,陳久軍,等.一種基于版面分析的選票快速識別統計方法及系統[P].中國:CN101447017,2009-06-03.]
[8]SHEN Jun-qiang,XIAO Gang,GAO Fei,et al.Recognition of ballot image’s geometry structure based on run-length of table line[J].Computer Engineering,2009,35(17):187-189(in Chinese).[沈軍強,肖剛,高飛,等.基于表格線游程的選票圖像幾何結構識別[J].計算機工程,2009,35(17):187-189.]
[9]SHEN Jun-qiang.Research on layout understanding and fast recognition of ballot image[D].Hangzhou,China:Zhejiang University of Technology,2009(in Chinese).[沈軍強.選票圖像的版面理解和快速識別方法研究[D].杭州:浙江工業大學,2009.]
[10]YAN Hui,WANG Jin-suo,FEI Jiang-tao.Design and implementation of cadre evaluation system based on image recognition[J].Computer Engineering and Design,2009,30(15):3684-3686(in Chinese).[閻慧,王金鎖,費江濤.基于圖像識別的干部測評系統的設計與實現[J].計算機工程與設計,2009,30(15):3684-3686.]
[11]FAN Min.A fast method of ballot statistic[J].Statistics and Decision,2006(11):144-146(in Chinese).[范敏.選票統計的一種快捷方法[J].統計與決策,2006(11):144-146.]
[12]HUANG Jie-zhen,CHEN Da-cheng,ZHU Xuan.Development and implementation of programming of vote counting based on visual basic[J].Guangdong Science and Technology,2011(10):53-55(in Chinese).[黃潔貞,陳達成,朱璇.基于VB的投票計票程序的開發與實現[J].廣東科技,2011(10):53-55.]
[13]WANG Hu.Research of OMR and vote processing system based on image recognition[D].Hefei:Anhui University,2006(in Chinese).[王虎.基于圖像識別的標記閱讀機及選舉計票系統研究[D].合肥:安徽大學,2006.]
[14]Ghassan Z Qadah,Rani Taha.Electronic voting systems:Requirements,design,and implementation[J].Computer Standards &Interfaces,2007(29):376-386.
[15] WU Jian-guo,LIU Su-nan,XIA Cheng-bao,et al.Electronic ballot box based on image character recognition[P].China:CN2874635,2007-02-28(in Chinese).[吳建國,劉蘇南,夏承寶,等.基于圖像符號識別的電子票箱[P].中國:CN2874635,2007-02-28.]