USB oder TCP/IP Camera VB.Net

knoddelpusch

Level-1
Beiträge
39
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich mache gerade meinen Techniker und mache als Abschluss-Projekt einen Pick-and-Place Roberter.
Mein Vorhaben ist, das ich eine "Spielfeld" auswertung über eine Camera mache. Es soll ein Bild aufgenommen werden und über VB.Net ausgewertet werden.

Ich habe die Auswahl zwischen einer USB oder einer TCP/IP.
Am Anfang wollten sie unbedingt eine TCP/IP mitlerweile ist es ihnen egal.

Meine Frage wäre jetzt welche Camera ist einfacher in ein VB Programm einzubinden ist.

Gruß
Torsten
 
Hallo,
ohne dazu jetzt etwas genaues zu wissen ...
Ich denke mal, dass du vom Hersteller eine DLL bekommst, die du einbindest - ggf. auch ein ActiveX. Ob das jetzt für EtherNet oder USB ist ist von der Komplexität sehr wahrscheinlich egal. Die Frage sollte eher sein, was die mitgelieferte Bibliothek dir so an Funktionen zur Verfügung stellt.

Aber wie auch immer - du hast dann erstmal nur ein Bild im Programmspeicher. Weißt du denn, wie man entsprechende Auswertungen des Bildes programmiert ? Diese Funktionen werden nämlich nicht Bestandteil der Kamera-DLL sein ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine stinknormale USB Webcam sollte doch genügen. Wenn du Dr. Google nach "vb .net webcam" fragst, findest du sofort Beispiele und Tutorials.
Ich selber habe schon mit emgucv und aforge gearbeitet (allerdings in C#). Beide haben schon sehr mächte Funktionen für die Bildverarbeitung mit an Bord und es gibt auch hier tonnenweise Anleitungen im Netz.

Wenn du etwas mehr industrietaugliches suchst, kann ich dir IDS Imaging empfehlen. Die haben gute USB und Ethernet Kameras und bieten gleich noch ein sehr mächtiges SDK für das Erstellen eigener Anwendungen und guten Support (kostenlos!). Allerdings sind die Preise der Kameras auch "industrietauglich"
 
@MasterOhh:
wenn du da allerdings an Halcon denkst dann setzt dieses System auch mächtiges Wissen über genau dieses System voraus - es läßt sich allerdings ziemlich problemlos in die .Net-Welt einbinden ...

Gruß
Larry
 
@MasterOhh:
wenn du da allerdings an Halcon denkst dann setzt dieses System auch mächtiges Wissen über genau dieses System voraus - es läßt sich allerdings ziemlich problemlos in die .Net-Welt einbinden ...

Gruß
Larry

Nein, Halcon kenne ich garnicht ;) .
IDS Imaging bietet ein eigenes SDK, aber auch das setzt natürlich einen gewissen Mindeststand an Programmierkenntnissen voraus.

Ansonsten halt emgucv oder aforge. Beides Open Source, beides mit sovielen Code-Beispielen im Netz, das man sich theoretisch viele Anwendungen einfach nur zusammenkopieren muss. Trotzdem sollte man auch hier etwas Ahnung vom Programmieren haben um wenigstens den Code Ansatzweise zu verstehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... ich habe zwar nicht die Frage gestellt ... aber das interessiert mich jetzt trotzdem. Ich werde mir das mal im Netz anschauen - man kann ja nie wissen ... 8)

Gruß
Larry
 
Hallo,

ob ich jetzt VB oder C# nehme ist fast egal, habe jetzt ein Jahr VB gehabt und jetzt sind wir bei C# müsste also fast egal sein.
Versteh das mit den emgucv, aforge oder Halcon, nicht so ganz, ist das so eine Art Bibliothek?

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
so ich habe jetzt mal ein VB.Net Programm geschrieben welche mir von einer USB WebCam ein Bild erstellt und dies dann in eine Schwarz Weiß bild Umwandelt.
Ich habe jetzt nur ein Problem das wenn ich das Programm schließe ich meine Rechner Neustarten muss weil ich nicht mehr auf die WebCam komme.

Code:
Imports System.IO
Imports System.Drawing.Imaging
Imports System.Runtime.InteropServices

