wowotou
技术员
技术员
  • 最后登录2014-05-14
  • 发帖数9
  • 金币252枚
  • 贡献勋章0枚
  • 社区居民
阅读:14385回复:48

第一个VB.net程序,灰度和形状匹配

楼主#
更多 发布于:2014-03-21 17:02
刚开始学Halcon,看了自带的两个VB的例子,不是太懂,动手重新写一遍,顺便加上读程序的注释,
 先看能发图? 再发程序
喜欢7

最新打赏:0人

wowotou
技术员
技术员
  • 最后登录2014-05-14
  • 发帖数9
  • 金币252枚
  • 贡献勋章0枚
  • 社区居民
沙发#
发布于:2014-03-21 17:10
源程序
'程序需要用到Halcon安装目录下
'image/pendulum和image/board中的图片
'当然也可以用摄像头
'几个关键算子的参数选择直接抄例子上的
Imports HalconDotNet

Public Class Form1

    Dim hImg As HImage
    Dim hWin1 As HWindow
    Dim hWin2 As HWindow
    Dim hFrmgrb As HFramegrabber

    Dim hRegn As HRegion     '模板定义区域
    Dim hTmpl As HTemplate   '灰度模板
    Dim hSMdl As HShapeModel '形状模板
    Dim hHMat As HHomMat2D   '变换矩阵

    Dim MTmpl As Double      '灰度均值

    Dim ICRow As Double, ICCol As Double '图像中心
    Dim RCRow As Double, RCCol As Double '区域中心
    Dim Pi As Double   'π,计算弧度用

    '控制显示的变量
    '原以为Region依赖与HWindow, 和HImage无直接关联,
    '所以设为全局变量, 以便在显示Region时用, 实验发现没必要,
    '这里还没完全理解
    '
    '不过这几个变量还可用来控制图片动态平移,缩放, 也需要设成全局变量,
    '准备加上动态平移缩放
    Dim zmX As Double, zmY As Double   '缩放比例
    Dim dsR As Integer, dsC As Integer '开始位置
    Dim dsW As Integer, dsH As Integer '显示大小


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Pi = 3.1415926535897931

        hWin1 = hWCtrl1.HalconWindow
        hWin2 = hWCtrl2.HalconWindow

        '可以使用的颜色名称
        ''black', 'white', 'red', 'green', 'blue', 'cyan', 'magenta', 'yellow',
        ''dim gray', 'gray', 'light gray', 'medium slate blue', 'coral', 'slate blue',
        ''spring green', 'orange red', 'orange', 'dark olive green', 'pink', 'cadet blue'
        hWin1.SetColor("green")
        '设置Region的填充方式
        ''fill':填充, 'margin':边缘
        hWin1.SetDraw("margin")
        hWin1.SetLineWidth(1)

        hRegn = New HRegion
        hTmpl = New HTemplate
        hSMdl = New HShapeModel
        hHMat = New HHomMat2D
        hFrmgrb = New HFramegrabber

        Button1.Enabled = True
        Button2.Enabled = False
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim row As Double, col As Double, phi As Double, len1 As Double, len2 As Double  '定义区域需要的参数

        Dim dvt As HTuple
        Dim iT As String
        Dim iW As Integer
        Dim iH As Integer

        Dim hImgR As HImage

        Button1.Enabled = False
        Button2.Enabled = False
        GroupBox1.Enabled = False
        GroupBox2.Enabled = False
        GroupBox3.Enabled = False
        GroupBox4.Enabled = False

        Label1.Text = "在第一个窗口中选择区域!"
        Me.ActiveControl = hWCtrl1

        If RadioButton4.Checked Then
            hFrmgrb.OpenFramegrabber("File", 1, 1, 0, 0, 0, 0, "default", _
                    -1, "default", -1, "default", _
                    "pendulum/pendulum.seq", "default", 1, -1)
        Else
            hFrmgrb.OpenFramegrabber("File", 1, 1, 0, 0, 0, 0, "default", _
                    -1, "default", -1, "default", _
                    "board/board.seq", "default", 1, -1)
        End If

        hImg = hFrmgrb.GrabImage
        hImg.GetImagePointer1(iT, iW, iH)

        If RadioButton9.Checked Then
            '原始
            zmX = 1
            zmY = 1
        ElseIf RadioButton10.Checked Then
            '缩放,保持比例
            zmX = Math.Max(iW / hWCtrl1.Width, iH / hWCtrl1.Height)
            zmY = zmX
        Else
            '拉伸,可能变形
            zmX = iW / hWCtrl1.Width
            zmY = iH / hWCtrl1.Height
        End If
        '设置图像被显示的区域
        '特殊用法:
        'SetPart(-1,-1,-1,-1): 显示窗口大小的部分,即图像不缩放
        'SetPart(0,0,-1,-1): 显示全部图像,并缩放到适合窗口大小
        dsW = Math.Round(zmX * hWCtrl1.Width)
        dsH = Math.Round(zmY * hWCtrl1.Height)
        dsR = 0
        dsC = 0
        hWin1.SetPart(dsR, dsC, dsR + dsH - 1, dsC + dsW - 1)
        hWin2.SetPart(dsR, dsC, dsR + dsH - 1, dsC + dsW - 1)

        hWin1.DispObj(hImg)
        '图像中心
        ICRow = iH / 2
        ICCol = iW / 2

        '绘制并定义一个区域
        If RadioButton5.Checked Then
            hWin1.DrawRectangle1(row, col, len1, len2)
            hRegn.GenRectangle1(row, col, len1, len2)
        ElseIf RadioButton6.Checked Then
            hWin1.DrawRectangle2(row, col, phi, len1, len2)
            hRegn.GenRectangle2(row, col, phi, len1, len2)
        ElseIf RadioButton7.Checked Then
            hWin1.DrawCircle(row, col, len1)
            hRegn.GenCircle(row, col, len1)
        ElseIf RadioButton8.Checked Then
            hWin1.DrawEllipse(row, col, phi, len1, len2)
            hRegn.GenEllipse(row, col, phi, len1, len2)
        End If

        '区域中心
        hRegn.AreaCenter(RCRow, RCCol)

        hImgR = hImg.ReduceDomain(hRegn)

        If RadioButton1.Checked Then
            '创建一个旋转灰度模板
            '参数:
            '1.模板图像: reducedomain后的图像
            '2.金字塔层数
            '3.模板旋转的起始角度
            '4.模板旋转的角度范围
            '5.匹配时旋转角度步长
            '6.优化方式: "none", "sort"
            '7.灰度种类: "original", "normalized", "gradient", "sobel"
            hTmpl.CreateTemplateRot(hImgR, 4, 0, 2 * Pi, Pi / 180, "sort", "original")
            '计算灰度值的平均值和偏差
            MTmpl = hRegn.Intensity(hImg, dvt)
        Else
            If RadioButton2.Checked Then
                '创建模板形状图像
                '参数:
                '1.模板图像
                '2.金字塔层数
                '3.对比度阀值
                hImgR.InspectShapeModel(hRegn, 1, 30)
                '创建形状模板
                '参数:
                'Template:模板形状图像
                'NumLevels:金字塔的层数,可设为“auto”或0—10的整数
                'AngleStart:模板旋转的起始角度
                'AngleExtent:模板旋转角度范围, >=0
                'AngleStep:旋转角度的步长, >=0 and <=pi/16
                'Optimization:模板优化和模板创建方法
                'Metric:匹配方法
                'Contrast:对比度
                'MinContrast:最小对比度
                hSMdl.CreateShapeModel(hImgR, 4, 0, 2 * Pi, Pi / 180, "none", "use_polarity", 30, 10)
            End If
        End If
        '显示区域
        hWin1.DispObj(hRegn)

        Button2.Enabled = True
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If Timer1.Enabled Then
            Button2.Text = "匹配"
            Button1.Enabled = True
            GroupBox1.Enabled = True
            GroupBox2.Enabled = True
            GroupBox3.Enabled = True
            GroupBox4.Enabled = True
            Timer1.Stop()
        Else
            Button2.Text = "停止"
            Button1.Enabled = False
            Timer1.Start()
        End If
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim s1 As Double
        Dim s2 As Double
        Dim dvt As Double
        Dim men As Double

        Dim tim As Double
        Dim per As Double

        Dim HasMatch As Boolean

        Dim hImgF As HImage

        '灰度匹配返回值
        Dim Col As Double
        Dim Row As Double
        Dim Agl As Double
        Dim Err As Double
        '形状匹配返回值
        Dim RowChk As HTuple = Nothing
        Dim ColChk As HTuple = Nothing
        Dim AglChk As HTuple = Nothing
        Dim Score As HTuple = Nothing

        Dim regn As HRegion  '匹配区域

        hImg = hFrmgrb.GrabImage
        HasMatch = False
        s1 = HSystem.CountSeconds
        If RadioButton1.Checked Then  '灰度匹配
            '在图像中匹配模板
            '参数:
            '1.目标图像
            '2.起始角度
            '4.角度旋转范围
            '5.亚像素匹配:'true','false'
            '6.灰度​最大平均差异:0~255
            '7.返回值: 行,列,角度,最佳匹配的灰度​​平均发散
            hTmpl.BestMatchRotMg(hImg, 0, 2 * Pi, 30, "true", 4, Row, Col, Agl, Err)

            HasMatch = (Err < 255)
            If HasMatch Then
                '矩阵重置
                hHMat.HomMat2dIdentity()
                '匹配的区域
                hHMat.VectorAngleToRigid(New HTuple(RCRow), New HTuple(RCCol), New HTuple(0.0), _
                    New HTuple(Row), New HTuple(Col), New HTuple(Agl))
                regn = hRegn.AffineTransRegion(hHMat, "false")
                '修改模板灰度平均值
                men = regn.Intensity(hImg, dvt)
                hTmpl.SetOffsetTemplate(men - MTmpl)
                '矩阵重置
                hHMat.HomMat2dIdentity()
                '计算变换矩阵:平移,旋转
                hHMat = hHMat.HomMat2dTranslate(ICRow - Row, ICCol - Col)
                hHMat = hHMat.HomMat2dRotate(-Agl, ICRow, ICCol)

                per = (256 - Err) / 256
            End If
        Else
            '在图像中匹配模板
            '参数:
            '1.目标图像
            '2.起始角度
            '3.角度旋转范围
            '4.最小匹配度
            '5.匹配数量
            '6.模型的最大重叠(被遮挡?)
            '7.亚像素,可选值: "none", "interpolation", "least_squares", "least_squares_high", "least_squares_very_high",
            '                 "max_deformation 1", "max_deformation 2", "max_deformation 3", "max_deformation 4",
            '                 "max_deformation 5", "max_deformation 6"
            '8.贪婪度: 0:可靠但最慢,1:最快,但可能遗漏,一般选0.9
            '9.返回值: 行,列,角度,得分
            hSMdl.FindShapeModel(hImg, 0, 2 * Pi, _
                0.7, 1, 0.5, "least_squares", 4, 0.9, _
                RowChk, ColChk, AglChk, Score)
            HasMatch = (RowChk.Length = 1)
            If HasMatch Then
                '矩阵重置
                hHMat.HomMat2dIdentity()
                '匹配的区域
                hHMat.VectorAngleToRigid(New HTuple(RCRow), New HTuple(RCCol), New HTuple(0.0), _
                    RowChk, ColChk, AglChk)
                regn = hRegn.AffineTransRegion(hHMat, "false")
                '矩阵重置
                hHMat.HomMat2dIdentity()
                '计算变换矩阵:平移,旋转
                hHMat = hHMat.HomMat2dTranslate(ICRow - RowChk, ICCol - ColChk)
                hHMat = hHMat.HomMat2dRotate(-AglChk, New HTuple(ICRow), New HTuple(ICCol))

                per = Score.D
            End If
        End If

        s2 = HSystem.CountSeconds
        If HasMatch Then
            '变换图像
            hImgF = hImg.AffineTransImage(hHMat, "constant", "false")
            hImgF = hImgF.FullDomain
            '显示结果
            hWin1.DispObj(hImg)
            hWin1.DispRegion(regn)
            hWin2.DispObj(hImgF)
        Else
            hWin1.DispObj(hImg)
        End If
        tim = (s2 - s1) * 1000
        Label1.Text = String.Format("耗时:{0,7:F4}ms, 匹配度:{1,7:F4}", tim, per)

        '内存回收, 习惯的Delphi就因为这两句被放弃 :(
        GC.Collect()
        GC.WaitForPendingFinalizers()
    End Sub

