胡俐蕊,吴建国
(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.]