【转】Delphi+Halcon实战一:两行代码识别QR二维码

时间:2022-12-14 20:28:28

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.