亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

在Delphi中進行指紋儀的二次開發

2019-11-18 18:35:18
字體:
來源:轉載
供稿:網友
 

在Delphi中進行指紋儀的二次開發

一.指紋儀簡介
   指紋具有"物證之首"的美譽。科學界對指紋的論斷是:假設地球上有50億人口, 經過300年才會有兩個相同的指紋出現??梢?,指紋的唯一性是具有無可辯駁的地位。

   指紋儀第一次改變了我們熟知的數字化安全系統。此前,一切都依賴于密碼。你必須用自己的用戶名,并且對你的系統進行配置。你必須遮住鍵盤以免其它人看見你的密碼。然而稍有疏忽的話,任何人都很能容易竊取到你的密碼。
  
   有關專家預測:"通過指紋識別系統,我們擴展了家庭和商業計算機用戶在安全性方面的需求,不久的將來,無論是在局域網還是在Internet,無論是注冊登錄還是訪問安全性數據,都將不再需要密碼,這一切只需要你使用手指頭觸摸一下".

二.指紋儀的二次開發簡介
   目前世界上的指紋儀廠商很多,影響力較大,被采用較多的當數DigitalPersona公司的U.are.U系列,DigitalPersona公司是全球最大計算機鍵盤制造商,這家公司使用的生物工程安全系統已經被Chicony Electronics列入協議中.這個協議是關于在鍵盤中集成DigitalPersona公司U.are.U指紋感應安全系統,這是為HP、Compaq和IBM等廠商制造的.

   本文介紹的指紋儀二次開發就是以DigitalPersona公司的U.are.U 2000為原型的,U.are.U為you are you ,(你就是你)的縮寫. U.are.U 2000 微型指紋采集器能夠自動讀取指紋圖像,并通過USB接口把數字化的指紋圖像傳送到計算機。對于需要進行身份驗證的膝上型電腦、桌面計算機或其他的個人電腦裝置,它是最為理想的配件。

    U.are.U 2000 是一款低成本的緊湊的指紋采集器。集成了精密光學系統、LED光源和CMOS攝像頭協同工作,在圖像攝取時進行電壓控制、自動矯正,并使用即插即用的USB接口.U.are.U 2000 指紋掃采集設計了通向DigitalPersona的U.are.U 指紋識別算法、應用程序和DigitalPersona通用身份驗證管理器(Universal Authentication Manager -UAM) 的接口--這些指紋有關的應用程序包括Windows 登錄、屏幕鎖定、口令替換及其加密磁盤驅動器。

    在購買指紋儀硬件產品的同時,商家一般都會附上硬件驅動程序,產品說明書,二次開發包及開發程序示例。通過軟件開發包(SDK),可以在應用程序中增加指紋識別的功能。

三.指紋儀二次開發過程中的關鍵技術

1.dll的調用
  首先介紹一下在delpi中調用指紋儀開發包中的dll的方法。把開發包中的uruShell.dll放到程序目錄下或System目錄下。為了清晰明了起見,將DLL的調用聲明集中在一個程序單元Shelluru.pas中,在里面把uruShell.dll 的函數導出并作有關的引用聲明,具體源碼如下:

unit Shelluru;

interface

uses windows, Messages;

const
  FT_OK                          = 0;    // 成功
  FT_ERR_NO_INIT                 = -1;   // 沒有初始化
  FT_ERR_UNKNOWN_DEVICE          = -10;  // 未知設備
  FT_ERR_DEVICE_CONNECTED        = -18;  // 設備已連接
  FT_ERR_NO_DEVICE_CONNECTED     = -19;  // 無設備可連接
  MAX_REGISTER_COUNT = 8;             // 最大可注冊數
  ERR_REGISTER_FAIL  = -110;  // 注冊失敗
  ERR_VERIFY_FAIL  = -111;  // 驗證失敗
  ERR_REGISTER_COUNT  = -112;  // 注冊數
  
 { 以下下是自定義消息,MSG_FINGER_CAPTURED指紋獲取消息;}MSG_WAITING_FOR_IMAGE指紋等待消息。
  MSG_FINGER_CAPTURED = WM_USER + 80;
  MSG_WAITING_FOR_IMAGE = WM_USER + 81;