Public Class Form1
    Dim mybild As Bitmap

    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef pDst As Byte, ByRef pSrc As Byte, ByVal ByteLen As Integer)
    Public Declare Auto Function SendMessage Lib "user32" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Const EM_LINEFROMCHAR As Integer = &HC9
    Const EM_LINEINDEX As Integer = &HBB
    Public Declare Auto Function capCreateCaptureWindow Lib "avicap32.dll" (ByVal lpszWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hWndParent As IntPtr, ByVal nID As Integer) As IntPtr
    Const WS_CHILD As Integer = &H40000000
    Const WS_VISIBLE As Integer = &H10000000
    Const WM_USER As Short = &H400S
    Const WM_CAP_START As Short = &H400S
    Const WM_CAP_EDIT_COPY As Integer = (WM_CAP_START + 30)
    Const WM_CAP_DRIVER_CONNECT As Integer = (WM_CAP_START + 10)
    Const WM_CAP_SET_PREVIEWRATE As Integer = (WM_CAP_START + 52)
    Const WM_CAP_SET_OVERLAY As Integer = (WM_CAP_START + 51)
    Const WM_CAP_SET_PREVIEW As Integer = (WM_CAP_START + 50)
    Const WM_CAP_DRIVER_DISCONNECT As Integer = (WM_CAP_START + 11)

    'Um den Aufruf der Capture Funktionen noch einfacher zu machen braucht man noch sog. Wrapper Funktionen.
    'Diese sind ganz einfach aufzurufen und übernehmen den kompilzierteren Aufruf der API Methoden.

    'Hier werden 3 erstellt:
    'CreateCaptureWindow - Zeigt das WebCam Bild auf einem Control an
    'CapturePicture - Erstellt einen Schnappschuss und gibt ihn als System.Drawing.Image zurück.
    'Disconnect - Gibt die für die WebCam benötigten Resourcen frei

    ' Handle für die WebCam.

    Dim videoHandle As System.IntPtr

    ' senden eienr Ausgabenvorschau der WebCam an das betreuende control  hWndParent.

    Public Function CreateCaptureWindow(ByRef hWndParent As IntPtr, Optional ByRef x As Integer = 0, Optional ByRef y As Integer = 0, Optional ByRef nWidth As Integer = 1280, Optional ByRef nHeight As Integer = 720, Optional ByRef nCameraID As Integer = 0) As IntPtr 'Hier wird die Cam eingestellt 1 für intern 0 extern

        Dim previewHandle As IntPtr
        previewHandle = capCreateCaptureWindow("Video", WS_CHILD + WS_VISIBLE, x, y, nWidth, nHeight, hWndParent, 1)
        SendMessage(previewHandle, WM_CAP_DRIVER_CONNECT, nCameraID, 0) '1
        SendMessage(previewHandle, WM_CAP_SET_PREVIEWRATE, 15, 0)
        SendMessage(previewHandle, WM_CAP_SET_OVERLAY, 1, 0)
        SendMessage(previewHandle, WM_CAP_SET_PREVIEW, 1, 0)
        Return previewHandle

    End Function

    Public Function CapturePicture(ByRef nCaptureHandle As IntPtr) As System.Drawing.Image
        My.Computer.Clipboard.Clear()
        SendMessage(nCaptureHandle, WM_CAP_EDIT_COPY, 0, 0)
        Return My.Computer.Clipboard.GetImage
    End Function

    Public Sub Disconnect(ByRef nCaptureHandle As IntPtr, Optional ByRef nCameraID As Integer = 0)
        SendMessage(nCaptureHandle, WM_CAP_DRIVER_DISCONNECT, nCameraID, 0) '1
    End Sub

    'Das wars! Die API wird von den Wrapper Funktionen sauber aufgerufen und die WebCam steht zur Verfügung.
    'Um das Bild nun z.B. in einer PictureBox anzuzeigen genügt folgender Code:

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        videoHandle = Me.CreateCaptureWindow(Me.picLive.Handle)
    End Sub

    Private Sub btnBildUebernehmen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBildUebernehmen.Click
        Dim BILD As Bitmap

        BILD = CapturePicture(videoHandle)
        picSchwarzWeiß.Image = BILD
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Me.Text = Now
    End Sub

    Private Sub btnSchwerzWeiß_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSchwerzWeiß.Click
        ' Wandelt das Bild in ein Graustufenbild um
        ' Gewichtung der Farben Luminanz-Umsetzung

        Dim x, y As Integer
        Dim Farbe As Color
        Dim FarbeGrau As Color
        Dim Grauwert As Integer

        Dim Bild As Bitmap = picSchwarzWeiß.Image
        Dim BildGrau As New Bitmap(Bild.Width, Bild.Height)


        For y = 0 To Bild.Height - 1
            For x = 0 To Bild.Width - 1
                Farbe = Bild.GetPixel(x, y)
                Grauwert = Farbe.R * 0.3 + Farbe.G * 0.59 + Farbe.B * 0.11 '0.3  0.59  0.11
                FarbeGrau = Color.FromArgb(Grauwert, Grauwert, Grauwert)
                BildGrau.SetPixel(x, y, FarbeGrau)
            Next
        Next

        ' Jetzt GrauBild in PictureBox anzeigen
        picSchwarzWeiß.Image = BildGrau
    End Sub

