基于COM组件的银行电子验印系统解决方案
来源:ChinaByte 更新时间:2012-04-15

  印鉴是银行多种业务的重要凭证和依据,其法律基础是1996年颁布实施的《中华人民共和国票据法》。电子验印就是利用计算机来实现印鉴的自动识别。现行的一些电子验印系统在可重用性、兼容性、扩展性和客户化等方面存在一定的缺陷。本文给出了一种新颖的基于COM组件的银行电子验印系统解决方案。

  一、电子验印的基本原理

  电子验印是模式识别和图像处理技术的一个典型应用。在银行的计算机系统里面,应用得最多的当然是数据库技术和计算机网络技术。那么,图像处理和模式识别技术是另外一类计算机技术,其应用虽然不是主流,但仍然占有一席之地。

  电子验印的基本流程是:通过摄像机、数码相机或扫描仪等图像采集设备,将客户的预留印鉴图像采集到计算机里面,经过特定的图像处理算法形成电子标准印鉴。电子标准印鉴一般具有含结构信息、高保真和低存储空间(几个kByte/枚)等特点。这些特点为预留印鉴的大规模数字化存储和低代价的网络传递提供了必要条件。印鉴核验时,待测印鉴通过图像采集设备被采集入计算机,同时,计算机调出相应的电子标准印鉴。经过预处理、定位、分割、配准和比对等图像处理算法,计算机自动给出待测印鉴真伪的结论。如果读者想对电子验印有一个感性的认识,可以从bankseal.51.com得到一个演示。

  二、电子验印的必要性

  传统的印鉴比对方式是人工折角核对,其最大的两个弱点是:1、精度低;2、无法实现通存通兑。特别是后一个弱点,成为制约银行业务发展的一个瓶颈。最近,依照世界各国的通行做法,中国人民银行推出了全国支票影像交换系统的概念。其基本原理就是:运用计算机影像技术将实物支票转换为支票影像信息,通过网络将支票影像信息传递到出票人开户银行提示付款的业务处理系统,从而实现支票的全国通用。在全国支票影像交换系统中,提入行拿到的是支票的电子影像,基本上无法进行人工折角核对。因此,人工折角核对逐步退出历史舞台已成定局。

  三、COM组件的基本原理

  组件是一种特殊的基础软件。其它应用软件通过调用组件,而形成功能更加强大的软件。因此,组件不能独立地面向最终用户,就像普通的消费者拿着集成电路芯片没什么用一样。

  COM组件是一种应用广泛的组件。COM(组件对象模型)是Microsoft公司为了解决软件开发的低效率问题,提出的一种规范,是面向对象(OOP)技术的一种发展。组件技术大大地改变软件市场的格局。一些专门进行核心技术开发的开发商,将其产品以组件的形式供给市场,而一些应用软件开发商,调用多家公司组件来实现其软件功能。

  随着信息技术普及,软件用户的需求也越来越高。一般来说,软件用户的需求体现在两个方面:一是更加智能化、功能更全,因为随着林林总总的软件不断涌现,软件用户的眼界越来越高。这个需求对于软件开发企业来说是一个挑战,而任何软件企业研发力量都是有限的,各有其专攻方向,不可能做到样样专业齐全。二是快速开发,市场的情况千变万化,商机稍纵即逝,市场需要的东西一般都很急。因此,快速开发成为了软件企业生存的必要本领。从技术层面上来看,组件技术的出现是为了解决上述两个问题。组件相当于电子行业里面的通用集成电路芯片,相当于机械行业里面的通用件。各软件企业根据自身的专业特长,将所开发的软件以组件的形式,提供给市场;专攻集成的软件企业将这些组件拼装起来做成软件,提供给最终客户,从而满足客户需求。静态图像处理组件RSImage就是一种COM组件。

  四、基于COM组件的电子验印系统

  下面,我们提出一种基于COM组件的电子验印系统的解决方案。该方案以静态图像处理组件RSImage、通用扫描软件RSTWAINCOM和信息安全组件RSSecurityCOM为基石。这些组件均为基于Windows系列操作系统的COM组件,可以被VC、C#、VB、JAVA、DEPHI、PowerBuilder等高级语言调用。

  RSImage里面集成了静态图像的各种处理,与通用型的图像处理软件不同的是,RSImage更加面向具体应用,面向银行电子验印系统的各项需求,包含印鉴采集、去底、寻找、配准、图像变换、印鉴识别、票据图像压缩和票据缩微等等。

  RSTWAINCOM主要功能是TWAIN接口。图像采集设备的生产厂商一般会遵循TWAIN国际标准,这样使得驱动开发更加通用化。通过调用RSTWAINCOM,用户的应用程序可以驱动和控制,符合TWAIN接口规范的,各种类型的平板扫描仪、高速扫描仪、票据清分机、数码相机等,图像获取类的外围设备。

  RSSecurityCOM集成了信息安全技术的各种算法,例如:DES、3重DES、AES、RSA、数字签名、支付密码等等。

  下面,我们以VB.Net 2003调用组件为例介绍组件的简单使用过程。在Form1中加入

  Dim rsImageInVB As RSImage.SealCardClass

  Dim myScan As New RSTWAINCOM.RSTwainClass

  这样我们就定义了一个名为rsImageInVB的组件对象。在Form1里面用"rsImageInVB.函数名"的方式来调用组件RSImage的函数。定义了一个名为myScan的组件对象。在Form1里面用"myScan.函数名"的方式来调用组件RSTWAINCOM的函数。

