VB.NET與halcon聯合編程實現實時顯示和采集


實現功能:1點擊“連接相機”按鈕后,在實時顯示窗口顯示相機的實時圖像;2點擊“采集”按鈕會顯示將當前圖像采集顯示在采集顯示窗口;3點擊“關閉相機”按鈕后斷開相機連接,停止實時顯示功能。

原理:新開線程,利用委托實現實時顯示和采集顯示功能。

代碼:

Imports HalconDotNet
Imports System.Threading
Public Class Form1
Dim rtdthread As Thread '新建實時顯示線程realtimedisplay:rtdthread

'定義委托類型
Delegate Sub voidshow(ByRef ho_image As HObject)
Delegate Sub showprocesstime(ByVal hv_s As HTuple)

Public hv_ExpDefaultWinHandle As HTuple '實時顯示窗口
Public hv_ExpDefaultWinHandle1 As HTuple '采集顯示窗口
'信號標志
Public Camopening As Boolean '相機打開
Public B As Boolean '線程信號
Public C_s As Boolean '采集按鈕信號
Public YB As Boolean '樣本添加標記
'圖像ho_image 為實時顯示圖像,ho_image1為采集顯示圖像
Dim ho_Image As HObject = Nothing, ho_Image1 As HObject = Nothing
'相機name的指針
Dim hv_AcqHandle As HTuple = Nothing

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'初始化
Camopening = False '相機連接標志
HOperatorSet.GenEmptyObj(ho_Image)
HOperatorSet.GenEmptyObj(ho_Image1)
'定義窗口
hv_ExpDefaultWinHandle = HWindowControl1.HalconWindow
hv_ExpDefaultWinHandle1 = HWindowControl2.HalconWindow

End Sub
'連接相機
Private Sub OpenCamBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenCamBtn.Click
Try
Try
HOperatorSet.CloseAllFramegrabbers() '關閉所有相機
HOperatorSet.OpenFramegrabber(New HTuple("1394IIDC"), New HTuple(1), New HTuple(1), _
New HTuple(0), New HTuple(0), New HTuple(0), New HTuple(0), New HTuple("progressive"), _
New HTuple(8), New HTuple("default"), New HTuple(-1), New HTuple("false"), _
New HTuple("default"), New HTuple("000A4701120A8F4D"), New HTuple(0), New HTuple(-1), _
hv_AcqHandle) '打開相機
Camopening = True '相機連接標志

HOperatorSet.SetFramegrabberParam(hv_AcqHandle, New HTuple("camera_type"), New HTuple("7:0:0")) '設置相機參數

Catch ex As Exception

End Try
rtdthread = New Thread(AddressOf showimage)
rtdthread.Name = "myshowimage"
rtdthread.Start() '線程開始

Catch ex As Exception

End Try


End Sub
'rtd線程
Private Sub showimage()
B = True
'Dim hv_Seconds1 As HTuple = Nothing, hv_Seconds0 As HTuple = Nothing
'Dim hv_s As HTuple = Nothing
Dim SI As New voidshow(AddressOf tureshowimage)

While B
'HOperatorSet.CountSeconds(hv_Seconds0)
ho_Image.Dispose()
HOperatorSet.GrabImageAsync(ho_Image, hv_AcqHandle, New HTuple(-1))
HOperatorSet.WaitSeconds(New HTuple(0.08)) '延時
HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle)
'委托輸出ho_image
Me.Invoke(SI, ho_Image)

'HOperatorSet.CountSeconds(hv_Seconds1)
'hv_s = hv_Seconds1.TupleSub(hv_Seconds0)
'Me.Invoke(New showprocesstime(AddressOf st), hv_s)
End While

End Sub
Private Sub st(ByVal hv_s As HTuple)
Dim a As Integer
a = hv_s.D
TextBox2.Text = a.ToString

End Sub
'定義委托
Private Sub tureshowimage(ByRef ho_image As HObject)
If C_s = True Then

ho_Image1.Dispose()
HOperatorSet.CopyImage(ho_image, ho_Image1)
HOperatorSet.ClearWindow(hv_ExpDefaultWinHandle1)

HOperatorSet.DispObj(ho_Image1, hv_ExpDefaultWinHandle1)
C_s = False
End If
HOperatorSet.ClearWindow(hv_ExpDefaultWinHandle)
HOperatorSet.DispObj(ho_image, hv_ExpDefaultWinHandle)

End Sub
Private Sub Form1_closing(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosing

rtdthread.Abort() '關閉rtd線程
HOperatorSet.CloseFramegrabber(hv_AcqHandle) '關閉相機
ho_Image.Dispose()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim n As Integer = 0
Do
n = n + 1
TextBox2.Text = n
If (n = 30) Then
HOperatorSet.GenEmptyObj(ho_Image)
ho_Image.Dispose()
ElseIf (n > 60) Then
Exit Do
End If

Loop While ho_Image1 Is Nothing
End Sub
'檢測
Private Sub DetectionBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DetectionBtn.Click
If Camopening = True Then

C_s = True '采集按鈕按下的信號
HOperatorSet.WaitSeconds(New HTuple(0.1)) '延時
Else
MsgBox("相機未連接!(識別)")
End If
End Sub

Private Sub CloseCamBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseCamBtn.Click
Try
If Camopening = True Then
'關閉線程
B = False
rtdthread.Abort()
'關閉相機
Try
HOperatorSet.ClearWindow(hv_ExpDefaultWinHandle)
HOperatorSet.CloseFramegrabber(hv_AcqHandle)

Catch HDevExpDefaultException1 As HalconException

End Try
ho_Image.Dispose()
ho_Image1.Dispose()
Camopening = False
Else

MsgBox("相機未連接!(關閉)")
End If
Catch ex As Exception

End Try
End Sub
End Class

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM