Ho scaricato il progetto ma qui a casa non ho la cam per cui nell'elaborazione ho sostituito l'immagine della cam con un file su disco.
Non ti sei accorto che nella sub:
codice:
Public Sub disegno(ByVal frame As Bitmap)
'-- verifico se è necessario invocare
If Me.InvokeRequired Then
'-- se è necessario, chiamo il delegato che rimanda alla stessa sub
Dim disegnoMD As New disegnoCallback(AddressOf disegno)
Dim args() As Object = {frame}
Me.BeginInvoke(disegnoMD, args)
Else
'-- quì verrà eseguito il codice dal Thread Corretto
PBElaborazione.Image = frame
Label1.Text = "prova"
frame.Save("C:\full2.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
PBElaborazione.Image = Image.FromFile("C:\full2.jpg")
End If
End Sub
il Me.InvokeRequired è false anche se teoricamente dovrebbe essere True? Infatti guardando la famosa finestra di gestione dei Thread quando viene richiamata la sub Disegno essa si trova effettivamente in un'altro Thread, ovvero quello di lavoro in cui effettui l'analisi del frame, ma nonostante ciò il Me.InvokeRequired è False per cui non viene chiamato successivamente il delegato. Il problema è quello.
Per risolvere il problema prima di inviare il frame alla Picturebox nella finestra di elaborazione devi tornare nel MainThread quando sei ancora sei ancora nella Finestra principale e poi inviare il frame , ad esempio:
codice:
Private Sub ElaboraFrame()
Dim frame As Bitmap
Dim bmap As Image
'copiamo l'immagine nella clipboard---
SendMessage(hWnd, WM_CAP_EDIT_COPY, 0, 0)
'prendiamo l'immagine dalla clipboard
'bmap = Clipboard.GetImage
bmap = Image.FromFile("C:\full.jpg")
frame = New Bitmap(bmap)
'Label2.Text = frame.GetPixel(1, 1).ToArgb.ToString
For i As Integer = 0 To frame.Height - 1
For j As Integer = 0 To frame.Width - 1
If (frame.GetPixel(j, i).R > 0 And frame.GetPixel(j, i).G > 0 And frame.GetPixel(j, i).B > 0) Then
frame.SetPixel(j, i, Color.Red)
End If
Next
Next
'Mia modifica*************************
disegno(frame)
'Fine mia modifica**********************
End Sub
Delegate Sub disegnoCallback(ByVal frame As Bitmap)
Public Sub disegno(ByVal frame As Bitmap)
'-- verifico se è necessario invocare
If Me.InvokeRequired Then
'-- se è necessario, chiamo il delegato che rimanda alla stessa sub
Dim disegnoMD As New disegnoCallback(AddressOf disegno)
Dim args() As Object = {frame}
Me.BeginInvoke(disegnoMD, args)
Else
'-- quì verrà eseguito il codice dal Thread Corretto
FinestraElaborazione.disegno(frame)
End If
End Sub
Così funziona ma ti ripeto il codice fatto così è poco leggibile.
Ti consiglio di riscriverlo meglio utilizzando una classe per l'eleborazione e gli eventi per le notifiche.