下面介绍RSImage组件的一些主要接口函数:

  1、初始化对象,包括存储图像的数组和预留印鉴对象等

  BOOL InitializeObject(unsigned int nIMAXOfCard,unsigned int nJMAXOfCard,unsigned int nIMAXOfSeal,unsigned int nJMAXOfSeal,unsigned int nMaxNumOfSeals)

  参数: nIMAXOfCard为印鉴卡的i轴方向最大尺寸,即最大宽度,以象素为单位。在这里印鉴卡(sealcard)是一个广泛的概念,我们将盖有一枚或者几枚印鉴的单页纸称为印鉴卡(sealcard)。在印鉴采集阶段,印鉴卡就是预留印鉴卡;在银行电子验印的场合印鉴卡就是现金支票、转帐支票、汇票等票据;在OA场合可以是盖有印鉴的公文、合同等。 nIMAXOfCard以及以下四个参数的设置应该根据具体的应用尽可能的适中,太大则浪费内存资源、降低运行效率;太小则可能造成溢出。如果选用普通摄像头做为图像采集设备,那么参数应该选得小一些;如果选用高清晰度数码相机或者扫描仪做为图像采集设备,那么参数应该选得大一些。nJMAXOfCard 为印鉴卡的j轴方向最大尺寸,即最大高度,以象素为单位。nIMAXOfSeal 为印鉴的i轴方向最大尺寸,即最大宽度,以象素为单位。该尺寸不能大于IMAXOfCard。nJMAXOfCard 为印鉴的j轴方向最大尺寸,即最大高度,以象素为单位。该尺寸不能大于JMAXOfCard。nMaxNumOfSeals 为每张印鉴卡所容许的最大印鉴数目。这个数目不超过10。

  2、将DIB分离为RGB通道图象数组

  BOOL SetRGBArray(unsigned int nDib)

  参数:nDib为包含扫描图象的DC指针

  3、同时提取两枚印鉴。

  将两枚印鉴从预留印鉴卡上提取出来,保存在对象m_pSeal[0]和m_pSeal[1]准备做电子标准印鉴保留。(void DistillDblSealModel)

  4、将预留印鉴写入电子标准印鉴文件。

  BOOL WriteSealFile(unsigned int nWhichSeal,BSTR *pbstrFileName)

  参数:nWhichSeal为预留印鉴序号;pbstrFileName 为印鉴文件名。

  5、通过电子标准印鉴文件,加载预留印鉴。

  BOOL LoadSealFile(unsigned int nWhichSeal,BSTR *pbstrFileName)

  参数:nWhichSeal为预留印鉴序号;pbstrFileName 为印鉴文件名的指针。

  6、识别单枚印鉴。

  依据预留印鉴序号,将保存在预留印鉴对象里面的预留印鉴,和保存在印鉴卡上的实际印鉴进行比对,给出差异度。

  unsigned int CheckSingle(unsigned int nWhichSeal)

  参数:nWhichSeal为预留印鉴序号。返回值:印鉴差异度。

  组件式开发是一种国际通行的软件开发模式,可以极大地方便客户化。我们知道,图像处理算法是非常耗时的,对于速度的要求很高,因此,适合用C来写,同时,C也适合于写一些与硬件打交道的代码,以及密码学算法。然而,C语言的开发难度和代价都很大。组件式开发就很好地解决了这个问题。人们可以将相对不变的代码以组件的方式提供;将经常需要改变的代码用开发代价低、易于维护、易于修改的高级语言来写。银行电子验印系统可以在静态图像处理组件RSImage、通用扫描软件RSTWAINCOM和信息安全组件RSSecurityCOM的基础上进行二次开发。面向最终用户的开发商只需要用尽可能简单的高级语言来写业务流程、界面、数据库访问、网络等代码即可,而这些代码是需要客户化的,需要经常修改的,需要经常升级的。