【转】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 左右!!!!!!!!!!
unit Unit1; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.OleServer,
HALCONXLib_TLB, Vcl.OleCtrls, System.Diagnostics; type
TForm1 = class(TForm)
HWindowXCtrl1: THWindowXCtrl;
Memo1: TMemo;
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject);
var
op: HOperatorSetX;
srcImgage, SymbolXLDs: HUntypedObjectX;
hv_Width, hv_Height: OleVariant;
DataCodeHandleQR, ResultHandles1, DecodedDataStrings: OleVariant;
SaveFileName: OleVariant;
Stopwatch: TStopwatch;
begin Memo1.Lines.Clear;
op := CoHOperatorSetX.Create;
// 清空图像
op.GenEmptyObj(srcImgage);
// 读取图像
op.ReadImage(srcImgage, ExtractFilePath(ParamStr()) + 'img\2DQR.jpg');
// 取得尺寸,按 HWindowXCtrl1 的实际大小显示图片
op.GetImageSize(srcImgage, hv_Width, hv_Height);
HWindowXCtrl1.HalconWindow.SetPart(, , hv_Height - , hv_Width - );
// 显示图像
op.DispObj(srcImgage, HWindowXCtrl1.HalconWindow.HalconID);
// 以下两行为核心代码,只需要两行,便可识别出QR二维码
// 具体参数说明,请见HALCON的帮助手册
Stopwatch := TStopwatch.StartNew;
op.CreateDataCode2DModel('QR Code', 'default_parameters', 'maximum_recognition', DataCodeHandleQR);
op.FindDataCode2D(srcImgage, SymbolXLDs, DataCodeHandleQR, 'train', 'all', ResultHandles1, DecodedDataStrings);
// 将识别出来的QR二维码写在图片上
HWindowXCtrl1.HalconWindow.SetColor('red');
HWindowXCtrl1.HalconWindow.SetTposition(, );
HWindowXCtrl1.HalconWindow.WriteString('发现QR码:' + DecodedDataStrings);
// 同时显示二维码到Memo中去
Memo1.Lines.Add('QR码:' + DecodedDataStrings + '耗时:' + Stopwatch.ElapsedMilliseconds.ToString + ' ms');
// 将写有二维码内容的图片重新保存
// 注意:读取出来的二维码后面有换行字符,要去掉,不然保存不了
SaveFileName := ExtractFilePath(ParamStr()) + 'img\' + Trim(DecodedDataStrings);
// 保存当前图片,但只是保存当前窗口大小的
// 我只想到了这种办法,如何以原图显示,请 ZW 改写
op.DumpWindowImage(srcImgage, HWindowXCtrl1.HalconWindow.HalconID);
op.WriteImage(srcImgage, 'jpg', , SaveFileName);
end; end.
【转】Delphi+Halcon实战一:两行代码识别QR二维码的更多相关文章
- zxing 如何识别反转二维码
说起二维码扫描,估计很多人用的是 zxing 吧. 然而 zxing 虽然好用,但是却有一些坑. 这边分析一下自己实际项目遇到的一个坑. 什么坑呢? 下面举个栗子你就懂了. 这边生成二维码使用的是网络 ...
- C# vb .NET识别读取QR二维码
二维码比条形码具有更多优势,有些场合使用二维码比较多,比如支付.那么如何在C#,.Net平台代码里读取二维码呢?答案是使用SharpBarcode! SharpBarcode是C#快速高效.准确的条形 ...
- 在Android上使用ZXing识别条形码/二维码
越来越多的手机具备自动对焦的拍摄功能,这也意味着这些手机可以具备条码扫描的功能.......手机具备条码扫描的功能,可以优化购物流程,快速存储电子名片(二维码)等. 本文使用ZXing 1.6实现条码 ...
- 用一行Python代码制作动态二维码
在GitHub上发现了一个比较有意思的项目,只需要一行Python代码就可以快捷方便生成普通二维码.艺术二维码(黑白/彩色)和动态GIF二维码. GitHub网站参见:https://github.c ...
- qrcode.js的识别解析二维码图片和生成二维码图片
qrcode只通过前端就能生成二维码和解析二维码图片, 首先要引入文件qrcode.js,下载地址为:http://static.runoob.com/download/qrcodejs-04f46c ...
- Opencv+Zbar二维码识别(二维码校正)
二维码和车牌识别基本都会涉及到图像的校正,主要是形变和倾斜角度的校正,一种二维码的畸变如下图: 这个码用微信扫了一下,识别不出来,但是用Zbar还是可以准确识别的~~. 这里介绍一种二维码校正方法,通 ...
- 1行Python代码制作动态二维码
原文地址 https://blog.csdn.net/m0_38106923/article/details/100603516 GitHub网站参见:https://github.com/sylns ...
- 基于opencv3.0和下的条形码与二维码识别
其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...
- php 识别二维码(转载)
近段需要写一个通过PHP来识别二维码的功能,在网上查了很久才解决问题.以此来记录下来解决问题的方法. 最开始找的方法是一个叫 php-zbarcode 的扩展,自己照着网上的安装步骤安装了 Image ...
随机推荐
- Android 开发项目笔记2 自建View满足特殊要求
写java文件组成特殊的View,然后在xml文件中通过 包名.类名 调用. 1.padding 是指的组件内部的填充区域,不是指组件与parent之间的区域.操控后者间距后者使用margin 2.使 ...
- 00 EPLAN安装问题
问题: EPLAN 安装结束后,无法创建项目,每次创建均会弹出提示框:内部错误 解决方案: 运行 Services.msc 禁用EPLAN Client Service 设置EPLAN使用管理员模式 ...
- C# TransactionScope 使用
注意: Windows 服务中,开启Distributed Transaction Coordinator 服务. using (var scope = new TransactionScope()) ...
- 关于div的滚动条滚动到底部,内容显示不全的问题。(已解决)
今天我做了一个带有滚动条,底部有两个按钮的div. 当我拖动滚动条到底部, 按钮没有显示出来. 我看了看我的样式设置,是这样的: /* 内容样式 */ #contentPartDiv{ posit ...
- 【转】linux和windows下安装python集成开发环境及其python包
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- C#.NET中数组、ArrayList和List三者的区别
数组在C#.NET中是最早出现的,在内存中是顺序连续存储的,所以它的索引速度非常快,赋值与修改元素也很简单:但是,也正因为数组是顺序连续存储的,在两个数据间插入数据是很不方便的,而且在声明数组的时候必 ...
- XSS漏洞
跨站脚本攻击(也称为XSS)指利用网站漏洞从用户那里恶意盗取信息 坚决不要相信任何用户输入并过滤所有特殊字符.这样既可消灭绝大部分的XSS攻击.另一个建议是输出页面时将 < 和 > 变换成 ...
- Linux下安装性能测试负载机LG
系统:CentOS release 6.6 (Final) x86_64 安装包: 1.LRLG_00031.iso [Load Generator Standalone (Linux 64-bit ...
- Vim,极简使用教程,让你瞬间脱离键鼠切换的痛苦
注:看大家对Vim仇恨极大,其实它只是一种文本操作方式,可以减少键鼠的切换,从而让编辑文本的操作更迅捷.并不等同于IDE,在我看来,它们是两个是包含关系,IDE可以有Vim编辑模式.Vim或许可以通过 ...
- MyBatis学习总结(一)——MyBatis快速入门(转载)
本文转载自http://www.cnblogs.com/jpf-java/p/6013537.html MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了 ...