zoukankan      html  css  js  c++  java
  • 【转】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)) + 'img2DQR.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.
  • 相关阅读:
    JSP中文乱码的一点研究
    Eclipse 导入外部项目无法识别为web项目并且无法在部署到tomcat下
    DOS命令学习
    Oracle学习笔记(一)
    登录时候的图片验证码的实现
    DIY随机数产生类
    使用VS2010建模
    Random快速连续产生不相同随机数
    魔兽争霸3冰封王座英雄以及兵种语言
    取两个地图坐标之间的距离
  • 原文地址:https://www.cnblogs.com/ziwang/p/5136864.html
Copyright © 2011-2022 走看看