type
  PRegisterPixels = ^TRegisterPixels;
  TRegisterPixels = array[1..MAX_REGISTER_COUNT] of Pointer;

///uru_Init初始化指紋儀,參數:numOfDev返回計算機連接的指紋儀數量;FeatureLen返回指紋數據長度。
function uru_Init(var numOfDev, FeatureLen: integer): integer; stdcall;

///uru_Connect連接特定指紋儀。參數:DeviceNo指紋儀號碼。
function uru_Connect(DeviceNo: integer): integer; stdcall;

///uru_Terminate斷開與指紋儀的連接。參數:DeviceNo指紋儀號碼。
procedure uru_Terminate(DeviceNo: integer); stdcall;

///uru_AllocFeature分配指紋數據地址。參數:Feature返回的地址指針。
procedure uru_AllocFeature(var Feature: pointer); stdcall;

///uru_FreeFeature釋放已分配的地址。參數:Feature返回的地址指針。
procedure uru_FreeFeature(var Feature: pointer); stdcall;

///uru_GetImageWidth獲取指紋圖像寬度。
function uru_GetImageWidth: integer; stdcall;

///uru_GetImageHeight獲取指紋圖像高度。
function uru_GetImageHeight: integer; stdcall;

///uru_Register指紋注冊函數。參數:hwnd窗口句柄,用于消息傳送;DevieceNo指紋儀號碼;
///fngCount指紋登記次數;Pixels指紋圖像連接指針;Features指紋注冊數據指針.
function uru_Register(hwnd: HWND; DeviceNo, fngCount: integer;Pixels: PRegisterPixels; Features: pointer): integer; stdcall;

///uru_AcquireFeatures指紋驗證函數。參數:hwnd窗口句柄,用于消息傳送;DevieceNo指紋儀號碼.
function uru_AcquireFeatures(hwnd: HWND; DeviceNo: integer; Pixels, Features: pointer): integer; stdcall;

///uru_verifyFeatures指紋對比函數。參數:srcFeatures需要對比指紋數據;dstFeatures對比的指紋數據。
function uru_verifyFeatures(srcFeatures, dstFeatures: pointer): Boolean; stdcall;

///dll注冊函數
procedure uru_DllRegister; stdcall;

///中斷特定指紋儀取像函數。參數:DeviceNo指紋儀號碼。
Procedure uru_StopGetImage(DeviceNO:Integer);Stdcall;

implementation

const
  DLLNAME = 'uruShell.dll';

{以下為調用uruShell.dll 導出函數的聲明}
  function uru_Init; external DLLNAME;
  function uru_Connect; external DLLNAME;
  procedure uru_Terminate; external DLLNAME;
  procedure uru_AllocFeature; external DLLNAME;
  procedure uru_FreeFeature; external DLLNAME;
  function uru_GetImageWidth; external DLLNAME;
  function uru_GetImageHeight; external DLLNAME;
  function uru_Register; external DLLNAME;
  function uru_AcquireFeatures; external DLLNAME;
  function uru_verifyFeatures; external DLLNAME;
  procedure uru_DllRegister; external DLLNAME;
  Procedure uru_StopGetImage;external DLLNAME;

end.
  
   完成以上工作以后,則可以在主工程文件中引用Shelluru.pas文件,然后就可以調用Shelluru.pas文件中定義的函數了。  

2.把驗證后的指紋數據保存在文件中或數據庫
  
   通過調用以上定義的函數,我們可以實現一個指紋的注冊,驗證,指紋數據保存,指紋再驗證(識別)的指紋識別系統。下面重點介紹一下指紋的注冊和驗證識別過程的編程實現:

procedure TForm1.BtnRegisterClick(Sender: TObject); file://注冊指紋
var
  i:integer;
