博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zw版_zw中文增强版Halcon官方Delphi例程
阅读量:6594 次
发布时间:2019-06-24

本文共 12427 字,大约阅读时间需要 41 分钟。

【《zw版·delphi与halcon系列原创教程》

zw版_zw中文增强版Halcon官方Delphi例程

源码下载:

2016 zw中文增强版(delph2007,HALCON 11.01)

主要改动之处:

:: 将位于窗口class的私有变量,改为全局变量,便于分析,修改
:: 增加大量中文注解
:: 将原版的批量自动测量,改为手动单幅测量,便于观测效果
:: 多处节点,增加图像文件输出,便于理解,观测运行效果

注意A点,这个是中文增强版,增加的单步多节点截图,可以清楚看到相关细节。

 

http:www.cnblogs.com/ziwang/

《zw版·Halcon-delphi系列原创教程》

--------------

全部源码如下

1 unit zw_match;  2 //  3 // HALCON/Delphi pattern matching and measure example  4 //  5 // 2016 zw中文增强版(delph2007,HALCON 11.01)  6 //  7 // 主要改动之处:  8 // :: 将位于窗口class的私有变量,改为全局变量,便于分析,修改  9 // :: 增加大量中文注解 10 // :: 将原版的批量自动测量,改为手动单幅测量,便于观测效果 11 // :: 多处节点,增加图像文件输出,便于理解,观测运行效果 12 // :: 13 // :: 14 // 15 // http://www.cnblogs.com/ziwang/ 16 //《zw版·Halcon-delphi系列原创教程》 17 // 18  19 interface 20  21 uses 22 HALCONXLib_TLB, 23 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 24 Dialogs, OleCtrls, StdCtrls, sMemo, ExtCtrls; 25  26 type 27 Tmwin = class(TForm) 28 HXCtrl: THWindowXCtrl; 29 CopyrightLabel: TLabel; 30 msg: TsMemo; 31 Panel1: TPanel; 32 CreateBtn: TButton; 33 StartBtn: TButton; 34 MatchingScoreLabel: TLabel; 35 MatchingTimeLabel: TLabel; 36 MatchingLabel: TLabel; 37 MeasureDistLabel: TLabel; 38 MeasureNumLabel: TLabel; 39 MeasureTimeLabel: TLabel; 40 MeasureLabel: TLabel; 41 procedure FormShow(Sender: TObject); 42 procedure FormCreate(Sender: TObject); 43 procedure InitBtnClick(Sender: TObject); 44 procedure FormDestroy(Sender: TObject); 45 procedure CreateBtnClick(Sender: TObject); 46 procedure StartBtnClick(Sender: TObject); 47 private 48 {
Private declarations } 49 public 50 {
Public declarations } 51 end; 52 53 var 54 mwin: Tmwin; 55 xwin: HWindowX; 56 Framegrabber: HFramegrabberX; 57 Img, ImgReduced, ModelImage: HImageX; 58 RectangleRegion, ModelRegion, ModelRegionTrans: HRegionX; 59 Rectangle1, Rectangle2: HRegionX; 60 ShapeModel: HShapeModelX; 61 Matrix: HHomMat2DX; 62 Tuple: HTupleX; 63 Sys: HSystemX; 64 Measure1, Measure2: HMeasureX; 65 ImgWidth, ImgHeight: OleVariant; 66 Row, Column, Area: OleVariant; 67 Rect1Row, Rect1Col, Rect2Row, Rect2Col: Double; 68 RectPhi, RectLength1, RectLength2: Double; 69 70 implementation 71 72 {
$R *.dfm} 73 74 //------------------ 75 procedure initData(); 76 var dss:string; 77 begin 78 with mwin do begin 79 80 //-------------- 81 xwin.SetPart(0,0,491,645);//设置图像窗口尺寸 82 Img := Framegrabber.GrabImage();//从输入图像系列,加载图像 83 Img.DispObj(xwin);//显示图像 84 Img.WriteImage('png',0,'tmp\ImgSr'); 85 //---------检测图像尺寸 86 ImgWidth:=Img.GetImageSize(ImgHeight); 87 dss:='pic wid,hei:'+VarToStr(ImgWidth)+','+VarToStr(ImgHeight);msg.Lines.Add(dss);msg.Lines.Add(''); 88 //--------- 89 90 RectangleRegion.GenRectangle1(188,182,298,412);//设置检测区坐标(Row,Column,wid,hei)//?? 91 xwin.SetColor('red');//设置矩形颜色 92 xwin.SetDraw('margin');//设置填充方式,margin,为边框模式,fill,为填充模式 93 xwin.SetLineWidth(3);//设置笔画粗细 94 RectangleRegion.DispObj(xwin);;//显示矩形box 95 //-------------- 96 Area :=RectangleRegion.AreaCenter(Row,Column);//获取box区域面积,中心位置 97 dss:='Row,Column : 188,182';msg.Lines.Add(dss); 98 dss:='Row2,Column2 : 298,412';msg.Lines.Add(dss); 99 dss:='box区域面积area : '+VarToStr(area);msg.Lines.Add(dss);100 dss:='box区域大小wid,hei : '+VarToStr(412-182+1)+','+VarToStr(298-188+1);msg.Lines.Add(dss);101 dss:='box区域中心位置Row,Column : '+VarToStr(Row)+','+VarToStr(Column);msg.Lines.Add(dss);102 //-------- 设置加工区参数103 Rect1Row := Row - 102;104 Rect1Col := Column + 5;105 Rect2Row := Row + 107;106 Rect2Col := Column + 5;107 RectPhi := 0;108 RectLength1 := 170;109 RectLength2 := 5;110 end;111 end;112 113 114 procedure createShapeModel(); //创建加工模型 ShapeModel115 begin116 with mwin do begin117 //----设置显示窗口参数118 xwin.SetColor('red');xwin.SetDraw('margin');xwin.SetLineWidth(3);119 RectangleRegion.DispObj(xwin);120 //----设置model图像121 ImgReduced := Img.ReduceDomain(RectangleRegion);122 ModelImage := ImgReduced.InspectShapeModel(ModelRegion,1,30);123 //ImgReduced.WriteImage('png',0,'tmp\ImgReduced');124 //ModelImage.WriteImage('png',0,'tmp\ModelImage');125 xwin.DumpWindow('png','tmp\xwin_Shape01');126 //------------建立辅助区域127 Rectangle1.GenRectangle2(Rect1Row,Rect1Col,RectPhi,RectLength1,RectLength2);128 Rectangle2.GenRectangle2(Rect2Row,Rect2Col,RectPhi,RectLength1,RectLength2);129 //------------创建模型 ShapeModel130 ShapeModel.CreateShapeModel(ImgReduced,4,0,Tuple.TupleRad(360),131 Tuple.TupleRad(1),'none','use_polarity',30,10);132 //----设置显示窗口参数133 xwin.SetColor('green');xwin.SetDraw('fill');134 ModelRegion.DispObj(xwin);135 xwin.DumpWindow('png','tmp\xwin_Shape02');136 xwin.SetColor('blue'); xwin.SetDraw('margin');137 Rectangle1.DispObj(xwin);Rectangle2.DispObj(xwin);138 xwin.DumpWindow('png','tmp\xwin_Shape03');139 end;140 end;141 142 procedure DoMeasurement;143 var144 S1, S2: Double;145 RowCheck, ColumnCheck, AngleCheck, Score: OleVariant;146 Rect1RowCheck, Rect1ColCheck, Rect2RowCheck, Rect2ColCheck: OleVariant;147 RowEdgeFirst1, ColumnEdgeFirst1: OleVariant;148 AmplitudeFirst1, RowEdgeSecond1: OleVariant;149 ColumnEdgeSecond1, AmplitudeSecond1: OleVariant;150 IntraDistance1, InterDistance1: OleVariant;151 RowEdgeFirst2, ColumnEdgeFirst2: OleVariant;152 AmplitudeFirst2, RowEdgeSecond2: OleVariant;153 ColumnEdgeSecond2, AmplitudeSecond2: OleVariant;154 IntraDistance2, InterDistance2: OleVariant;155 MinDistance: OleVariant;156 NumLeads: Longint;157 dss:string;158 begin159 // 本demo,演示的是如何测量IC针脚间的距离160 with mwin do begin161 Sys.SetSystem('flush_graphic','false');//曲线系统图像自动刷新162 Img := Framegrabber.GrabImage();//设置新图像163 Img.Dispobj(xwin);//显示加工图像164 //----注意,Mea00sr.png与 ImgSr.png的不同,旋转了一个角度165 //----Framegrabber图像源是系列图片,通过旋转模拟加工现场,166 //----每次调用GrabImage,会自动更新167 xwin.DumpWindow('png','tmp\Mea00sr');168 // Find the IC in the current image. 匹配模型169 S1 := Sys.CountSeconds;170 RowCheck := ShapeModel.FindShapeModel(Img,0,Tuple.TupleRad(360),0.7,1,0.5,171 'least_squares',4,0.7,ColumnCheck,172 AngleCheck,Score);173 S2 := Sys.CountSeconds;174 MatchingTimeLabel.Caption := Format('Time: %4.2f',[(S2-S1)*1000]);175 MatchingScoreLabel.Caption := 'Score: ';176 xwin.DumpWindow('png','tmp\Mea01');177 //dss:=VarToStr(High(RowCheck));msg.lines.Add(dss);178 //-----找到模型,开始测量179 if not VarIsEmpty(RowCheck) and not VarIsArray(RowCheck) then begin180 MatchingScoreLabel.Caption := Format('Score: %7.5f',[double(Score)]);181 // Rotate the model for visualization purposes.旋转模型182 Matrix.VectorAngleToRigid(Row,Column,0,RowCheck,ColumnCheck,AngleCheck);183 ModelRegionTrans := ModelRegion.AffineTransRegion(Matrix,'false');184 xwin.SetColor('green');xwin.SetDraw('fill');185 ModelRegionTrans.DispObj(xwin);186 xwin.DumpWindow('png','tmp\Mea02');187 // Compute the parameters of the measurement rectangles.188 Rect1RowCheck := Matrix.AffineTransPixel(Rect1Row,Rect1Col,Rect1ColCheck);189 Rect2RowCheck := Matrix.AffineTransPixel(Rect2Row,Rect2Col,Rect2ColCheck);190 // For visualization purposes, generate the two rectangles as regions and191 // display them.192 Rectangle1.GenRectangle2(Rect1RowCheck,Rect1ColCheck,RectPhi+AngleCheck,193 RectLength1,RectLength2);194 Rectangle2.GenRectangle2(Rect2RowCheck,Rect2ColCheck,RectPhi+AngleCheck,195 RectLength1,RectLength2);196 xwin.SetColor('blue');xwin.SetDraw('margin');197 Rectangle1.DispObj(xwin);Rectangle2.DispObj(xwin);198 xwin.DumpWindow('png','tmp\Mea03');199 // Do the actual measurements.开始测量200 S1 := Sys.CountSeconds;201 Measure1.GenMeasureRectangle2(Rect1RowCheck,Rect1ColCheck,202 RectPhi+AngleCheck,RectLength1,RectLength2,203 ImgWidth,ImgHeight,'bilinear');204 Measure2.GenMeasureRectangle2(Rect2RowCheck,Rect2ColCheck,205 RectPhi+AngleCheck,RectLength1,RectLength2,206 ImgWidth,ImgHeight,'bilinear');207 RowEdgeFirst1 := Measure1.MeasurePairs(Img,2,90,'positive','all',208 ColumnEdgeFirst1,AmplitudeFirst1,209 RowEdgeSecond1,ColumnEdgeSecond1,210 AmplitudeSecond1,IntraDistance1,211 InterDistance1);212 RowEdgeFirst2 := Measure2.MeasurePairs(Img,2,90,'positive','all',213 ColumnEdgeFirst2,AmplitudeFirst2,214 RowEdgeSecond2,ColumnEdgeSecond2,215 AmplitudeSecond2,IntraDistance2,216 InterDistance2);217 S2 := Sys.CountSeconds;218 MeasureTimeLabel.Caption := Format('Time: %4.2f',[(S2-S1)*1000]);219 xwin.SetColor('red');220 xwin.DispLine(Tuple.TupleSub(RowEdgeFirst1,Tuple.TupleMult(RectLength2,Cos(AngleCheck))),221 Tuple.TupleSub(ColumnEdgeFirst1,Tuple.TupleMult(RectLength2,Sin(AngleCheck))),222 Tuple.TupleAdd(RowEdgeFirst1,Tuple.TupleMult(RectLength2,Cos(AngleCheck))),223 Tuple.TupleAdd(ColumnEdgeFirst1,Tuple.TupleMult(RectLength2,Sin(AngleCheck))));224 xwin.DumpWindow('png','tmp\Mea041');225 xwin.DispLine(Tuple.TupleSub(RowEdgeSecond1,Tuple.TupleMult(RectLength2,Cos(AngleCheck))),226 Tuple.TupleSub(ColumnEdgeSecond1,Tuple.TupleMult(RectLength2,Sin(AngleCheck))),227 Tuple.TupleAdd(RowEdgeSecond1,Tuple.TupleMult(RectLength2,Cos(AngleCheck))),228 Tuple.TupleAdd(ColumnEdgeSecond1,Tuple.TupleMult(RectLength2,Sin(AngleCheck))));229 xwin.DumpWindow('png','tmp\Mea042');230 xwin.DispLine(Tuple.TupleSub(RowEdgeFirst2,Tuple.TupleMult(RectLength2,Cos(AngleCheck))),231 Tuple.TupleSub(ColumnEdgeFirst2,Tuple.TupleMult(RectLength2,Sin(AngleCheck))),232 Tuple.TupleAdd(RowEdgeFirst2,Tuple.TupleMult(RectLength2,Cos(AngleCheck))),233 Tuple.TupleAdd(ColumnEdgeFirst2,Tuple.TupleMult(RectLength2,Sin(AngleCheck))));234 xwin.DumpWindow('png','tmp\Mea043');235 xwin.DispLine(Tuple.TupleSub(RowEdgeSecond2,Tuple.TupleMult(RectLength2,Cos(AngleCheck))),236 Tuple.TupleSub(ColumnEdgeSecond2,Tuple.TupleMult(RectLength2,Sin(AngleCheck))),237 Tuple.TupleAdd(RowEdgeSecond2,Tuple.TupleMult(RectLength2,Cos(AngleCheck))),238 Tuple.TupleAdd(ColumnEdgeSecond2,Tuple.TupleMult(RectLength2,Sin(AngleCheck))));239 xwin.DumpWindow('png','tmp\Mea044');240 NumLeads := (Tuple.TupleLength(IntraDistance1)+Tuple.TupleLength(IntraDistance2));241 MeasureNumLabel.Caption := Format('Number of leads: %2d',[NumLeads]);242 MinDistance := Tuple.TupleMin(Tuple.TupleConcat(InterDistance1,InterDistance2));243 MeasureDistLabel.Caption := Format('Minimum lead distance: %6.3f',[double(MinDistance)]);244 end;245 xwin.DumpWindow('png','tmp\Mea09');246 end;247 Sys.SetSystem('flush_graphic','true');248 // Force the graphics window to be updated by displaying an empty circle.249 xwin.DispCircle(-1,-1,0);250 end;251 252 //------------------253 254 procedure Tmwin.FormCreate(Sender: TObject);255 begin256 Set8087CW($27f);//设置FPU浮点计算参数,一般很少见257 HXCtrl.ControlInterface.QueryInterface(IID_IHWindowX,xwin);//设置Halcon控件接口258 Framegrabber := CoHFramegrabberX.Create;//设置图像输入,文件或相机259 ShapeModel := CoHShapeModelX.Create;//创建匹配模型变量260 //---------------261 RectangleRegion := CoHRegionX.Create;//建立一个矩形,作为检测区262 Rectangle1 := CoHRegionX.Create;//建立辅助测区263 Rectangle2 := CoHRegionX.Create;//建立辅助测区264 265 Matrix := CoHHomMat2DX.Create;//建立 矩阵变量,用于传递模型参数266 Tuple := CoHTupleX.Create;//建立 Tuple元组变量,用于传递模型参数267 Sys := CoHSystemX.Create;//建立sys系统变量,修改系统设置268 Measure1 := CoHMeasureX.Create;//建立检测变量269 Measure2 := CoHMeasureX.Create;//建立检测变量270 //--------------271 msg.Clear;272 //--------------273 {
274 OpenFramegrabber函数声明275 变量Device:输入图像列表文件名,其他变量,一般采用默认参数276 procedure OpenFramegrabber(Name:OleVariant; HorizontalResolution:OleVariant;277 VerticalResolution:OleVariant; ImageWidth:OleVariant; ImageHeight:OleVariant;278 StartRow:OleVariant; StartColumn:OleVariant; Field:OleVariant;279 BitsPerChannel:OleVariant; ColorSpace:OleVariant; Generic:OleVariant;280 ExternalTrigger:OleVariant; CameraType:OleVariant;281 Device:OleVariant;282 Port:OleVariant; LineIn:OleVariant; out AcqHandle:OleVariant);283 }284 285 Framegrabber.OpenFramegrabber('File',1,1,0,0,0,0,'default',-1,'default',286 -1,'default','pic/board.seq','default',1,-1);287 msg.Lines.Add('pic from : '+'pic/board.seq');msg.Lines.Add('');288 //-------------289 290 291 end;292 293 procedure Tmwin.FormDestroy(Sender: TObject);294 begin295 FreeAndNil(HXCtrl);296 // Framegrabber:=nil;ShapeModel:=nil; xwin:=nil;img:=nil;box:=nil;297 end;298 299 procedure Tmwin.FormShow(Sender: TObject);300 begin301 initData;302 //-----303 CreateBtn.Enabled := True;304 StartBtn.Enabled := False;305 end;306 307 procedure Tmwin.InitBtnClick(Sender: TObject);308 begin309 initData;310 end;311 312 313 procedure Tmwin.StartBtnClick(Sender: TObject);314 begin315 DoMeasurement;316 end;317 318 procedure Tmwin.CreateBtnClick(Sender: TObject);319 begin320 createShapeModel();321 StartBtn.Enabled :=true;322 end;323 324 end.

 

【《zw版·delphi与halcon系列原创教程》,网址,cnblogs.com/ziwang/】

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

你可能感兴趣的文章
linux基础概念和个人笔记总结(5)
查看>>
python requests自定义方法
查看>>
我的友情链接
查看>>
有关在linux 下跑asp.net文章博客
查看>>
vue填坑之引入iconfont字体图标
查看>>
C# DES
查看>>
Linux/Unix的精巧约定两例及其简析:目录权限和文本行数
查看>>
查看nginx/apache/php/mysql编译参数
查看>>
怎样将lib设为源文件夹
查看>>
第八周作业
查看>>
Apache Spark源码走读之8 -- Spark on Yarn
查看>>
ABP官方文档翻译 3.6 工作单元
查看>>
战力10
查看>>
最大流算法思想和理论的简单理解
查看>>
数据库--MyBatis的(insert,update,delete)三种批量操作
查看>>
谈谈Vue.js——vue-resource全攻略
查看>>
源路由 就是指定数据传输经过这个路由服务器
查看>>
关于计算一对亲和数的探索
查看>>
Codeforces Round #566 (Div. 2) C. Beautiful Lyrics
查看>>
SQL 在OPENQUERY中使用参数
查看>>