End Class
bigpandagd
工程师
工程师
  • 最后登录2020-07-28
  • 发帖数157
  • 金币3509枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
板凳#
发布于:2014-03-21 19:43
樓主初學就能做到這樣啊,真的太強了。感謝分享!
no_ROI
助理工程师
助理工程师
  • 最后登录2020-06-05
  • 发帖数126
  • 金币1189枚
  • 贡献勋章0枚
地板#
发布于:2014-03-22 01:01
楼主够强大的啊,新手都这样
gpf200858
技术员
技术员
  • 最后登录2020-10-27
  • 发帖数110
  • 金币718枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
4楼#
发布于:2014-03-22 09:07
有这个心态必须能学好了~~~
halcon520
高级工程师
高级工程师
  • 最后登录2020-10-18
  • 发帖数329
  • 金币6710枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
  • 喜欢达人
5楼#
发布于:2014-03-22 12:45
上vb.net的例子工程看看
wowotou
技术员
技术员
  • 最后登录2014-05-14
  • 发帖数9
  • 金币252枚
  • 贡献勋章0枚
  • 社区居民
6楼#
发布于:2014-03-23 16:42
增加显示平移和缩放, 还有点小问题, 基本弄明白了, 不再改,  直接上工程
附件名称/大小 下载次数 最后更新
hc02.zip (556KB)  289 2014-03-23 16:40 售价1金币[记录]
静止疯
初学者
初学者
  • 最后登录2016-01-23
  • 发帖数4
  • 金币63枚
  • 贡献勋章0枚
  • 社区居民
