【转】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.

 

转载于:https://www.cnblogs.com/ziwang/p/5136864.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Halcon可以通过多线程并行读取QR二维码QR二维码是一种常用的图像编码标准,用于存储大量数据,而Halcon是一款强大的图像处理软件,可以对图片中的QR二维码进行识别。 在Halcon中,可以通过使用多线程的方法提高对图片QR二维码识别速度。多线程是指同时运行多个线程,每个线程都可以独立执行任务,从而实现并行处理。在读取QR二维码的过程中,可以将图像划分为多个区域,每个线程负责处理一个区域的图像,从而实现并行读取的效果。 具体实现多线程并行读取QR二维码的方法如下: 1. 载入图像并将其分为多个区域。可以根据需要将图像切割成不同大小的区域,每个区域由一个线程进行处理。 2. 使用Halcon提供的QR二维码识别函数对每个区域的图像进行识别,获取二维码的信息。 3. 将每个线程读取到的二维码信息进行整合,得到最终的结果。 通过多线程并行读取,可以充分利用计算机的多核心处理能力,提高QR二维码识别速度,从而提高整体的处理效率。同时,根据不同的系统和硬件环境,可以调整并行读取的线程数量,以达到最佳的读取速度和效果。 总结起来,Halcon可以通过多线程并行读取QR二维码,以提高识别速度和处理效率。这种方法可以将图像划分为多个区域,每个线程独立处理一个区域的图像,最后将结果整合得到最终的二维码信息。 ### 回答2: Halcon是一款图像处理软件,支持多线程并行处理。要实现多线程并行读取QR二维码,可以按照以下步骤进行: 1. 导入Halcon库:首先,将Halcon库导入到你的项目中。你可以在Halcon官方网站下载并安装该软件,并将其集成到你的开发环境中。 2. 多线程管理:使用多线程库或框架,比如C++的标准线程库,来管理多线程并行读取QR二维码的任务。你可以创建多个线程来同时处理多个图像或图像序列。 3. 图像读取:通过编程语言提供的图像读取接口,将需要读取QR二维码的图像加载到内存中。 4. 并行处理:将每个线程分配到不同的图像,使其同时读取QR二维码。可以使用Halcon提供的QR二维码识别算法,对图像进行处理。 5. 结果汇总:每个线程完成QR二维码读取后,将结果汇总到一起。你可以选择将结果保存到文件中、输出到屏幕上或通过其他方式展示。 需要注意的是,多线程并行读取QR二维码可能会导致性能上的提升,但也可能会带来一些线程同步和资源竞争的问题。因此,在实现多线程并行读取QR二维码时,要注意线程之间的同步和互斥,确保数据的一致性和正确性。 总之,通过利用Halcon的多线程支持和QR二维码识别算法,你可以实现高效并行读取QR二维码的任务。 ### 回答3: Halcon作为一款图像处理的软件,可以用于读取二维码。在多线程并行读取二维码方面,可以使用Halcon提供的多线程支持来实现。 首先,我们需要创建多个线程,每个线程都负责读取一个二维码,以实现并行读取的效果。可以使用Halcon提供的接口函数来创建线程,并分配每个线程需要处理的二维码图像。 在每个线程中,我们可以使用Halcon提供的二维码读取函数来读取二维码信息。这些函数可以解码二维码图像,并提取出二维码的内容。 读取完成后,可以将二维码的内容保存到一个共享的数据结构中,以供其他线程使用或者进行后续处理。在保存数据的过程中,需要注意线程之间的数据同步和互斥,以防止数据错误或冲突。 当所有线程完成二维码的读取后,我们可以对读取到的二维码内容进行后续的处理,比如进行数据库的查询或者其他操作。 需要注意的是,在多线程并行读取二维码的过程中,需要合理地控制线程的数量,避免过多线程造成资源的浪费或者性能下降。同时,也需要进行线程安全的设计,保证数据的正确性和一致性。 总结来说,利用Halcon的多线程支持,我们可以实现多线程并行读取二维码的功能。通过合理的线程设计和数据同步机制,可以提高读取速度和效率,以满足实际应用的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值