Files
cameramanager/CameraMng/FrmMain.vb
T
2025-08-01 12:44:40 +02:00

1870 lines
67 KiB
VB.net

Option Strict Off
Option Explicit On
Imports System.IO
Imports System.Runtime.InteropServices
Imports Emgu.CV
Imports System.Text
Imports System.Globalization
Imports System.Threading
Public Class FrmMain
'Implements Observer
#Region "FIELDS & PROPERTIES"
Private Enum en_status
NoImage
ImageFromCamera
Calibration
ImgCorrected
DefAree
DefTexp
DefStone
DefVentosa
End Enum
Private Enum ReadCfgResult
OK
WARNING
ERR0
ERR1
End Enum
Private Const CFG_DEFAULT As String = "Default"
Private m_sDataRoot As String = ""
Public ReadOnly Property sDataRoot As String
Get
Return m_sDataRoot
End Get
End Property
Public Sub SetDataRoot()
m_sDataRoot = GetIniValue("Data", "DataRoot", Application.StartupPath & "\DataRoot.ini")
End Sub
Private m_Image As System.Drawing.Image
Private m_ZoomFactor As Double
' Permette di aggiornare la pagina principale del programma 'SetFormStatus()'
Private status As en_status
Private frmSce As New FrmScelta
Private WithEvents ImageMng As New clsImageMng
Public WithEvents Camera As New clsCamera
Private _visione As New clsVisione(ImageMng)
Private _ActTh As Integer = 70
Private _numImage As Integer = -1
Private _maxImage As Integer = 0
Private _npProspSel As Integer = -1
Private _borderType As Integer
Private WithEvents _search As New clsRicerca(ImageMng)
Private Event _waitingCmd()
' Impiegata per simulare l'input di una stringa di processo
Private varDebug As String = "2"
#End Region ' Fields & Properties
#Region "DESTRUCTOR"
Protected Overrides Sub Finalize()
If (Camera.Connected) Then
Camera.Disconnect()
End If
MyBase.Finalize()
End Sub
#End Region ' Destructor
#Region "METHODS"
Private Sub SetFormStatus()
If Camera.Connected Then
BtnTakeFoto.ImageIndex = 0
If Not ModalitaNascosta Then
TStatus.Text = "CameraID = " & ComboBoxCameras.SelectedItem
Else
TStatus.Text = "CameraID = " & Camera.CameraID
End If
Else
BtnTakeFoto.ImageIndex = 1
TStatus.Text = "--"
End If
BtnCfg.Visible = bExtended
BtnCorrProsp.Visible = False 'bExtended
BtnVentosa.Visible = VacuumCheckEnable
btnSearch.Visible = VacuumCheckEnable
Select Case status
Case en_status.NoImage
GBCalibration.Visible = False
GBCorrected.Visible = False
GBImgFromCam.Visible = False
BtnLoad.Visible = bBtnLoad
BtnTakeFoto.Visible = True
GBDefAree.Visible = False
' Abilito la modifica della configurazione Cmaera/Cfg
ComboBoxCameras.Enabled = False
ComboBoxCameraCfg.Enabled = True
Case en_status.ImageFromCamera
GBCalibration.Visible = False
GBCorrected.Visible = False
GBImgFromCam.Visible = True
BtnLoad.Visible = bBtnLoad
BtnTakeFoto.Visible = True
GBDefAree.Visible = False
' Abilito la modifica della configurazione Cmaera/Cfg
ComboBoxCameras.Enabled = False
ComboBoxCameraCfg.Enabled = True
Case en_status.Calibration
GBCalibration.Visible = True
GBCorrected.Visible = False
GBImgFromCam.Visible = False
BtnLoad.Visible = False
BtnTakeFoto.Visible = False
GBDefAree.Visible = False
' Disabilito la modifica della configurazione Cmaera/Cfg
ComboBoxCameras.Enabled = False
ComboBoxCameraCfg.Enabled = False
Case en_status.ImgCorrected
GBCalibration.Visible = False
GBCorrected.Visible = True
GBImgFromCam.Visible = False
BtnLoad.Visible = bBtnLoad
BtnTakeFoto.Visible = True
GBDefAree.Visible = False
' Disabilito la modifica della configurazione Cmaera/Cfg
ComboBoxCameras.Enabled = False
ComboBoxCameraCfg.Enabled = False
Case en_status.DefAree
GBCalibration.Visible = False
GBCorrected.Visible = False
GBImgFromCam.Visible = False
BtnLoad.Visible = False
BtnTakeFoto.Visible = False
GBDefAree.Visible = True
BtnExpT.Visible = True
BtnStone.Visible = True
BtnVentosa.Visible = VacuumCheckEnable
BtnSaveAree.Visible = False
BtnExpT.Enabled = _visione.ExpCorrType <> clsVisione.eExpCorrMode.none
BtnAbortDefAree.Text = "Close"
' Disabilito la modifica della configurazione Cmaera/Cfg
ComboBoxCameras.Enabled = False
ComboBoxCameraCfg.Enabled = False
Case en_status.DefTexp, en_status.DefStone, en_status.DefVentosa
GBCalibration.Visible = False
GBCorrected.Visible = False
GBImgFromCam.Visible = False
BtnLoad.Visible = False
BtnTakeFoto.Visible = False
GBDefAree.Visible = True
BtnExpT.Visible = False
BtnStone.Visible = False
BtnVentosa.Visible = False
BtnSaveAree.Visible = True
BtnExpT.Enabled = _visione.ExpCorrType <> clsVisione.eExpCorrMode.none
BtnAbortDefAree.Text = "Abort"
' Disabilito la modifica della configurazione Cmaera/Cfg
ComboBoxCameras.Enabled = False
ComboBoxCameraCfg.Enabled = False
End Select
PosizionaControlli()
End Sub
' carico l'elenco delle camere attivo la connessione con quella selezionata/impostata nel file di configurazione
Public Sub LoadCamerasList()
ComboBoxCameras.Items.Clear()
' Popolo la lista 'm_idList' delle camere attualmente connesse
Camera.CameraList()
For i As Integer = 0 To Camera.m_idList.Count - 1
ComboBoxCameras.Items.Add(Camera.m_idList(i))
Next
' Connessione alla prima camera disponibile camera
If Camera.m_idList.Count > 0 Then
Dim IsValidCam As Boolean = False
For nIndexCam As Integer = 0 To Camera.m_idList.Count - 1
If Camera.m_idList(nIndexCam) = CameraID Then
ComboBoxCameras.SelectedIndex = nIndexCam
IsValidCam = True
Exit For
End If
Next
If Not IsValidCam Then
' Non esiste una configurazione
Dim sTextMsg As String = String.Format("L'identificativo della camera della configurazione corrente non è disponibile. " &
"Verificare che sia accessa oppure che esista. ")
MessageBox.Show(sTextMsg, "Avvertenza", MessageBoxButtons.OK, MessageBoxIcon.Warning)
ComboBoxCameras.SelectedIndex = 0
End If
' Attivo la
If Not ModalitaNascosta Then
Camera.Connect(ComboBoxCameras.SelectedItem)
Else
Camera.Connect(CameraID)
End If
End If
End Sub
' carico elenco CONFIGURAZIONI: se non esiste almeno una valida comunico errore
Private Function LoadCfgList() As Boolean
Dim TempListIndCfg As New List(Of String)
SearchConfigDir(TempListIndCfg)
For i As Integer = 0 To TempListIndCfg.Count - 1
ComboBoxCameraCfg.Items.Add(TempListIndCfg(i))
Next
' Seleziona la prima disponibile
If TempListIndCfg.Count > 0 Then
Dim IsCfgValid As Boolean = False
For nIndexCfg As Integer = 0 To TempListIndCfg.Count - 1
ComboBoxCameraCfg.SelectedIndex = nIndexCfg
LeggiFileConfigurazione()
If CameraID <> String.Empty Then
IsCfgValid = True
Exit For
End If
Next
If Not IsCfgValid Then
' Non esiste una configurazione
Dim sTextMsg As String = String.Format("Nessuna configurazione presenta una connessione alla camera valida. " &
"Nel file 'CamaeraMng.cgf' il campo 'CameraID' è vuoto o non assente. ")
MessageBox.Show(sTextMsg, "Avvertenza", MessageBoxButtons.OK, MessageBoxIcon.Warning)
ComboBoxCameraCfg.SelectedIndex = 0
End If
Else
' Non esiste una configurazione
Dim sTextMsg As String = String.Format("Nella cartella '{0}' non sono state trovate configurazioni valide. " &
"(CameraMng, CameraMng1, CameraMng2..)", sDataRoot)
MessageBox.Show(sTextMsg, "Avvertenza", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
Return True
End Function
Public Sub Inizializza()
SetDataRoot()
' non visualizzo pagina programma
If Not ModalitaNascosta Then FrmStart.Show()
Application.DoEvents()
SpessLastra = 0
' se non esiste almeno una configurazione valida chiudo il programma
If Not LoadCfgList() Then Me.Close()
AggiornaPulsantiVIsibili()
MostraStato()
' Questo metodo è eseguibile solo se è andato a buon fine 'LeggiFileConfigurazione'
If Not ImageMng.SetFileCalibrazione(FileLensCalib, FileCalibProsp) Then
StatoGenerale = statoGenEnum.ErroreCalibrazione
TStatus.Text = "Error in Calibration Files"
End If
Camera.LbImageStatus = LbImageStatus
ProgressBar.Minimum = 0
ProgressBar.Maximum = 100
ProgressBar.Value = 0
SetFormStatus()
' carico elenco camere attive è creo la connessione
LoadCamerasList()
'Me.Text = "ID Camera = " & Camera.CameraID
status = en_status.NoImage
SetFormStatus()
SpessLastra = ImageMng.ZCali
FrmStart.Close()
'If Camera.Connected And RichiestaFoto Then
' Camera.TakeFoto()
' RichiestaFoto = False
'End If
If VacuumCheckEnable Then
TimerMain.Enabled = True
End If
End Sub
' avvio l'evento di comunicazione con il programma OmagCUT
Private Sub StartThreadCmdProcess()
RaiseEvent _waitingCmd()
End Sub
Private Sub LeggiExif(ByVal FileName As String)
' qui potrei vedere se leggo gli exif ...
Try
Dim EW As New ExifWorks(FileName)
LbFocalLenght.Text = EW.FocalLength.ToString("0.0mm")
LbFocalLenght.Text = EW.Artist
FocalLength = EW.FocalLength
EW.Dispose()
Catch ex As Exception
End Try
End Sub
Private Sub CaliForm2Data()
Dim i As Integer
For i = 0 To 3
ImageMng.m_psrc(i).X = ImageControl1.DBoard.GetXCorner(i)
ImageMng.m_psrc(i).Y = ImageControl1.DBoard.GetYCorner(i)
ImageMng.XHpix(i) = ImageControl1.DBoard.GetXHpx(i)
ImageMng.YHpix(i) = ImageControl1.DBoard.GetYHpx(i)
Next
ImageMng.CalcolaDatiCorrezione()
ImageMng.SalvaFileCorrezioneProsp()
End Sub
Private Sub CaliData2Form()
Dim i As Integer
For i = 0 To 3
ImageControl1.DBoard.SetPuntoCorner(i, ImageMng.m_psrc(i).X, ImageMng.m_psrc(i).Y)
ImageControl1.DBoard.SetPuntoH(i, ImageMng.XHpix(i), ImageMng.YHpix(i))
Next
LbAltCali.Text = Format(ImageMng.m_ZCali, "0.00") & " mm"
LbAltRif.Text = Format(ImageMng.m_AltRif, "0.00") & " mm"
End Sub
' TODO DA sistemare
Private Sub AreaForm2Data()
Dim i As Integer
For i = 0 To 3
ImageMng.m_psrc(i).X = ImageControl1.DBoard.GetXCorner(i)
ImageMng.m_psrc(i).Y = ImageControl1.DBoard.GetYCorner(i)
Next
' ImageMng.SalvaDatiArea()
End Sub
Private Sub AreaData2Form()
Dim i As Integer
For i = 0 To 3
ImageControl1.DBoard.SetPuntoCorner(i, ImageMng.m_psrc(i).X, ImageMng.m_psrc(i).Y)
Next
End Sub
Private Sub PosizionaControlli()
' Posizione di ancoraggio (in alto a sinistra sullo schermo)
Dim x As Integer, y As Integer
Dim Width As Integer, Height As Integer
Dim XGroupBoxes As Integer
x = ImageControl1.Location.X
y = 50
Width = Me.Size.Width - x - 150
Height = Me.Size.Height - y - 40 - StatusStrip1.Height
ImageControl1.SetBounds(x, y, Width, Height)
XGroupBoxes = x + Width + 5
BtnTakeFoto.SetBounds(XGroupBoxes + 10, BtnTakeFoto.Location.Y, 60, 50)
BtnEnd.SetBounds(Me.Size.Width - 80, Me.Size.Height - 90 - StatusStrip1.Height, 60, 50)
' BtnLoad.SetBounds(XGroupBoxes + 10, BtnLoad.Location.Y, 60, 50)
y = BtnTakeFoto.Location.Y + BtnTakeFoto.Size.Height + 1
GBImgFromCam.SetBounds(XGroupBoxes, y, 100, 330)
GBCalibration.SetBounds(XGroupBoxes, 30, 100, 370)
GBCorrected.SetBounds(XGroupBoxes, y, 100, 330)
GBDefAree.SetBounds(XGroupBoxes, y, 100, 330)
'ProgressBar1.SetBounds(ImageControl1.Location.X, ImageControl1.Location.Y + ImageControl1.Size.Height / 2, ImageControl1.Size.Width, ProgressBar1.Size.Height)
'ProgressBar.Width = StatusStrip1.Size.Width - TStatus.Width
End Sub
Private Sub FineCalibrazione(ByVal bsalva As Boolean)
If bsalva Then CaliForm2Data()
ImageControl1.DBoard.VisPuntiCorner = False
ImageControl1.DBoard.VisPuntiCaliH = False
If m_Image IsNot Nothing Then
m_Image.Dispose()
m_Image = Nothing
End If
status = en_status.NoImage
ImageControl1.Image = Nothing
ImageControl1.Refresh()
SetFormStatus()
End Sub
' ricerca tutte le configurazioni disponibili
Private Sub SearchConfigDir(ListIndCfg As List(Of String))
' verifico se esiste la configurazione standard
If File.Exists(m_sDataRoot & "\CameraMng.cfg") Then
ListIndCfg.Add(CFG_DEFAULT)
End If
' ricerco tutte le configurazioni numerate esistenti
For Index As Integer = 0 To 10
If File.Exists(m_sDataRoot & Index.ToString & "\CameraMng.cfg") Then
ListIndCfg.Add(Index.ToString)
End If
Next
End Sub
' Costruisco il percorso del file letto da configurazione
Private Sub IsCorrectFilePathReadFromCfg(DirToReadCfg As String, ByRef sStringPath As String, ByRef sMsg As String)
Dim bOk As ReadCfgResult = ReadCfgResult.OK
sStringPath = sStringPath.Trim
If Not sStringPath.StartsWith("\") And Not sStringPath.StartsWith(".\") Then
' Warning! il percorso potrebbe non essere relativo
If sStringPath.Contains("CameraMng") Then
' Errore! il percorso contiene un riferimento alla cartella
bOk = ReadCfgResult.ERR0
Else
bOk = ReadCfgResult.WARNING
sStringPath = DirToReadCfg & "\" & sStringPath
End If
Else
' OK! il percorso è potenzialmente correto
If sStringPath.Contains("\CameraMng") Then
' Errore! il percorso contiene un riferimento alla cartella
bOk = ReadCfgResult.ERR1
Else
' rimuovo il primo carattere se è il punto (".")
If sStringPath.StartsWith(".") Then sStringPath.Remove(0, 1)
' Ok! il percorso è accettato
bOk = ReadCfgResult.OK
sStringPath = DirToReadCfg & sStringPath
End If
End If
CreateMsgTextErr(bOk, sStringPath, sMsg)
End Sub
Private Sub CreateMsgTextErr(ReadCfg As ReadCfgResult, sStringPath As String, ByRef sMsg As String)
Select Case ReadCfg
Case ReadCfgResult.WARNING
sMsg &= String.Format(" · Il percorso relativo '{0}' deve iniziare con '.\'.", sStringPath) & vbCrLf
Case ReadCfgResult.ERR0
sMsg &= String.Format(" · Il percorso '{0}' contiene un riferimento alla cartella '.\CameraMng'.", sStringPath) & vbCrLf
Case ReadCfgResult.ERR1
sMsg &= String.Format(" · Il percorso '{0}' contiene un riferimento alla cartella '.\CameraMng', deve essere sostituito con {1}.", sStringPath, sStringPath.Replace("CameraMng", "")) & vbCrLf
End Select
End Sub
' procedo alla lettura del file *.cfg
Private Sub LeggiFileConfigurazione()
If String.IsNullOrEmpty(m_sDataRoot) Then SetDataRoot()
Dim NomeFileCfg, TmpString As String
Dim DirToReadCfg As String
Dim TmpInt As Integer
Dim TmpDou As Double
Dim reader As StreamReader
Dim nfi As NumberFormatInfo = New CultureInfo("en-US", False).NumberFormat
' tutto parte dal file DataRoot.ini che deve trovarsi nella stessa cartelle dell'eseguibile
DirToReadCfg = m_sDataRoot
' Indirizzo il programma alla configurazione associata al processo (indice tavola)
If Not ModalitaNascosta Then
Dim sCfgSelected As String = ComboBoxCameraCfg.SelectedItem
DirToReadCfg = DirToReadCfg & If(sCfgSelected = CFG_DEFAULT, "", sCfgSelected)
Else
DirToReadCfg = DirToReadCfg & MainModule.IndexProc
End If
Dim sMsgErr As String = String.Empty
' Console.WriteLine("LETTURA CONFIGURAZIONE: " & MainModule.IndexProc & " -- " & DirToReadCfg)
Debug.Assert(DirToReadCfg <> "")
NomeFileCfg = DirToReadCfg & "\CameraMng.cfg"
If Not File.Exists(NomeFileCfg) Then
Dim sTextMsg As String = String.Format("Nella cartella '{0}' non è stata trovata la configurazione '{1}'.", sDataRoot, NomeFileCfg)
MessageBox.Show(sTextMsg, "Avvertenza", MessageBoxButtons.OK, MessageBoxIcon.Warning)
If ModalitaNascosta Then
Me.Close()
End If
Return
End If
' ------- INIZIO LETTURA -------
' default sovrascritti dalla letture del file cfg
LensCalibType = 0
SaveDir = "c:\CameraMng\Data\"
FileLensCalib = "c:\CameraMng\Clens\Calib.txt"
DirTmp = "c:\CameraMng\tmp"
FileCalibProsp = "c:\CameraMng\Calib.txt"
FileCalibRes = "c:\CameraMng\CaliRes.bin"
SaveLogDir = ""
VacFileStart = ""
VacFilePos = ""
VacFileEnd = ""
VacDirModels = ""
bExtended = False
bBtnLoad = False
reader = New StreamReader(NomeFileCfg)
nfi.NumberDecimalSeparator = "."
TmpString = ""
Try
While (Not reader.EndOfStream)
TmpString = reader.ReadLine()
If TmpString.StartsWith("FileCali=") Then
FileLensCalib = Mid(TmpString, 10)
IsCorrectFilePathReadFromCfg(DirToReadCfg, FileLensCalib, sMsgErr)
ElseIf TmpString.StartsWith("LensCalibType=") Then
LensCalibType = Convert.ToInt16(Mid(TmpString, 15))
ElseIf TmpString.StartsWith("FileCaliProsp=") Then
FileCalibProsp = Mid(TmpString, 15)
IsCorrectFilePathReadFromCfg(DirToReadCfg, FileCalibProsp, sMsgErr)
ElseIf TmpString.StartsWith("FileCaliRes=") Then
FileCalibRes = Mid(TmpString, 13)
IsCorrectFilePathReadFromCfg(DirToReadCfg, FileCalibRes, sMsgErr)
ElseIf TmpString.StartsWith("Extended=") Then
bExtended = CInt(TmpString.Substring(9)) > 0 'lascio vedere tutti i bottoni
BtnCfg.Visible = bExtended
BtnCorrProsp.Visible = False 'bExtended
ElseIf TmpString.StartsWith("BtnLoad=") Then
bBtnLoad = CInt(TmpString.Substring(8)) > 0 'lascio vedere tutti i bottoni
BtnLoad.Visible = bExtended
ElseIf TmpString.StartsWith("SaveDir=") Then
SaveDir = Mid(TmpString, 9)
IsCorrectFilePathReadFromCfg(DirToReadCfg, SaveDir, sMsgErr)
ElseIf TmpString.StartsWith("TmpDir=") Then
DirTmp = Mid(TmpString, 8)
IsCorrectFilePathReadFromCfg(DirToReadCfg, DirTmp, sMsgErr)
ElseIf TmpString.StartsWith("MaxPxWidth=") Then
TmpInt = Convert.ToInt16(Mid(TmpString, 12))
If TmpInt > 0 Then ImageMng.MaxPxWidthOutImage = TmpInt
ElseIf TmpString.StartsWith("BReduction=") Then
_visione.ReduceImage = CInt(TmpString.Substring(11)) 'pyr_down nel riconoscimento bordi
ElseIf TmpString.StartsWith("LogDir=") Then
SaveLogDir = Mid(TmpString, 8)
IsCorrectFilePathReadFromCfg(DirToReadCfg, SaveLogDir, sMsgErr)
ElseIf TmpString.StartsWith("CameraID=") Then
CameraID = Mid(TmpString, 10)
CfgForm.LbCfgCameraID.Text = CameraID
ElseIf TmpString.StartsWith("Border=") Then
TmpInt = Convert.ToInt16(Mid(TmpString, 8))
If TmpInt > 0 Then bEnableBorder = True
_borderType = TmpInt
ElseIf TmpString.StartsWith("NLogImages=") Then
TmpInt = Convert.ToInt16(Mid(TmpString, 12))
_maxImage = TmpInt
ElseIf TmpString.StartsWith("RectCheckExp=") Then
Dim xl, yt, xr, yb As Integer
Dim split() As String
split = Mid(TmpString, 14).Split(",", 8, StringSplitOptions.RemoveEmptyEntries)
xl = Convert.ToInt32(split(0))
yt = Convert.ToInt32(split(1))
xr = Convert.ToInt32(split(2))
yb = Convert.ToInt32(split(3))
_visione.AddExpRectangle(xl, yt, xr, yb)
ElseIf TmpString.StartsWith("ExpCorrection=") Then
TmpInt = Convert.ToInt16(Mid(TmpString, 15))
If TmpInt < 0 Or TmpInt > 4 Then TmpInt = 0
_visione.ExpCorrType = TmpInt
ElseIf TmpString.StartsWith("RectCheckStone=") Then
Dim xl, yt, xr, yb As Integer
Dim split() As String
split = Mid(TmpString, 16).Split(",", 8, StringSplitOptions.RemoveEmptyEntries)
xl = Convert.ToInt32(split(0))
yt = Convert.ToInt32(split(1))
xr = Convert.ToInt32(split(2))
yb = Convert.ToInt32(split(3))
_visione.SetStoneRectangle(xl, yt, xr, yb)
ElseIf TmpString.StartsWith("BlackThFactor=") Then
TmpDou = 0
TmpDou = Convert.ToDouble(Mid(TmpString, 15), nfi)
If TmpDou > 0 Then _visione.ThFactorNero = TmpDou
ElseIf TmpString.StartsWith("VacuumCheckEnable=") Then
TmpInt = Convert.ToInt16(Mid(TmpString, Len("VacuumCheckEnable=") + 1))
VacuumCheckEnable = TmpInt > 0
ElseIf TmpString.StartsWith("VacFileStart=") Then
VacFileStart = Mid(TmpString, Len("StartVacFile=") + 1)
IsCorrectFilePathReadFromCfg(DirToReadCfg, VacFileStart, sMsgErr)
ElseIf TmpString.StartsWith("VacFilePos=") Then
VacFilePos = Mid(TmpString, Len("VacFilePos=") + 1)
IsCorrectFilePathReadFromCfg(DirToReadCfg, VacFilePos, sMsgErr)
ElseIf TmpString.StartsWith("VacFileEnd=") Then
VacFileEnd = Mid(TmpString, Len("VacFileEnd=") + 1)
IsCorrectFilePathReadFromCfg(DirToReadCfg, VacFileEnd, sMsgErr)
ElseIf TmpString.StartsWith("VacDirModels=") Then
VacDirModels = Mid(TmpString, Len("VacDirModels=") + 1)
IsCorrectFilePathReadFromCfg(DirToReadCfg, VacDirModels, sMsgErr)
ElseIf TmpString.StartsWith("VacMinScore=") Then
VacMinScore = Convert.ToDouble(Mid(TmpString, Len("VacMinScore=") + 1), nfi)
ElseIf TmpString.StartsWith("VacTolmm=") Then
VacTolmm = Convert.ToDouble(Mid(TmpString, Len("VacTolmm=") + 1), nfi)
End If
End While
reader.Close()
reader.Dispose()
If Not String.IsNullOrEmpty(sMsgErr) And Not ModalitaNascosta Then
MessageBox.Show(sMsgErr, NomeFileCfg, MessageBoxButtons.OK, MessageBoxIcon.Hand)
Else
Console.WriteLine("ERRORE LETTURA CONFIGURAZIONE: " & MainModule.IndexProc & " -- " & sMsgErr)
End If
Catch ex As Exception
MsgBox("Error in Cfg File " & TmpString)
End Try
' temoraneo
#If WinXp Then
_visione.SearchMode = CvEnum.RETR_TYPE.CV_RETR_EXTERNAL
#Else
_visione.SearchMode = CvEnum.RetrType.External
#End If
CreateDefaultDirs()
CfgForm.LbFileCali.Text = FileLensCalib
CfgForm.LbImageDir.Text = SaveDir
CfgForm.LbTempDir.Text = DirTmp
Camera.DownloadDir = DirTmp
AggiornaNumImage()
End Sub
Public Function CancelFile(ByVal inPath As String) As Boolean
Dim ret As Boolean
Try
Dim objFile As FileInfo = New FileInfo(inPath)
objFile.Delete()
objFile = Nothing
ret = True 'return true on success
Catch e As Exception
ret = False 'return false on error
End Try
Return ret
End Function
Public Function CreateDefaultDirs() As Boolean
Dim ret As Boolean
Dim objDir As New System.IO.DirectoryInfo(DirTmp)
Try
If Not objDir.Exists Then
objDir.Create()
End If
Catch e As Exception
ret = False 'return false on error
End Try
objDir = Nothing
objDir = New System.IO.DirectoryInfo(SaveDir)
Try
If Not objDir.Exists Then
objDir.Create()
End If
Catch e As Exception
ret = False 'return false on error
End Try
objDir = Nothing
' creo SaveLogDir
If SaveLogDir.Length > 0 Then
objDir = New System.IO.DirectoryInfo(SaveLogDir)
Try
If Not objDir.Exists Then
objDir.Create()
End If
Catch e As Exception
ret = False 'return false on error
End Try
objDir = Nothing
End If
Return ret
End Function
#Region "METODI FOTOCAMERA"
Private Sub CorrezioneCompleta()
'ImageMng.CorrezioneCompletaAsync()
ImageMng.CorrezioneCompleta()
TStatus.Text = "Image Correction"
End Sub
Public Sub RichiestaClick()
'If StatoGenerale <> statoGenEnum.StatoOk Then
' Return
'End If
Console.WriteLine("RICHIESTA CLICK: " & MainModule.IndexProc)
If Camera.Connected Then
ImageMng.ProcessStop()
Camera.TakeFoto()
TStatus.Text = "Click sent"
RichiestaFoto = False
End If
'CorrezioneAutomatica = True
End Sub
Public Sub SetSpessLastra(spess As Double)
End Sub
Public Sub RichiestaStatoCamera()
Dim NomeFile As String
Dim nf As Integer
Try
If Not Camera.Connected Then
Camera.Connect(CameraID)
'Me.Text = "ID Camera = " & Camera.CameraID
End If
NomeFile = SaveDir & "click.txt"
nf = FreeFile()
FileOpen(nf, NomeFile, OpenMode.Output)
If Camera.Connected Then
Print(nf, "Err=0")
Else
Print(nf, "Err=1")
End If
FileClose(nf)
Catch ex As Exception
' ?? che faccio?
End Try
End Sub
Private Sub SalvaNuovoBackGround()
Dim backSaved As Boolean = False
RichiestaBackGround = False
Try
Console.WriteLine("BACKIMAGE PRONTA: " & MainModule.IndexProc & " Save dir -> " & SaveDir)
_visione.BackImage = Nothing
FileCopy(Camera.PhotoFileName, SaveDir & "BackImage.jpg")
FileCopy(Camera.PhotoFileName, SaveDir & "BackImage" & Format(Now, "yyMMdd_HHmmss") & ".jpg")
'TODO qui sarebbe utile salvare i dati di scatto dell'immagine
backSaved = True
Catch ex As Exception
Console.WriteLine("BACKIMAGE PRONTA: " & MainModule.IndexProc & " - ERRORE - " & ex.Message)
End Try
Try
If backSaved Then
Dim EW As New ExifWorks(SaveDir & "BackImage.jpg")
Debug.Print("FocalLength Length " & EW.FocalLength.ToString("0.0mm"))
Debug.Print("Aperture=" & EW.Aperture.ToString("0.0"))
Debug.Print("ISO=" & EW.ISO.ToString)
Debug.Print("TimeExp=" & EW.ExposureTime.ToString("0.0"))
EW.Dispose()
End If
Catch ex As Exception
End Try
End Sub
Private Sub RilevaBordi(img As Bitmap)
If Not File.Exists(SaveDir & "BackImage.jpg") Then
Console.WriteLine("BACK IMAGE NON TROVATA: " & MainModule.IndexProc)
Return
End If
_visione.BackImageFile = SaveDir & "BackImage.jpg"
_visione.Image1 = img
'_visione.TrovaBordi(2)
_visione.BorderType = _borderType
VisualizzaThreshold()
_visione.TrovaBordiMCh(_ActTh)
ImageControl1.Image = _visione.FinalImage
End Sub
Private Sub MostraStato()
If StatoGenerale = statoGenEnum.StatoOk Then Return
If ModalitaNascosta Then Return
Select Case StatoGenerale
Case statoGenEnum.ErroreCalibrazione
MsgBox("Calibration Error")
Case statoGenEnum.ErroreCfg
MsgBox("Cfg Error")
Case statoGenEnum.ErroreSconosciuto
MsgBox("Unknown Error")
End Select
End Sub
Private Sub EseguiScatto()
' Take Picture
If Not Camera.Connected Then
Camera.Connect(Camera.CameraID)
'Me.Text = "ID Camera = " & Camera.CameraID
End If
RichiestaFoto = False
RichiestaClick()
SetFormStatus()
End Sub
Public Sub ScattoBackGround()
RichiestaBackGround = True
EseguiScatto()
End Sub
Private Sub SetThreshold()
Console.WriteLine("SET TRESHHOLD: " & MainModule.IndexProc)
_ActTh = SogliaPercentuale * 2.55
_ActTh = Math.Min(_ActTh, 255)
VisualizzaThreshold()
End Sub
Public Sub RipetiThreshold()
SetThreshold()
VisualizzaThreshold()
_visione.ApplicaTreshold(_ActTh)
ImageControl1.Image = _visione.FinalImage
End Sub
Private Sub SalvaImmagineCiclica()
If _maxImage <= 0 Then Return
If SaveLogDir.Length = 0 Then Return
Try
AggiornaNumImage()
FileCopy(Camera.PhotoFileName, SaveLogDir & "Image" & _numImage.ToString("000") & ".jpg")
'FileCopy(Camera.PhotoFileName, SaveDir & "BackImage" & Format(Now, "yyMMdd_HHmmss") & ".jpg")
' RichiestaBackGround = False
Catch ex As Exception
End Try
End Sub
Private Sub AggiornaNumImage()
If _maxImage <= 0 Then Return
If SaveLogDir.Length = 0 Then Return
If _numImage >= 0 Then
_numImage = _numImage + 1
If _numImage > _maxImage Then
_numImage = 1
End If
Return
End If
Dim NomiFiles() As String
' devo capire dove ero arrivato
NomiFiles = Directory.GetFiles(SaveLogDir, "Image???.jpg")
Dim i As Integer
Dim maxDateIndex As Integer = -1
Dim ActualDate, MaxDate As Date
Dim ActualNumber, MaxNumber As Integer
If NomiFiles.Length = 0 Then
_numImage = 0
Return
End If
MaxDate = Directory.GetLastWriteTime(NomiFiles(0))
MaxNumber = CInt(NomiFiles(0).Substring(NomiFiles(0).Length - 7, 3))
For i = 1 To NomiFiles.Length - 1
ActualDate = Directory.GetLastWriteTime(NomiFiles(i))
ActualNumber = CInt(NomiFiles(i).Substring(NomiFiles(i).Length - 7, 3))
If ActualNumber > MaxNumber Then
MaxNumber = ActualNumber
End If
If ActualDate > MaxDate Then
MaxDate = ActualDate
maxDateIndex = i
End If
Next
' se ho ancora numeri disponibili
If MaxNumber < _maxImage Then
_numImage = MaxNumber + 1
' altrimenti sovrascrivo quello con la data più grande
ElseIf maxDateIndex > -1 Then
_numImage = CInt(NomiFiles(maxDateIndex).Substring(NomiFiles(maxDateIndex).Length - 7, 3)) + 1
End If
End Sub
Public Sub SetSearchMode(smode As Integer)
If smode >= 0 AndAlso smode <= 3 Then
_visione.SearchMode = smode
Else
#If WinXp Then
_visione.SearchMode = CvEnum.RETR_TYPE.CV_RETR_EXTERNAL
#Else
_visione.SearchMode = CvEnum.RetrType.External
#End If
End If
End Sub
#End Region ' Metodi fotocamera
<DllImport("kernel32")>
Private Shared Function GetPrivateProfileString(ByVal section As String, ByVal key As String, ByVal def As String, ByVal retVal As StringBuilder, ByVal size As Integer, ByVal filePath As String) As Integer
End Function
Public Function GetIniValue(section As String, key As String, filename As String, Optional defaultValue As String = "") As String
Dim sb As New StringBuilder(500)
If GetPrivateProfileString(section, key, defaultValue, sb, sb.Capacity, filename) > 0 Then
Return sb.ToString
Else
Return defaultValue
End If
End Function
Public Sub SetDefaultCamera(Optional resetID As Boolean = False)
Dim NomeFileCfg, TmpString As String
Dim NomeFileTempCfg, DirToReadCfg As String
Dim SaveFileCfg As String
Dim NomeFileIni As String
Dim nf As Integer
Dim writer As StreamWriter
'#If DEBUG Then
' NomeFileIni = "c:\CameraMng\DataRoot.ini"
' DefaultNomeFileCfg = "c:\CameraMng\CameraMng.Cfg"
' 'DirExe = "c:\CameraMng"
'#Else
NomeFileIni = Application.StartupPath & "\DataRoot.ini"
DirToReadCfg = Application.StartupPath
'DirExe = Application.StartupPath
'#End If
Try
DirToReadCfg = GetIniValue("Data", "DataRoot", NomeFileIni, DirToReadCfg)
' aggiungiamo indici processo corrente
If Not ModalitaNascosta Then
If CFG_DEFAULT <> ComboBoxCameraCfg.SelectedItem.ToString() Then
DirToReadCfg = DirToReadCfg & ComboBoxCameraCfg.SelectedItem.ToString()
End If
Else
DirToReadCfg = DirToReadCfg & MainModule.IndexProc
End If
NomeFileCfg = DirToReadCfg & "\CameraMng.cfg"
NomeFileTempCfg = DirToReadCfg & "\CameraMngTmp.cfg"
SaveFileCfg = DirToReadCfg & "\CameraMng" & Format(Now, "yyyyMMddhhmmss") & ".cfg"
If (File.Exists(NomeFileTempCfg)) Then
File.Delete(NomeFileTempCfg)
End If
nf = FreeFile()
FileOpen(nf, NomeFileCfg, OpenMode.Input)
writer = New StreamWriter(NomeFileTempCfg)
TmpString = ""
While Not EOF(nf)
TmpString = LineInput(nf)
If Not TmpString.StartsWith("CameraID=") Then
writer.WriteLine(TmpString, CultureInfo.InvariantCulture)
End If
End While
If Not resetID Then
writer.WriteLine("CameraID=" & Camera.CameraID, CultureInfo.InvariantCulture)
End If
FileClose(nf)
writer.Close()
File.Copy(NomeFileCfg, SaveFileCfg)
If (File.Exists(NomeFileCfg)) Then
File.Delete(NomeFileCfg)
End If
File.Copy(NomeFileTempCfg, NomeFileCfg)
File.Delete(NomeFileTempCfg)
' lo faccio qui se tutto è andato bene
If resetID Then
CameraID = ""
CfgForm.LbCfgCameraID.Text = CameraID
MsgBox("ID Reset OK")
Else
MessageBox.Show("New ID succesfully written on '" & NomeFileCfg & "'.", "Avviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
CfgForm.LbCfgCameraID.Text = Camera.CameraID
End If
Catch ex As Exception
MsgBox("Error in Writing Cfg File " & ex.Message)
End Try
End Sub
Private Sub AggiornaPulsantiVIsibili()
BtnCfg.Visible = bExtended
BtnCorrProsp.Visible = False 'bExtended
BtnBackG.Visible = bEnableBorder
BtnEdgeFinder.Visible = bEnableBorder
BtnChangeThreshold.Visible = bEnableBorder
BtnIncrTh.Visible = bEnableBorder
End Sub
' salva l'area in cui si verifica l'esposizione
Private Sub SaveDefAree()
Dim NomeFileCfg, TmpString As String
Dim NomeFileTempCfg, DirToReadCfg As String
Dim SaveFileCfg As String
Dim NomeFileIni As String
Dim nf As Integer
Dim writer As StreamWriter
'#If DEBUG Then
' NomeFileIni = "c:\CameraMng\DataRoot.ini"
' DefaultNomeFileCfg = "c:\CameraMng\CameraMng.Cfg"
' DirExe = "c:\CameraMng"
'#Else
NomeFileIni = Application.StartupPath & "\DataRoot.ini"
DirToReadCfg = Application.StartupPath
'DirExe = Application.StartupPath
'#End If
Dim ExpEnableSet As Boolean = False
Dim AreaExpSet As Boolean = False
Dim AreaStoneSet As Boolean = False
Dim x1, y1, x2, y2 As Integer
Try
DirToReadCfg = GetIniValue("Data", "DataRoot", NomeFileIni, DirToReadCfg)
If Not ModalitaNascosta Then
If CFG_DEFAULT <> ComboBoxCameraCfg.SelectedItem.ToString() Then
DirToReadCfg = DirToReadCfg & ComboBoxCameraCfg.SelectedItem.ToString()
End If
Else
DirToReadCfg = DirToReadCfg & MainModule.IndexProc
End If
NomeFileCfg = DirToReadCfg & "\CameraMng.cfg"
NomeFileTempCfg = DirToReadCfg & "\CameraMngTmp.cfg"
SaveFileCfg = DirToReadCfg & "\CameraMng" & Format(Now, "yyyyMMddhhmmss") & ".cfg"
If (File.Exists(NomeFileTempCfg)) Then
File.Delete(NomeFileTempCfg)
End If
nf = FreeFile()
FileOpen(nf, NomeFileCfg, OpenMode.Input)
writer = New StreamWriter(NomeFileTempCfg)
TmpString = ""
While Not EOF(nf)
TmpString = LineInput(nf)
If TmpString.StartsWith("RectCheckExp=") AndAlso _visione.ExpCorrType <> clsVisione.eExpCorrMode.none Then
_visione.GetExpRectangle(x1, y1, x2, y2)
writer.WriteLine("RectCheckExp={0},{1},{2},{3}", x1.ToString, y1.ToString, x2.ToString, y2.ToString, CultureInfo.InvariantCulture)
AreaExpSet = True
ElseIf TmpString.StartsWith("RectCheckStone=") Then
_visione.GetStoneRectangle(x1, y1, x2, y2)
writer.WriteLine("RectCheckStone={0},{1},{2},{3}", x1.ToString, y1.ToString, x2.ToString, y2.ToString, CultureInfo.InvariantCulture)
AreaStoneSet = True
Else
writer.WriteLine(TmpString, CultureInfo.InvariantCulture)
End If
End While
'If Not ExpEnableSet Then
' writer.WriteLine("ExpCorrection=1")
'End If
If Not AreaExpSet AndAlso _visione.ExpCorrType <> clsVisione.eExpCorrMode.none Then
_visione.GetExpRectangle(x1, y1, x2, y2)
writer.WriteLine("RectCheckExp={0},{1},{2},{3}", x1.ToString, y1.ToString, x2.ToString, y2.ToString, CultureInfo.InvariantCulture)
End If
If Not AreaStoneSet Then
_visione.GetStoneRectangle(x1, y1, x2, y2)
writer.WriteLine("RectCheckStone={0},{1},{2},{3}", x1.ToString, y1.ToString, x2.ToString, y2.ToString, CultureInfo.InvariantCulture)
End If
FileClose(nf)
writer.Close()
File.Copy(NomeFileCfg, SaveFileCfg)
If (File.Exists(NomeFileCfg)) Then
File.Delete(NomeFileCfg)
End If
File.Copy(NomeFileTempCfg, NomeFileCfg)
File.Delete(NomeFileTempCfg)
Catch ex As Exception
MsgBox("Error in Writing Cfg File " & ex.Message)
End Try
End Sub
Private Sub VisualizzaThreshold()
Dim thPerc As Double = (CDbl(_ActTh) / 255) * 100
lbThreshold.Text = _ActTh.ToString & " (" & thPerc.ToString("0.0") & "%)"
End Sub
Private Sub TestRaddrizzamento()
Dim _bmp As Bitmap = New Bitmap("c:\Temp\Test.jpg")
Dim cameraMatrix As New Matrix(Of Double)(3, 3)
'[fx 0 cx; 0 fy cy; 0 0 1]
cameraMatrix.Data(0, 0) = _bmp.Width / 2
cameraMatrix.Data(0, 1) = 0
cameraMatrix.Data(0, 2) = _bmp.Width / 2
cameraMatrix.Data(1, 0) = 0
cameraMatrix.Data(1, 1) = _bmp.Height / 2
cameraMatrix.Data(1, 2) = _bmp.Height / 2
cameraMatrix.Data(2, 0) = 0
cameraMatrix.Data(2, 1) = 0
cameraMatrix.Data(2, 2) = 1
Dim distCoeffs As New Matrix(Of Double)(1, 4)
'[k1, k2, p1, p2]
distCoeffs.Data(0, 0) = 0.17352
distCoeffs.Data(0, 1) = -0.484226
distCoeffs.Data(0, 2) = 0.00075256
distCoeffs.Data(0, 3) = -0.000269617
' rms = 2.729067
' fx = 4609.251961
' fy = 4609.251961
' cx = 3076.747294
' cy = 2073.815575
' k1 = -0.160129
' k2 = 0.167262
' p1 = -0.00901
' p2 = -0.000612
' hfov = 67.4Deg
'vfov = 48.4Deg
'rms = 2.912043
'fx = 4775.944905
'fy = 4775.944905
'cx = 3103.561924
'cy = 2033.648165
'k1 = -0.153547
'k2 = 0.127935
'p1 = -0.00626
'p2 = -0.000005
'hfov = 66Deg
'vfov = 46.1Deg
'[fx 0 cx; 0 fy cy; 0 0 1]
cameraMatrix.Data(0, 0) = 4775.944905
cameraMatrix.Data(0, 1) = 0
cameraMatrix.Data(0, 2) = 3103.561924
cameraMatrix.Data(1, 0) = 0
cameraMatrix.Data(1, 1) = 4775.944905
cameraMatrix.Data(1, 2) = 2033.648165
cameraMatrix.Data(2, 0) = 0
cameraMatrix.Data(2, 1) = 0
cameraMatrix.Data(2, 2) = 1
'[k1, k2, p1, p2]
distCoeffs.Data(0, 0) = -0.153547
distCoeffs.Data(0, 1) = 0.127935
distCoeffs.Data(0, 2) = -0.00626
distCoeffs.Data(0, 3) = -0.000005
Dim outFrame As New Image(Of Emgu.CV.Structure.Rgb, Byte)(_bmp.Width, _bmp.Height)
Dim newIntrinsecMatrix As IInputArray
CvInvoke.Undistort(New Image(Of Emgu.CV.Structure.Rgb, Byte)(_bmp), outFrame, cameraMatrix, distCoeffs, newIntrinsecMatrix)
_bmp = outFrame.Bitmap
_bmp.Save("c:\temp\Testu.png", System.Drawing.Imaging.ImageFormat.Png)
End Sub
#End Region ' Methods
#Region "EVENTS"
' Preparo il programma
Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim strWinXP As String = ""
#If WinXp Then
strWinXP = " (WinXP)"
#End If
Me.Text = "EgalTech Camera Manager" & strWinXP & " v" & System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()
BtnLoad.Visible = bExtended
ImageControl1.PanMode = True
' Carico la configurazione corrente
Inizializza()
TStatus.Text = "Initialized"
If ModalitaNascosta Then Me.Visible = False
' Avvio su un nuvo processo la comunicazione con il programma OmagCUT
Dim ThreadCmdProcess As New Thread(AddressOf StartThreadCmdProcess)
ThreadCmdProcess.Start()
End Sub
' NUOVA gestione comunicazione con OmagCUT
Public Sub WaitingForInstruction() Handles Me._waitingCmd
Dim sNewReadLine As String = Console.ReadLine
'If Not String.IsNullOrWhiteSpace(varDebug) Then sNewReadLine = varDebug
'varDebug = ""
If Not String.IsNullOrEmpty(sNewReadLine) Then
While sNewReadLine <> "CLOSE"
Dim sVal() As String = sNewReadLine.Split(","c)
If sVal.Count > 1 Then sNewReadLine = sVal(0)
Select Case sNewReadLine
Case "0"
' Primo avvio di processo
ModalitaNascosta = True
Hide()
Console.WriteLine("RICHIESTA LETTURA CONFIGURAZIONE: " & MainModule.IndexProc)
LeggiFileConfigurazione()
Case "1"
ModalitaNascosta = False
Visible = True
Case "2"
' Richiesta scatto foto e correzione
CorrezioneAutomatica = True
RichiestaBordi = False
Console.WriteLine("CORREZIONE FOTO: " & MainModule.IndexProc)
Console.WriteLine("PROCESSO: " & MainModule.IndexProc)
Console.WriteLine("CAMERA BODY CFG: " & MainModule.IndexProc & " -- " & CameraID)
Console.WriteLine("CAMERA BODY CONNECTED: " & MainModule.IndexProc & " -- " & Camera.CameraID)
RichiestaClick()
Case "3"
RichiestaStatoCamera()
Case "4"
' Salvataggio di BackImage per riconoscimento contorno
Console.WriteLine("RICHIESTA SFONDO: " & MainModule.IndexProc)
Console.WriteLine("PROCESSO: " & MainModule.IndexProc)
Console.WriteLine("CAMERA BODY CFG: " & MainModule.IndexProc & " -- " & CameraID)
Console.WriteLine("CAMERA BODY CONNECTED: " & MainModule.IndexProc & " -- " & Camera.CameraID)
ScattoBackGround()
Case "5"
' Richiesta DXF di contorno lastra
RichiestaBordi = True
If sVal.Count = 2 Then MainModule.SogliaPercentuale = sVal(1)
Console.WriteLine("RICONOSCIMENTO CONTORNO: " & MainModule.IndexProc)
Console.WriteLine("PROCESSO: " & MainModule.IndexProc)
Console.WriteLine("CAMERA BODY CFG: " & MainModule.IndexProc & " -- " & CameraID)
Console.WriteLine("CAMERA BODY CONNECTED: " & MainModule.IndexProc & " -- " & Camera.CameraID)
RichiestaClick()
Case "6"
If sVal.Count = 2 Then MainModule.SogliaPercentuale = sVal(1)
RipetiThreshold()
Case "7"
Console.WriteLine("PROCESSO ATTIVO: " & MainModule.IndexProc)
Case Else
Console.WriteLine("COMANDO '" & sNewReadLine & "' NON DECODIFICATO: " & MainModule.IndexProc)
End Select
sNewReadLine = Console.ReadLine
End While
End If
End Sub
Private Sub BtnTakeFoto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnTakeFoto.Click
CorrezioneAutomatica = False
EseguiScatto()
End Sub
Private Sub BtnCfg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCfg.Click
'CfgForm.LbDeviceDescription.Text = Camera.cameraModelFactory
CfgForm.LbDeviceStatus.Text = If(Camera.Connected, "Connected", "Disconnected")
' assegnato solo dall'evento connessione, perciò lo ribadisco
CfgForm.LbCameraID.Text = Camera.CameraID
CfgForm.ShowDialog()
End Sub
Private Sub BtnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEnd.Click
Me.Close()
End Sub
Private Sub BtnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
OpenFileDialog1.InitialDirectory = SaveDir
OpenFileDialog1.FileName = ""
OpenFileDialog1.Filter = "JPEG Format (*.JPG)|*.jpg|BMP Format (*.BMP) |*.bmp"
OpenFileDialog1.CheckFileExists = True
OpenFileDialog1.ShowDialog()
ImageMng.Corrected = False
ImageControl1.Image = Nothing
GC.Collect()
If Len(OpenFileDialog1.FileName) > 0 Then
m_Image = Nothing
m_Image = New Bitmap(OpenFileDialog1.FileName)
ImageControl1.Image = m_Image
ImageControl1.fittoscreen()
LeggiExif(OpenFileDialog1.FileName)
status = en_status.ImageFromCamera
End If
SetFormStatus()
End Sub
Private Sub BtnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSave.Click
' recupero l'immagine che avevo già salvato
Dim objBmp As New Drawing.Bitmap(SaveDir & "FinalImage.jpg")
Dim NomeFile, NomeFile2, NomeSou As String
Dim nf As Integer
Dim xyDpi As Single
KeyBoard.Text = Format(Now, "yyMMdd_HHmmss") ' la stringa di uscita
KeyBoard.ShowDialog()
' Sistemare !!!!
If Len(KeyBoard.Text) > 0 Then
' nel file jpeg non so se questo settaggio viene salvato
NomeFile = SaveDir & KeyBoard.Text & ".jpg"
xyDpi = 25.4 * ImageMng.mm2pixelAtZ ' se calibrazione distorsione lente, non serve
objBmp.SetResolution(xyDpi, xyDpi)
Try
objBmp.Save(NomeFile, System.Drawing.Imaging.ImageFormat.Jpeg)
NomeFile2 = SaveDir & "click.txt"
nf = FreeFile()
FileOpen(nf, NomeFile2, OpenMode.Output)
Print(nf, "Err=0")
FileClose(nf)
Catch
MsgBox("File Save Error")
End Try
Try
NomeSou = SaveDir & "FinalImage.txt"
NomeFile2 = SaveDir & KeyBoard.Text & ".txt"
File.Copy(NomeSou, NomeFile2, True)
Catch ex As Exception
MsgBox("File Aux Save Error")
End Try
End If
objBmp.Dispose()
objBmp = Nothing
status = en_status.NoImage
End Sub
Private Sub BtnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
'CancelFile(Camera.PhotoFileName)
CancelDir(DirTmp)
End Sub
Private Sub FrmMain_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Try
If Camera.Connected Then
Camera.Disconnect()
End If
Catch ex As Exception
End Try
End
End Sub
Private Sub ImageControl1_NewMousePosImage(pima As System.Drawing.PointF) Handles ImageControl1.NewMousePosImage
lbMousePosmm.Text = "px: X" & pima.X.ToString("0.00") & " Y" & pima.Y.ToString("0.00")
If ImageMng.Corrected Then
Try
Dim pmm As PointF
ImageMng.Pix2MMOnUndist(pima, pmm)
lbMousePosmm.Text = lbMousePosmm.Text & " mm: X" & pmm.X.ToString("0.00") & " Y" & pmm.Y.ToString("0.00")
Catch ex As Exception
End Try
End If
End Sub
Private Sub ImageControl1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs)
SetFormStatus()
End Sub
Private Sub BtnCorrCompleta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCorrCompleta.Click
frmSce.ShowDialog()
Refresh()
Me.Cursor = Cursors.WaitCursor
CorrezioneCompleta()
Me.Cursor = Cursors.Default
End Sub
Private Sub BtnCorrLens_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCorrLens.Click
Try
status = en_status.Calibration
Me.Cursor = Cursors.WaitCursor
SetFormStatus()
Refresh()
ImageMng.Correggi()
ProgressBar.Value = 0
ImageControl1.Image = ImageMng.UndistorcedImage
ImageControl1.fittoscreen()
GC.Collect()
CaliData2Form()
ImageControl1.DBoard.VisPuntiCorner = True
ImageControl1.DBoard.VisPuntiCaliH = True
ImageControl1.Refresh()
Catch ex As Exception
TStatus.Text = "Process Aborted"
Finally
Me.Cursor = Cursors.Default
End Try
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
ImageControl1.fittoscreen()
End Sub
Private Sub BtnZoom11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
ImageControl1.ZoomFactor = 1
End Sub
Private Sub TimerZoom_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerZoom.Tick
If m_ZoomFactor <> 1 And m_ZoomFactor <> 0 Then
ImageControl1.ZoomFactor = ImageControl1.ZoomFactor * m_ZoomFactor
Else
TimerZoom.Enabled = False
End If
End Sub
Private Sub BtnZoomPiu_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
m_ZoomFactor = 1.05
ImageControl1.ZoomFactor = ImageControl1.ZoomFactor * m_ZoomFactor
TimerZoom.Enabled = True
End Sub
Private Sub BtnZoomPiu_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
TimerZoom.Enabled = False
m_ZoomFactor = 1
End Sub
Private Sub FrmMain_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
PosizionaControlli()
End Sub
Private Sub BtnSaveCal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSaveCal.Click
FineCalibrazione(True)
End Sub
Private Sub BtnAbortCal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAbortCal.Click
FineCalibrazione(False)
End Sub
Private Sub BtnCorrProsp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnCorrProsp.Click
ImageMng.CorreggiProspettiva(SpessLastra)
GC.Collect()
SetFormStatus()
End Sub
Private Sub BtnZoomPan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnZoomPan.Click
ImageControl1.PanMode = Not ImageControl1.PanMode
End Sub
Private Sub LbAltCali_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LbAltCali.Click
NumPad.Text = Format(ImageMng.m_ZCali, "0.00") ' la stringa di uscita
NumPad.ShowDialog()
ImageMng.m_ZCali = Val(NumPad.Text)
LbAltCali.Text = Format(ImageMng.m_ZCali, "0.00") & " mm"
End Sub
Private Sub LbAltRif_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LbAltRif.Click
NumPad.Text = Format(ImageMng.m_AltRif, "0.00") ' la stringa di uscita
NumPad.ShowDialog()
ImageMng.m_AltRif = Val(NumPad.Text)
LbAltRif.Text = Format(ImageMng.m_AltRif, "0.00") & " mm"
End Sub
Private Sub FrmMain_VisibleChanged(sender As Object, e As System.EventArgs) Handles Me.VisibleChanged
If ModalitaNascosta Then
Me.Hide()
End If
End Sub
Private Sub cmdZoomAll_Click(sender As System.Object, e As System.EventArgs) Handles cmdZoomAll.Click
ImageControl1.fittoscreen()
End Sub
Private Sub BtnZom11_Click(sender As System.Object, e As System.EventArgs) Handles BtnZoom11.Click
ImageControl1.ZoomFactor = 1
End Sub
Private Sub cmdOpen_Click(sender As System.Object, e As System.EventArgs) Handles BtnLoad.Click
' OpenFileDialog1.InitialDirectory = SaveDir
OpenFileDialog1.InitialDirectory = SaveLogDir
OpenFileDialog1.FileName = ""
OpenFileDialog1.Filter = "JPEG Format (*.JPG)|*.jpg|BMP Format (*.BMP) |*.bmp"
OpenFileDialog1.CheckFileExists = True
OpenFileDialog1.ShowDialog()
ImageMng.Corrected = False
ImageControl1.Image = Nothing
GC.Collect()
If Len(OpenFileDialog1.FileName) > 0 Then
ImageMng.ProcessStop()
If Not m_Image Is Nothing Then
m_Image.Dispose()
End If
m_Image = Nothing
m_Image = New Bitmap(OpenFileDialog1.FileName)
ImageControl1.Image = m_Image
ImageControl1.fittoscreen()
LeggiExif(OpenFileDialog1.FileName)
status = en_status.ImageFromCamera
ImageMng.InputImage = m_Image
TStatus.Text = "Image Loaded"
End If
SetFormStatus()
If CorrezioneAutomatica Then
Me.Cursor = Cursors.WaitCursor
CorrezioneCompleta()
Me.Cursor = Cursors.Default
End If
End Sub
Private Sub ImageMng_AvanzamentoCorrezioneLente(value As Double) Handles ImageMng.AvanzamentoCorrezioneLente
If Me.InvokeRequired Then
Me.Invoke(Sub() ImageMng_AvanzamentoCorrezioneLente(value))
Return
End If
If (value >= 0 And value <= 100) Then
ProgressBar.Value = value
End If
TStatus.Text = "Image Undistortion..."
End Sub
Private Sub ImageMng_AvanzamentoCorrezioneProspettiva(value As Double) Handles ImageMng.AvanzamentoCorrezioneProspettiva
If Me.InvokeRequired Then
Me.Invoke(Sub() ImageMng_AvanzamentoCorrezioneProspettiva(value))
Return
End If
If (value >= 0 And value <= 100) Then
ProgressBar.Value = value
End If
TStatus.Text = "Image Correction..."
End Sub
Private Sub ImageMng_FineCorrezioneLente() Handles ImageMng.FineCorrezioneLente
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf ImageMng_FineCorrezioneLente))
Exit Sub
End If
ProgressBar.Value = 0
'ImageControl1.Image = ImageMng.UndistorcedImage
'ImageControl1.fittoscreen()
TStatus.Text = "Image Undistorced"
End Sub
Private Sub ImageMng_FineCorrezioneProspettiva() Handles ImageMng.FineCorrezioneProspettiva
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf ImageMng_FineCorrezioneProspettiva))
Exit Sub
End If
If Not RichiestaBordi And Not VaacumCheckReq Then
ImageMng.SaveClickMsg(0)
End If
ProgressBar.Value = 0
Try
ImageControl1.Image = ImageMng.FinalImage
ImageControl1.fittoscreen()
TStatus.Text = "Image Correction OK"
Catch ex As Exception
TStatus.Text = "Failed showing Image"
End Try
status = en_status.ImgCorrected
SetFormStatus()
End Sub
' Scarico immagine e procedo all'elaborazione
Private Sub Camera_DownloadedCompleted() Handles Camera.DownloadedCompleted
ImageMng.DownloadCompletato()
ImageMng.InputImage = Camera.CameraImage
TStatus.Text = "Image Downloaded"
Console.WriteLine("DOWNLOAD DA CAMERA COMPLETATO: " & MainModule.IndexProc)
LeggiExif(Camera.PhotoFileName)
status = en_status.ImageFromCamera
m_Image = Camera.CameraImage
ImageControl1.Image = Camera.CameraImage
ImageControl1.fittoscreen()
SetFormStatus()
If RichiestaBackGround Then
SalvaNuovoBackGround()
ImageMng.SaveClickMsg(0)
Return
End If
' potrei salvare solo se richiesta bordi ..
SalvaImmagineCiclica()
If VaacumCheckReq Then
VaacumCheckReq = False
If Len(VacFilePos) > 0 Then
ImageMng.CorrezioneCompleta()
_search.GeneraIstruzioniRicerca(VacFilePos, VacMinScore, VacTolmm)
_search.Ricerca()
ImageControl1.Image = _search.FinalImage
End If
TimerMain.Enabled = True
End If
' RichiestaBordi = True
If RichiestaBordi Then
SetThreshold()
RilevaBordi(m_Image)
Return
End If
If CorrezioneAutomatica Then
Me.Cursor = Cursors.WaitCursor
CorrezioneCompleta()
Me.Cursor = Cursors.Default
End If
If RichiestaFoto Then
RichiestaFoto = False
RichiestaClick()
Return
End If
End Sub
Private Sub ImageMng_ProcessAborted(err As Integer) Handles ImageMng.ProcessAborted
If Me.InvokeRequired Then
Me.Invoke(Sub() ImageMng_ProcessAborted(err))
Return
End If
ProgressBar.Value = 0
TStatus.Text = "Process Aborted"
End Sub
Private Sub Camera_StatusChanged() Handles Camera.StatusChanged
If Camera.Connected Then
BtnTakeFoto.ImageIndex = 0
CfgForm.LbCameraID.Text = Camera.CameraID
CfgForm.LbDeviceStatus.Text = "Connected"
Else
BtnTakeFoto.ImageIndex = 1
CfgForm.LbCameraID.Text = ""
CfgForm.LbDeviceStatus.Text = "Disconnected"
End If
End Sub
Private Sub BtnBackG_Click(sender As System.Object, e As System.EventArgs) Handles BtnBackG.Click
ScattoBackGround()
End Sub
Private Sub BtnEdgeFinder_Click(sender As System.Object, e As System.EventArgs) Handles BtnEdgeFinder.Click
_ActTh = 127
VisualizzaThreshold()
RilevaBordi(m_Image)
End Sub
Private Sub BtnChangeThreshold_Click(sender As System.Object, e As System.EventArgs) Handles BtnChangeThreshold.Click
_ActTh = _ActTh - 10
_ActTh = Math.Max(_ActTh, 1)
VisualizzaThreshold()
_visione.ApplicaTreshold(_ActTh)
ImageControl1.Image = _visione.FinalImage
End Sub
Private Sub BtnIncrTh_Click(sender As System.Object, e As System.EventArgs) Handles BtnIncrTh.Click
Dim tm As New Stopwatch
Dim t1, t2 As Long
tm.Start()
_ActTh = _ActTh + 10
_ActTh = Math.Min(_ActTh, 250)
VisualizzaThreshold()
_visione.ApplicaTreshold(_ActTh)
t1 = tm.ElapsedMilliseconds
ImageControl1.Image = _visione.FinalImage
t2 = tm.ElapsedMilliseconds
End Sub
Private Sub ImageControl1_PointSelected(n As Integer) Handles ImageControl1.PointSelected
lbXmm.Text = ImageMng.m_pworld(n).X.ToString("0.00")
lbYmm.Text = ImageMng.m_pworld(n).Y.ToString("0.00")
_npProspSel = n
'lbXmm.Text = (n + 1).ToString
End Sub
Private Sub ImageControl1_PointUnselected()
lbXmm.Text = ""
lbYmm.Text = ""
_npProspSel = -1
End Sub
Private Sub lbXmm_Click(sender As System.Object, e As System.EventArgs) Handles lbXmm.Click
If _npProspSel < 0 Then Return
NumPad.Text = CDbl(lbXmm.Text).ToString("0.00")
NumPad.ShowDialog()
ImageMng.m_pworld(_npProspSel).X = CDbl(NumPad.Text)
lbXmm.Text = ImageMng.m_pworld(_npProspSel).X.ToString("0.00")
End Sub
Private Sub lbYmm_Click(sender As System.Object, e As System.EventArgs) Handles lbYmm.Click
If _npProspSel < 0 Then Return
NumPad.Text = lbYmm.Text
NumPad.ShowDialog()
ImageMng.m_pworld(_npProspSel).Y = CDbl(NumPad.Text)
lbYmm.Text = ImageMng.m_pworld(_npProspSel).Y.ToString("0.00")
End Sub
Private Sub ImageControl1_Load(sender As System.Object, e As System.EventArgs)
End Sub
Private Sub btnSearch_Click(sender As System.Object, e As System.EventArgs) Handles btnSearch.Click
Try
If ImageMng.InputImage Is Nothing Then Return
If Not File.Exists(VacFilePos) Then
MessageBox.Show("Non esiste il file '" & VacFilePos, "ERRORE", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
If Len(VacFilePos) > 0 Then
ImageMng.CorrezioneCompleta()
_search.GeneraIstruzioniRicerca(VacFilePos, VacMinScore, VacTolmm)
_search.Ricerca()
ImageControl1.Image = _search.FinalImage
ImageControl1.fittoscreen()
End If
Catch ex As Exception
End Try
End Sub
Private Sub _search_LogMessage(msg As String) Handles _search.LogMessage
MsgBox(msg)
End Sub
Private Sub TimerMain_Tick(sender As System.Object, e As System.EventArgs) Handles TimerMain.Tick
If Not VacuumCheckEnable Then
TimerMain.Enabled = False
Return
End If
TimerMain.Enabled = False
' Check esistenza file
If (File.Exists(VacFileStart)) Then
Dim ok As Boolean = False
For i As Integer = 1 To 20
Try
File.Delete(VacFileStart)
ok = True
Catch ex As Exception
Threading.Thread.Sleep(100)
End Try
Next
If Not ok Then
MsgBox("Error on deleting File" & VacFileStart)
Return
End If
VaacumCheckReq = True
RichiestaClick()
Else
TimerMain.Enabled = True
End If
End Sub
Private Sub BtnDefAree_Click(sender As System.Object, e As System.EventArgs) Handles BtnDefAree.Click
Try
status = en_status.DefAree
Me.Cursor = Cursors.WaitCursor
SetFormStatus()
Refresh()
ImageMng.ProcessStop()
ImageMng.CorrezioneCompleta(False)
ProgressBar.Value = 0
ImageControl1.Image = ImageMng.FinalImage
ImageControl1.fittoscreen()
GC.Collect()
ImageControl1.Refresh()
Catch ex As Exception
TStatus.Text = "Process Aborted"
Finally
Me.Cursor = Cursors.Default
End Try
End Sub
Private Sub BtnAbortDefAree_Click(sender As System.Object, e As System.EventArgs) Handles BtnAbortDefAree.Click
Select Case status
Case en_status.DefAree
status = en_status.ImgCorrected
Case en_status.DefTexp, en_status.DefStone, en_status.DefVentosa
status = en_status.DefAree
End Select
ImageControl1.DBoard.VisAreaGen = False
ImageControl1.Refresh()
SetFormStatus()
End Sub
Private Sub BtnSaveAree_Click(sender As System.Object, e As System.EventArgs) Handles BtnSaveAree.Click
' TODO fare i salvataggi opportuni
Dim x1, y1, x2, y2 As Double
ImageControl1.DBoard.GetArea(x1, y1, x2, y2)
Select Case status
Case en_status.DefTexp
_visione.SetExpRectangle(x1, y1, x2, y2)
Case en_status.DefStone
_visione.SetStoneRectangle(x1, y1, x2, y2)
Case en_status.DefVentosa
If Not Directory.Exists(VacDirModels) Then
Dim sMsg As String = "Non esiste il direttorio '" & VacDirModels
MessageBox.Show(sMsg, "ERRORE", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
Dim NomeFile As String
NumPad.Text = "1"
NumPad.ShowDialog()
If Len(NumPad.Text) > 0 Then
' nel file jpeg non so se questo settaggio viene salvato
NomeFile = VacDirModels & NumPad.Text & ".png"
ImageMng.SaveModelFromRectangle(NomeFile, x1, y1, x2, y2)
End If
End Select
status = en_status.DefAree
ImageControl1.DBoard.VisAreaGen = False
ImageControl1.Refresh()
SetFormStatus()
SaveDefAree()
End Sub
Private Sub BtnExpT_Click(sender As System.Object, e As System.EventArgs) Handles BtnExpT.Click
' Prendo i valori attuali del rettangolo 0
Dim x1, y1, x2, y2 As Double
_visione.GetExpRectangle(x1, y1, x2, y2)
ImageControl1.DBoard.SetArea(x1, y1, x2, y2)
status = en_status.DefTexp
SetFormStatus()
ImageControl1.DBoard.VisAreaGen = True
ImageControl1.Refresh()
End Sub
Private Sub BtnStone_Click(sender As Object, e As System.EventArgs) Handles BtnStone.Click
' Prendo i valori attuali del rettangolo 0
Dim x1, y1, x2, y2 As Double
_visione.GetStoneRectangle(x1, y1, x2, y2)
ImageControl1.DBoard.SetArea(x1, y1, x2, y2)
status = en_status.DefStone
SetFormStatus()
ImageControl1.DBoard.VisAreaGen = True
ImageControl1.Refresh()
End Sub
Private Sub BtnVentosa_Click(sender As System.Object, e As System.EventArgs) Handles BtnVentosa.Click
ImageControl1.DBoard.SetArea(1000, 1000, 1800, 1600)
status = en_status.DefVentosa
SetFormStatus()
ImageControl1.DBoard.VisAreaGen = True
ImageControl1.Refresh()
End Sub
Private Sub ComboBoxCameras_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBoxCameras.SelectedIndexChanged
If Not ModalitaNascosta Then
LeggiFileConfigurazione()
SetFormStatus()
Camera.Connect(ComboBoxCameras.SelectedItem)
End If
End Sub
Private Sub ComboBoxCameraCfg_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBoxCameraCfg.SelectedIndexChanged
If Not ModalitaNascosta Then
LeggiFileConfigurazione()
If Not IsNothing(Camera.m_idList) Then
If Camera.m_idList.Contains(CameraID) Then
ComboBoxCameras.SelectedItem = CameraID
Else
' Non esiste una configurazione
Dim sTextMsg As String = String.Format("La configurazione " & ComboBoxCameraCfg.SelectedItem & " presenta una connessione alla camera non valida. " &
"Nel file 'CamaeraMng.cgf' il campo 'CameraID")
If String.IsNullOrEmpty(CameraID) Then
sTextMsg &= "' vuoto."
Else
sTextMsg &= ": " & CameraID & "' non è valido."
End If
MessageBox.Show(sTextMsg, "Avvertenza", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
End If
ImageMng.m_fileCaliLensRead = False
ImageMng.m_fileCaliProspRead = False
ImageMng.m_bMatProspOk = False
ImageMng.SetFileCalibrazione(FileLensCalib, FileCalibProsp)
End If
End Sub
Private Sub RefreshCameras_Click(sender As Object, e As EventArgs) Handles RefreshCameras.Click
LoadCamerasList()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
SetConfigForm.ShowDialog()
End Sub
#End Region ' Events
End Class