7楼#
发布于:2014-04-29 21:02
谢谢楼主分享。。。。。。。。
pureforce
高级工程师
高级工程师
  • 最后登录2020-10-25
  • 发帖数309
  • 金币4647枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
8楼#
发布于:2014-04-30 09:29
謝謝分享  剛好可以好好復習VB
yaoquanjun
工程师
工程师
  • 最后登录2017-09-24
  • 发帖数113
  • 金币778枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
9楼#
发布于:2014-07-26 08:07
谢谢分享,一直对标定有些迷糊
pureforce
高级工程师
高级工程师
  • 最后登录2020-10-25
  • 发帖数309
  • 金币4647枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
10楼#
发布于:2014-07-28 09:09
雖然好久不用VB了,還是可以複習一下,謝謝樓主
litung
助理工程师
助理工程师
  • 最后登录2016-05-01
  • 发帖数17
  • 金币345枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
11楼#
发布于:2014-08-24 17:51
感謝分享
第一個功能ok
第二個功能有點怪怪的,有時會錯誤,圖像會跟著滑鼠動。
有時間再來研究
raoshili
初学者
初学者
  • 最后登录2014-12-17
  • 发帖数11
  • 金币46枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
12楼#
发布于:2014-10-31 11:41
litung:感謝分享
第一個功能ok
第二個功能有點怪怪的,有時會錯誤,圖像會跟著滑鼠動。
有時間再來研究
回到原帖
楼主说:刚开始学Halcon,看了自带的两个VB的例子,怎么能找到HALOCN自带的2个VB例子?
mhunter
初学者
初学者
  • 最后登录2016-09-09
  • 发帖数9
  • 金币35枚
  • 贡献勋章0枚
  • 社区居民
13楼#
发布于:2015-01-29 19:41
下载不了!钱又扣了!郁闷!!
seaman
初学者
初学者
  • 最后登录2017-07-05
  • 发帖数17
  • 金币63枚
  • 贡献勋章0枚
  • 社区居民
14楼#
发布于:2015-05-05 14:35
楼主很强呀,佩服,新手都能这样
上一页
游客

返回顶部
支付

欢迎打赏,请选择打赏金额

  • 1元
  • 6元
  • 10元
  • 66元
  • 100元

支付即代表同意《本站支付协议》 有疑问请联系客服