End Class

Kann mir einer Sagen woran das liegen kann?
Gruß
 
Ich hätte da eine Idee :
Du solltest beim Verlassen deiner Applikation die DisConnect-Methode aufrufen (wie es in deinem Hilfetext im Kopf der Klasse beschrieben ist).
Generell ist es bei .Net-Anwendungen immer wichtig, allokierte Resourcen wieder frei zu geben ...

Gruß
Larry
 
Moin!

VB.net? dann nimm doch AForge... da is alles drin. Bildererkennung, auswertung umwandlung usw.
Und das auswählen der Kamera machen die auch anders... Da brauchts keine Librariess

Gruß
 
Hallo
Was heisst schwer zu lernen...? Sind eben Bibliotheken zum einbinden. Damit ist dann Objekterkennung möglich. Sind auch beispiele dabei.
Gruss
 
Hallo,
aso das sind nur Biblitheken zum einbinden.
Jetzt hätte ich noch ein Frage wo ich im Intern noch nicht fündig geworden bin.
Ich habe jetzt über ein WebCam eine Bild in einer PictureBox, dieses möchte ich über einen Button auf die Farbe Weiß überprüfen
und wenn es nicht Weiß ist soll es in ein Schwarzes Pixel umgewandelt werden.
Da es nicht ein rein Weißes Pixel sein kann, muss ich da ein kleiner gleich Abfrage machen.
Meine IF Abfrage
Code:
 For x = 0 To BildS.Width - 1
            For y = 0 To BildS.Height - 1
                If Not BildS.GetPixel(x, y) = Color.Black Then
                    BildS.SetPixel(x, y, Color.White)
                End If
            Next y
        Next x
Da müsste ich ja an der Stelle "Color.Black" eine Toleranz bzw. eine kleiner gleich Abfrage machen, wie mach ich das da an der Stelle?

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
du musst die Farb-Information auf Basis ihrer ARGB-Bestandteile vergleichen - dort hättest du wieder Integer, bei denen du ein <= oder >= machen kannst.
Wenn du allerdings ein "buntes" Bild hast dann ist deine "Binarisierung" ggf. ein bißchen ausprobieren.
Also etwa so :
Code:
Dim myPixelColor as Color

und in der Schleife dann

myPixelColor = BildS.GetPixel(x, y)
If myPixelColor.A < 80 or myPixelColor.R < 80 or  myPixelColor.G < 80 or  myPixelColor.B < 80 then
   BildS.SetPixel(x, y, Color.Black)
else
   BildS.SetPixel(x, y, Color.White)
End If

Gruß
Larry
 
Guten Morgen!

@Larry: wollt ich grad schreiben

Andere Möglichkeit wäre noch das Bild umzuwandeln z. B. in Schwarzweiss... kommt aufs Bild drauf an
 
Wie groß sind denn die Bilder die du bearbeitest? GetPixel ist so ziehmlich die langsamste Variante die du dafür verwenden kannst.
Schau dir die Bitmap.LockBits Methode an. (Findest genug Beispiele dazu im Netz) Damit kannst du dein Bitmap direkt im Speicher bearbeiten (unmanaged) was deutlich schneller sein sollte.
Ansonsten, wie schon dutzende male hier erwähnt, AForge biete einige Filterfunktionen die dir evtl. helfen können.
 
Zurück
Oben