【轉】Delphi+Halcon實戰一:兩行代碼識別QR二維碼


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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM