halcon中match匹配的例子(ide版和vb6版)
By
admin
at 2018-05-05 • 0人收藏 • 1919人看过

ide(11版):
不能复制代码,位置在

1 个回复 | 最后更新于 2018-05-05
登录后方可回帖

ide(11版):
不能复制代码,位置在

登录后方可回帖
上位机开发笔记 Powered By © 2006-2016 POPDES
论坛统计
Processed in 8.184 ms,
4 SQL Query(s),
697.7 KiB Memory Usage
相同功能的VB6版本代码如下:
VERSION 5.00 Object = "{6EBD9146-D219-11D2-ADE5-0000C00F4EF9}#1.9#0"; "halconx.dll" Begin VB.Form MatchingForm Caption = "Matching and Measurement Demo" ClientHeight = 8970 ClientLeft = 60 ClientTop = 345 ClientWidth = 11790 LinkTopic = "Form1" ScaleHeight = 598 ScaleMode = 3 'Pixel ScaleWidth = 786 StartUpPosition = 3 'Windows Default Begin HALCONXLibCtl.HWindowXCtrl HXCtrl Height = 7380 Left = 240 OleObjectBlob = "matching.frx":0000 TabIndex = 0 Top = 240 Width = 9690 End Begin VB.CommandButton CreateBtn Caption = "Create Model" Height = 495 Left = 10200 TabIndex = 8 Top = 240 Width = 1215 End Begin VB.Timer Timer Interval = 1 Left = 10320 Top = 4200 End Begin VB.CommandButton StopBtn Caption = "Stop" Height = 495 Left = 10200 TabIndex = 2 Top = 1680 Width = 1215 End Begin VB.CommandButton StartBtn Caption = "Start" Height = 495 Left = 10200 TabIndex = 1 Top = 960 Width = 1215 End Begin VB.Label MeasureDIstLabel Caption = "Minimum lead distance: " Height = 255 Left = 3720 TabIndex = 11 Top = 8160 Width = 2415 End Begin VB.Label MeasureTimeLabel Caption = "Time: " Height = 255 Left = 1080 TabIndex = 10 Top = 8160 Width = 855 End Begin VB.Label MeasureNumLabel Caption = "Number of leads: " Height = 255 Left = 2040 TabIndex = 9 Top = 8160 Width = 1575 End Begin VB.Label MatchingScoreLabel Caption = "Score: " Height = 255 Left = 2040 TabIndex = 7 Top = 7800 Width = 1215 End Begin VB.Label MatchingTimeLabel Caption = "Time: " Height = 255 Left = 1080 TabIndex = 6 Top = 7800 Width = 855 End Begin VB.Label MeasureLabel Caption = "Measure:" Height = 255 Left = 240 TabIndex = 5 Top = 8160 Width = 735 End Begin VB.Label MatchingLabel Caption = "Matching:" Height = 255 Left = 240 TabIndex = 4 Top = 7800 Width = 735 End Begin VB.Label Copyright Alignment = 2 'Center Caption = "?2000-2015 MVTec Software GmbH" BeginProperty Font Name = "MS Sans Serif" Size = 9.75 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 255 Left = 240 TabIndex = 3 Top = 8640 Width = 10935 End End Attribute VB_Name = "MatchingForm" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False ' HALCON/VB pattern matching and measure example ' ' ?2000-2015 MVTec Software GmbH ' ' Purpose: ' This example program shows the use of pattern matching with shape models ' to locate an object. Furthermore, it shows how to use the detected position ' and rotation of the object to construct search spaces for inspection tasks. ' In this particular example, the print on an IC is used to find the IC. From ' the found position and rotation, two measurement rectangles are constructed ' to measure the spacing between the leads of the IC. Because of the lighting ' used in this example, the leads have the saturated gray value of 255 at ' several positions and rotations, which enlarges the apparent width of the ' leads, and hence seems to reduce the spacing between the leads, although the ' same board is used in all images. Option Explicit Dim Window As HWindowX Dim Framegrabber As New HFramegrabberX Dim Img As HImageX, ImgReduced As HImageX, ModelImage As HImageX Dim Rectangle As New HRegionX, ModelRegion As HRegionX, ModelRegionTrans As HRegionX Dim Rectangle1 As New HRegionX, Rectangle2 As New HRegionX Dim ShapeModel As New HShapeModelX Dim Row As Variant, Column As Variant, Area As Variant Dim Rect1Row As Double, Rect1Col As Double Dim Rect2Row As Double, Rect2Col As Double Dim RectPhi As Double, RectLength1 As Double, RectLength2 As Double Dim Sys As New HSystemX Dim Tuple As New HTupleX Dim Matrix As New HHomMat2DX Dim Measure1 As New HMeasureX, Measure2 As New HMeasureX Dim ImgWidth As Variant, ImgHeight As Variant Private Sub Form_Load() Set Window = HXCtrl.HalconWindow Call Window.SetPart(0, 0, 491, 645) Call Framegrabber.OpenFramegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1, "default", _ -1, "default", "board/board.seq", "default", 1, -1) Set Img = Framegrabber.GrabImage() Call Window.DispImage(Img) ImgWidth = Img.GetImageSize(ImgHeight) Call Rectangle.GenRectangle1(188, 182, 298, 412) Area = Rectangle.AreaCenter(Row, Column) Rect1Row = Row - 102 Rect1Col = Column + 5 Rect2Row = Row + 107 Rect2Col = Column + 5 RectPhi = 0 RectLength1 = 170 RectLength2 = 5 CreateBtn.Enabled = True StartBtn.Enabled = False StopBtn.Enabled = False Timer.Enabled = False End Sub Private Sub CreateBtn_Click() CreateBtn.Enabled = False Call Window.SetColor("red") Call Window.SetDraw("margin") Call Window.SetLineWidth(3) Call Window.DispRegion(Rectangle) Set ImgReduced = Img.ReduceDomain(Rectangle) Set ModelImage = ImgReduced.InspectShapeModel(ModelRegion, 1, 30) Call Rectangle1.GenRectangle2(Rect1Row, Rect1Col, RectPhi, RectLength1, RectLength2) Call Rectangle2.GenRectangle2(Rect2Row, Rect2Col, RectPhi, RectLength1, RectLength2) Call ShapeModel.CreateShapeModel(ImgReduced, 4, 0, Tuple.TupleRad(360), Tuple.TupleRad(1), _ "none", "use_polarity", 30, 10) Call Window.SetColor("green") Call Window.SetDraw("fill") Call Window.DispRegion(ModelRegion) Call Window.SetColor("blue") Call Window.SetDraw("margin") Call Window.DispRegion(Rectangle1) Call Window.DispRegion(Rectangle2) StopBtn.Enabled = False StartBtn.Enabled = True End Sub Private Sub StartBtn_Click() Timer.Enabled = True CreateBtn.Enabled = False StopBtn.Enabled = True StartBtn.Enabled = False End Sub Private Sub StopBtn_Click() Timer.Enabled = False CreateBtn.Enabled = False StopBtn.Enabled = False StartBtn.Enabled = True End Sub Private Sub Timer_Timer() Action End Sub Private Sub Action() Dim S1 As Double, S2 As Double Dim RowCheck As Variant, ColumnCheck As Variant Dim AngleCheck As Variant, Score As Variant Dim Rect1RowCheck As Variant, Rect1ColCheck As Variant Dim Rect2RowCheck As Variant, Rect2ColCheck As Variant Dim RowEdgeFirst1 As Variant, ColumnEdgeFirst1 As Variant Dim AmplitudeFirst1 As Variant, RowEdgeSecond1 As Variant Dim ColumnEdgeSecond1 As Variant, AmplitudeSecond1 As Variant Dim IntraDistance1 As Variant, InterDistance1 As Variant Dim RowEdgeFirst2 As Variant, ColumnEdgeFirst2 As Variant Dim AmplitudeFirst2 As Variant, RowEdgeSecond2 As Variant Dim ColumnEdgeSecond2 As Variant, AmplitudeSecond2 As Variant Dim IntraDistance2 As Variant, InterDistance2 As Variant Dim NumLeads As Long, MinDistance As Variant Set Img = Framegrabber.GrabImage() Call Window.DispImage(Img) ' Find the IC in the current image. S1 = Sys.CountSeconds() RowCheck = ShapeModel.FindShapeModel(Img, 0, Tuple.TupleRad(360), 0.7, 1, 0.5, "least_squares", _ 4, 0.7, ColumnCheck, AngleCheck, Score) S2 = Sys.CountSeconds() MatchingTimeLabel = "Time: " & Format(((S2 - S1) * 1000), "0.00") MatchingScoreLabel = "Score: " If Not IsEmpty(RowCheck) And Not IsArray(RowCheck) Then MatchingScoreLabel = "Score: " & Format(Score, "0.00000") ' Rotate the model for visualization purposes. Call Matrix.VectorAngleToRigid(Row, Column, 0, RowCheck, ColumnCheck, AngleCheck) Set ModelRegionTrans = ModelRegion.AffineTransRegion(Matrix, "false") Call Window.SetColor("green") Call Window.SetDraw("fill") Call Window.DispRegion(ModelRegionTrans) ' Compute the parameters of the measurement rectangles. Rect1RowCheck = Matrix.AffineTransPixel(Rect1Row, Rect1Col, Rect1ColCheck) Rect2RowCheck = Matrix.AffineTransPixel(Rect2Row, Rect2Col, Rect2ColCheck) ' For visualization purposes, generate the two rectangles as regions and display them. Call Rectangle1.GenRectangle2(Rect1RowCheck, Rect1ColCheck, RectPhi + AngleCheck, _ RectLength1, RectLength2) Call Rectangle2.GenRectangle2(Rect2RowCheck, Rect2ColCheck, RectPhi + AngleCheck, _ RectLength1, RectLength2) Call Window.SetColor("blue") Call Window.SetDraw("margin") Call Window.DispRegion(Rectangle1) Call Window.DispRegion(Rectangle2) ' Do the actual masurements. S1 = Sys.CountSeconds() Call Measure1.GenMeasureRectangle2(Rect1RowCheck, Rect1ColCheck, RectPhi + AngleCheck, _ RectLength1, RectLength2, ImgWidth, ImgHeight, _ "bilinear") Call Measure2.GenMeasureRectangle2(Rect2RowCheck, Rect2ColCheck, RectPhi + AngleCheck, _ RectLength1, RectLength2, ImgWidth, ImgHeight, _ "bilinear") RowEdgeFirst1 = Measure1.MeasurePairs(Img, 2, 90, "positive", "all", ColumnEdgeFirst1, _ AmplitudeFirst1, RowEdgeSecond1, ColumnEdgeSecond1, _ AmplitudeSecond1, IntraDistance1, InterDistance1) RowEdgeFirst2 = Measure2.MeasurePairs(Img, 2, 90, "positive", "all", ColumnEdgeFirst2, _ AmplitudeFirst2, RowEdgeSecond2, ColumnEdgeSecond2, _ AmplitudeSecond2, IntraDistance2, InterDistance2) S2 = Sys.CountSeconds() MeasureTimeLabel = "Time: " & Format(((S2 - S1) * 1000), "0.00") Call Window.SetColor("red") Call Window.DispLine(Tuple.TupleSub(RowEdgeFirst1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleSub(ColumnEdgeFirst1, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _ Tuple.TupleAdd(RowEdgeFirst1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleAdd(ColumnEdgeFirst1, Tuple.TupleMult(RectLength2, Sin(AngleCheck)))) Call Window.DispLine(Tuple.TupleSub(RowEdgeSecond1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleSub(ColumnEdgeSecond1, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _ Tuple.TupleAdd(RowEdgeSecond1, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleAdd(ColumnEdgeSecond1, Tuple.TupleMult(RectLength2, Sin(AngleCheck)))) Call Window.DispLine(Tuple.TupleSub(RowEdgeFirst2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleSub(ColumnEdgeFirst2, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _ Tuple.TupleAdd(RowEdgeFirst2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleAdd(ColumnEdgeFirst2, Tuple.TupleMult(RectLength2, Sin(AngleCheck)))) Call Window.DispLine(Tuple.TupleSub(RowEdgeSecond2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleSub(ColumnEdgeSecond2, Tuple.TupleMult(RectLength2, Sin(AngleCheck))), _ Tuple.TupleAdd(RowEdgeSecond2, Tuple.TupleMult(RectLength2, Cos(AngleCheck))), _ Tuple.TupleAdd(ColumnEdgeSecond2, Tuple.TupleMult(RectLength2, Sin(AngleCheck)))) NumLeads = Tuple.TupleLength(IntraDistance1) + Tuple.TupleLength(IntraDistance2) MeasureNumLabel = "Number of leads: " & Format(NumLeads, "00") MinDistance = Tuple.TupleMin(Tuple.TupleConcat(InterDistance1, InterDistance2)) MeasureDIstLabel = "Minimum lead distance: " & Format(MinDistance, "#0.000") End If End Sub