begin
  if UserList.Selected = nil then
  begin
    MessageBox(application.Handle, '請先選擇用戶!', nil, MB_OK);
    Exit;
  end;
  if UserList.Selected.Data <> nil then
    Feature := UserList.Selected.Data file://此時Feature為空
  else
    uru_AllocFeature(Feature);
  if Feature = nil then     file://假如指紋特征為空
  begin
    Status.SimpleText := '不能分配Feature內存';
    Exit;
  end;
  for i := 1 to 4 do
  begin
    FillChar(Pixels[i]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
    Images[i].Refresh;
  end;
  Status.SimpleText := '開始注冊 ' + UserList.Selected.Caption + ' 的指紋...';
  if uru_Register(Handle, DeviceNo, 4, @Pixels, Feature) = FT_OK then
  begin
    Status.SimpleText := UserList.Selected.Caption + ': 注冊成功!';
    if UserList.Selected.Data = nil then
      UserList.Selected.Data := Feature;
  end
  else
    begin
      if UserList.Selected.Data = nil then uru_FreeFeature(Feature);
      Status.SimpleText := UserList.Selected.Caption + ': 注冊失敗!';
    end;
end;
   此函數主要調用了DLL中的uru_Register函數,用來為用戶注冊指紋,注冊指紋是為了提取指紋的特征值,為特征值分配一端內存,用來存儲指紋特征值數據,并用一個指針指向這段內存,以便將來可以找回來。注冊完成后要立即進行一次驗證,確保數據無誤,驗證過程如下:

procedure TForm1.BtnVerifyClick(Sender: TObject);  file://驗證指紋
var
  aFeature: pointer;
  i:          integer;
  fingerpath:   string ;
begin
  fingerpath:='C:/finger'+Edit9.Text+Edit10.Text;//指紋數據存儲路徑
  if UserList.Selected = nil then
  begin
    MessageBox(Application.Handle, '請先選擇用戶!', nil, MB_OK);
    Exit;
  end;
  if UserList.Selected.Data = nil then
  begin
    MessageBox(Application.Handle, PChar(Format('用戶 %s 還沒有注冊指紋,請先注冊!', [UserList.Selected.Caption])), nil, MB_OK);
    Exit;
  end;
  FillChar(Pixels[5]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
  Images[5].Refresh;
  Status.SimpleText := '開始驗證 ' + UserList.Selected.Caption + ' 的指紋...';
  Feature := UserList.Selected.Data; file://需要對比指紋數據
  move(Feature^,byt,len);    file://把內存中的一段長為len,從Feature開始的數據移到byte數組中
  uru_AllocFeature(aFeature);//分配指紋數據地址
  if (uru_AcquireFeatures(handle, DeviceNo, Pixels[5], aFeature) = FT_OK) and       uru_verifyFeatures(@byt, aFeature) then 
  file://uru_AcquireFeatures指紋驗證
  file://uru_verifyFeatures指紋對比
  begin
      Status.SimpleText := UserList.Selected.Caption + ': 驗證成功!';
      AssignFile(F,fingerpath);//分配文件
      ReWrite(F);//重寫文件
      for i:=0 to len do
      Write(F,byt[i]);//把指紋儀數據寫入文件
      CloseFile(F);//關閉文件
  end
  else
  Status.SimpleText := UserList.Selected.Caption + ': 驗證失敗!';
  uru_FreeFeature(aFeature); file://釋放內存
end;
    以上過程關鍵在于指紋驗證成功后,及時把內存中的指紋數據存到數據文件中,數據文件名最好是用戶名加上編號,以便以后驗證時方便找到對應的用戶指紋數據。最后還要記得把臨時分配的內存釋放掉。把指紋數據存儲到文件,以后就可以通過打開文件的方式,把數據文件調出來,與當前用戶進行一個匹配的過程,以便驗證用戶的正確身份,具體過程如下:

procedure TForm1.BitBtn2Click(Sender: TObject); file://驗證舊用戶指紋
var
  aFeature1:  pointer;
  i:          integer;
begin
 if OpenDialog1.Execute then
  begin
   AssignFile(G,OpenDialog1.FileName);//指定文件
   Reset(G);//重置文件
   for i:=0 to len do
   Read(G,byt2[i]);//把文件中的指紋儀數據移到byte2數組中
   CloseFile(G);//關閉文件
  end;
  FillChar(Pixels[5]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
  Images[5].Refresh;
  Status.SimpleText := '開始驗證 ' + UserList.Selected.Caption + ' 的指紋...';
  uru_AllocFeature(aFeature1);//分配指紋數據地址
  if (uru_AcquireFeatures(handle, DeviceNo, Pixels[5], aFeature1) = FT_OK) and      uru_verifyFeatures(@byt2, aFeature1) then
     Status.SimpleText := UserList.Selected.Caption + ': 驗證成功!'
  else
    Status.SimpleText := UserList.Selected.Caption + ': 驗證失敗!';
  uru_FreeFeature(aFeature1); file://釋放內存
end;

   其實指紋數據也可以存儲在數據庫,這樣就可以實現多層結構系統,在服務器上的數據庫集中存取指紋數據,客戶端根據需要把注冊數據上傳服務器,或在需要驗證舊用戶時從服務器讀取數據,保證了安全性。

  
四.小結
   本文介紹了利用U.are.U 2000 指紋儀的開發包進行二次開發,實現一個指紋數據注冊,驗證,數據存儲和舊指紋再驗證的過程,這個過程可用在一些需要通過指紋識別個人身份的系統中,筆者就是在這個基礎上開發了一個作為公安機構或住宅小區的暫住證管理系統的原型,主要實現住戶的暫住證管理功能.本文只介紹了對指紋儀開發包中的DLL的調用的方法以及二次開發中的注冊和驗證這些關鍵過程,至于指紋設備的連接,初始化,指紋圖象的顯示等因為比較簡單,所以沒有做深入的探討,讀者可以根據dll提供的函數自行開發。歡迎來信與我討論,我的email是allencnj@163.com


上一篇:《Delphi面向對象編程思想》前言

下一篇:delphi一句話幫助

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品一区二区三区av| 中日韩美女免费视频网站在线观看| 亚洲mm色国产网站| 久久精品亚洲精品| 亚洲精品电影久久久| 国产在线观看91精品一区| 成人福利视频网| 欧美在线视频网| 日韩免费视频在线观看| 中文亚洲视频在线| 欧美日本高清一区| 毛片精品免费在线观看| 亚洲国产精久久久久久久| 国产精品久久视频| 国产精品久久久久久av福利| 亚洲精品视频网上网址在线观看| 国内外成人免费激情在线视频| 日本午夜精品理论片a级appf发布| 久久久久北条麻妃免费看| 91美女片黄在线观看游戏| 国产性色av一区二区| 欧美夜福利tv在线| 久久免费视频观看| 欧美视频在线看| 欧美精品在线免费观看| 久热99视频在线观看| 青青a在线精品免费观看| 久久躁日日躁aaaaxxxx| 国产亚洲精品美女久久久久| 日本老师69xxx| 国产精品电影久久久久电影网| 久久综合九色九九| 国产午夜精品理论片a级探花| 国产成人精品午夜| 国产日韩视频在线观看| 亚洲欧洲第一视频| 国产欧美一区二区三区在线| 久久亚洲春色中文字幕| 欧美日在线观看| 国产一区二区三区高清在线观看| 国产一区二区黄| 亚洲欧美成人网| 性色av一区二区咪爱| 国产精品视频99| 欧美大片第1页| 欧美成人免费va影院高清| 在线观看国产成人av片| 久久成人亚洲精品| 91在线观看欧美日韩| 亚洲一区亚洲二区亚洲三区| 欧美日韩综合视频| 色综合色综合久久综合频道88| 人人爽久久涩噜噜噜网站| 欧美午夜片在线免费观看| 成人午夜小视频| 亚洲欧美日韩精品久久亚洲区| 国产一区二区三区高清在线观看| 国产精品福利在线观看网址| 中日韩午夜理伦电影免费| 亚洲午夜性刺激影院| 国产精品美女免费视频| 精品国产一区二区三区四区在线观看| 欧美激情久久久久久| 亚洲性av网站| 成人a级免费视频| 日韩免费在线免费观看| 全球成人中文在线| 欧美亚洲国产成人精品| 一区二区三区无码高清视频| 狠狠色香婷婷久久亚洲精品| 亚洲aⅴ日韩av电影在线观看| 国产亚洲精品va在线观看| 26uuu另类亚洲欧美日本一| 久久久女女女女999久久| 亚洲欧美福利视频| 51视频国产精品一区二区| 亚洲精品国精品久久99热| 亚洲欧美日韩国产中文| 欧美做爰性生交视频| 国产91在线播放九色快色| 欧美在线中文字幕| 69av成年福利视频| 欧美电影免费在线观看| 久久琪琪电影院| 欧美久久久精品| 亚洲国产婷婷香蕉久久久久久| 一区二区在线免费视频| 98精品国产自产在线观看| 国产欧美日韩亚洲精品| 国产精品久久综合av爱欲tv| 亚洲综合中文字幕在线观看| 欧美整片在线观看| 久久精品成人欧美大片古装| 久久精品国产电影| 久久久久久97| 欧美大片网站在线观看| 欧美激情二区三区| 欧美日韩在线观看视频| 欧美视频在线观看免费| 久久久精品2019中文字幕神马| 91社影院在线观看| 亚洲网站在线观看| 欧美三级免费观看| 国产欧美一区二区三区在线看| 亚洲色在线视频| 亚洲肉体裸体xxxx137| 欧美精品在线观看| 九九热精品在线| 中文字幕亚洲欧美在线| 亚洲国产欧美一区二区三区同亚洲| 中文字幕亚洲一区二区三区| 国产97在线|亚洲| 国产日本欧美一区二区三区| 国产精品av免费在线观看| 精品国产欧美成人夜夜嗨| 免费不卡欧美自拍视频| 成人精品一区二区三区电影黑人| 色噜噜狠狠狠综合曰曰曰88av| 亚洲视频免费一区| 欧美疯狂性受xxxxx另类| 国产精品久久久久久久久免费| 亚洲欧美日韩一区二区在线| 亚洲最大成人在线| 91精品视频在线看| 亚洲人成在线免费观看| 91精品免费看| 精品亚洲男同gayvideo网站| 国产精品视频久| 亚洲跨种族黑人xxx| 69久久夜色精品国产7777| 少妇av一区二区三区| 亚洲精品欧美一区二区三区| 久久久久北条麻妃免费看| 国产欧美亚洲精品| 亚洲人成欧美中文字幕| 日韩免费精品视频| 欧美黑人巨大精品一区二区| 亚洲经典中文字幕| 国产精品露脸自拍| www日韩中文字幕在线看| 色综合久久久久久中文网| 欧美成人免费视频| 在线观看视频亚洲| 97在线观看视频国产| 日韩在线免费视频| 欧美巨大黑人极品精男| 91av视频导航| 色播久久人人爽人人爽人人片视av| 97不卡在线视频| 国产一区二区三区在线免费观看| 欧美在线一区二区三区四| 亚洲女人被黑人巨大进入| 欧美一级片一区| 久久精品99国产精品酒店日本| 欧美激情亚洲国产| 久久久欧美一区二区| 欧美老女人在线视频| 久久精品人人做人人爽| 午夜精品久久久久久久99热浪潮| 92看片淫黄大片看国产片| 在线成人一区二区| 欧美亚洲午夜视频在线观看| 日韩电影中文 亚洲精品乱码| 亲爱的老师9免费观看全集电视剧|