Delphi+Halcon實戰一:兩行代碼識別QR二維碼
感謝網友:絕代雙椒( QQ號應原作者要求隱藏了:xxxx6348)的支持
本文是絕代雙椒的作品,因為最近在忙zw量化培訓,和ziwang.com網站的升級,halcon沒時間操作。
不過,隨着國內產業升級,機器人行業的發展,Delphi+Halcon的未來,是無可限量的。
其他網友,有halcon這方面作品的,有需要,也可以交給zw轉發。
另外,zw正在爭取培訓機構合作,開辦Delphi+Halcon方面的培訓的項目,有興趣的機構可以聯系QQ:357811718(字王)
環境:
Delphi XE8 Update1、Halcon 12、一張QR二維碼圖片。圖片是自己先用報表工具生成的,然后打印出來,再用手機拍照。為了測試干擾識別,在圖片上亂塗亂畫了。
結果:
核心代碼只有2行,准確識別,識別時間僅為 25ms 左右!!!!!!!!!!
1 unit Unit1; 2 3 interface 4 5 uses 6 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, 7 Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.OleServer, 8 HALCONXLib_TLB, Vcl.OleCtrls, System.Diagnostics; 9 10 type 11 TForm1 = class(TForm) 12 HWindowXCtrl1: THWindowXCtrl; 13 Memo1: TMemo; 14 Button2: TButton; 15 procedure Button2Click(Sender: TObject); 16 private 17 { Private declarations } 18 public 19 { Public declarations } 20 end; 21 22 var 23 Form1: TForm1; 24 25 implementation 26 27 {$R *.dfm} 28 29 procedure TForm1.Button2Click(Sender: TObject); 30 var 31 op: HOperatorSetX; 32 srcImgage, SymbolXLDs: HUntypedObjectX; 33 hv_Width, hv_Height: OleVariant; 34 DataCodeHandleQR, ResultHandles1, DecodedDataStrings: OleVariant; 35 SaveFileName: OleVariant; 36 Stopwatch: TStopwatch; 37 begin 38 39 Memo1.Lines.Clear; 40 op := CoHOperatorSetX.Create; 41 // 清空圖像 42 op.GenEmptyObj(srcImgage); 43 // 讀取圖像 44 op.ReadImage(srcImgage, ExtractFilePath(ParamStr(0)) + 'img\2DQR.jpg'); 45 // 取得尺寸,按 HWindowXCtrl1 的實際大小顯示圖片 46 op.GetImageSize(srcImgage, hv_Width, hv_Height); 47 HWindowXCtrl1.HalconWindow.SetPart(0, 0, hv_Height - 1, hv_Width - 1); 48 // 顯示圖像 49 op.DispObj(srcImgage, HWindowXCtrl1.HalconWindow.HalconID); 50 // 以下兩行為核心代碼,只需要兩行,便可識別出QR二維碼 51 // 具體參數說明,請見HALCON的幫助手冊 52 Stopwatch := TStopwatch.StartNew; 53 op.CreateDataCode2DModel('QR Code', 'default_parameters', 'maximum_recognition', DataCodeHandleQR); 54 op.FindDataCode2D(srcImgage, SymbolXLDs, DataCodeHandleQR, 'train', 'all', ResultHandles1, DecodedDataStrings); 55 // 將識別出來的QR二維碼寫在圖片上 56 HWindowXCtrl1.HalconWindow.SetColor('red'); 57 HWindowXCtrl1.HalconWindow.SetTposition(300, 300); 58 HWindowXCtrl1.HalconWindow.WriteString('發現QR碼:' + DecodedDataStrings); 59 // 同時顯示二維碼到Memo中去 60 Memo1.Lines.Add('QR碼:' + DecodedDataStrings + '耗時:' + Stopwatch.ElapsedMilliseconds.ToString + ' ms'); 61 // 將寫有二維碼內容的圖片重新保存 62 // 注意:讀取出來的二維碼后面有換行字符,要去掉,不然保存不了 63 SaveFileName := ExtractFilePath(ParamStr(0)) + 'img\' + Trim(DecodedDataStrings); 64 // 保存當前圖片,但只是保存當前窗口大小的 65 // 我只想到了這種辦法,如何以原圖顯示,請 ZW 改寫 66 op.DumpWindowImage(srcImgage, HWindowXCtrl1.HalconWindow.HalconID); 67 op.WriteImage(srcImgage, 'jpg', 0, SaveFileName); 68 end; 69 70 end.