directshowlib-2005 Video auf dem Kopf??
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von grisu74.
-
-
Hi
Dazu müsstest mal zeigen wie Du an das Bild der Webcam kommst und wie Du das Bild dann in ein Video speicherst. Was mir auf die schnelle dazu einfällt ist das bei GDI32 Bildern der Scan0 unten links liegt und bei GDI+ oben links. Falls Du irgendwo die Höhe des Bildes für das Speichern im Video angeben kannst, versuche dort die Höhe als negativen Wert anzugeben.Mfg -Franky- -
Hallo,
ich benutze den Code aus diesem Forum.
social.msdn.microsoft.com/Foru…plication?forum=vbgeneral
Leider ist der Post geschlossen.
Gruß Udo -
-
Hallo,
beim debuggen habe ich den wert einfach mal negativ geschrieben.
Leider kein Erfolg.
Das Video ist immernoch auf dem Kopf.
Wenn ich dieses Beispiel hier verwende, ist das Bild komischerweise richtig herum.
Kannst du dir das mal ansehen?
codeproject.com/Articles/18511/Webcam-using-DirectShow-NET
Leider sind meine Programmierkenntnisse zu gering das ich den Unterschied erkenne.
Gruß Udo -
Hi
Es muss ja nicht diese Stelle sein. Du müsstest die Stelle suchen, wo das Bild in das Video geschrieben wird. In der Function SampleCB wird das Bild ja extra gedreht damit du das richtig herum sehen kannst. capturedPic.RotateFlip(RotateFlipType.RotateNoneFlipY) Daher auch meine Vermutung das dies mit GDI32 (Bottom/Left) und GDI+ (Top/Left) zusammen hängt. Ich hab jetzt auch nicht die Zeit mir die anderen Projekte anzuschauen. Da musst mal selbst Durchdebuggen wo was passiert.Mfg -Franky-Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()
-
@grisu74
Hi nur noch mal so als Nachfrage. Den Code, den Du verwendest, schreibt ja gar kein Video. Das speichert ja nur Bilder. Was steht denn jetzt auf dem Kopf? Das Video von der WebCam oder das Bild das dann davon gespeichert wird? Falls es um das Video geht, das in einer PictureBox dargestellt wird, dann könntest Du beim Interface IAMVideoControl ansetzen. IAMVideoControl.GetCaps gibt Dir entsprechende VideoControlFlags zurück. Hier prüfst Du ob der Flag VideoControlFlag_FlipHorizontal angeboten wird. Wenn ja, dann kannst Du per IAMVideoControl.SetMode entsprechenden Flag VideoControlFlag_FlipHorizontal setzen um das Video horizontal zu spiegeln. Mehr kann ich zum Thema WebCam Capture mit DirectShow nicht sagen. DirectShow ist ja auch schon ein wenig veraltet.
Falls ich was missverstanden hatte, was Du möchtest, bitte ich um Entschuldigung. Ich hatte mir am WE auch nur per Handy den Code, den Du verwendest, angeschaut.Mfg -Franky-Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()
-
@grisu74 Diese vielen, alten Code-Beispiele aus irgendwelchen (veralteten) Foren taugen nichts. Es kommt hier bei vb-paradise.de des Öfteren vor, dass sich hier ein neues Mitglied meldet und fragt, warum sein Code zum Abgreifen der WebCam nicht geht. Und ich sage dir: Es ist immer derselbe Code (bei dir jetzt mal nicht); entnommen von derselben, alten Seite. Der Code enthält irgendwelche obskuren Functions und das Bild ist am Ende 340 × 280 Pixel groß.
Ich habe das vor 2½ Jahren selbst mal gecodet – daher bitte ich um Nachsicht, wenn der Code noch nicht perfekt ist. Ich nutze AForge. Das kannst du dir im Visual-Studio-eigenen NuGet-Paket-Manager (siehe Anhang) herunterladen.
Mach dir einen Start-Button und einen Stopp-Button. Wenn du den Start-Button drückst, erscheint ein Dialogfenster, auf dem du die Kamera-Qualität einstellen kannst.
Es gibt außerdem eine Extension, die Windows auffordert, den PC während des Kamerabild-Abgreifens nicht in den Standby-Modus zu versetzen.
Übrigens: Der CommonSaveFileDialog dient nur dazu, den Ordnerpfad auszuwählen, in dem manuell gemachte "Screenshots" gespeichert werden. Du brauchst also noch einen Button.
Übrigens 2: Es kommt bei solchen Programmen vor, dass das Antivirenprogramm meldet, dass dein Programm die Webcam benutzen will. Hier klickst du dann auf "Erlauben".
Kameraprogramm
VB.NET-Quellcode
- #Disable Warning CA1707 ' Bezeichner dürfen keine Unterstriche enthalten
- #Disable Warning CA1303 ' Literale nicht als lokalisierte Parameter übergeben
- #Disable Warning CA2007 ' Aufruf von "ConfigureAwait" für erwarteten Task erwägen
- #Disable Warning CA9998
- Public NotInheritable Class Form_Main
- Private gew_Kamera As AForge.Video.DirectShow.VideoCaptureDevice 'gewählte Kamera
- Private Shared Einzelfoto As Bitmap
- Public ReadOnly Property Cameras1 As AForge.Video.DirectShow.VideoCaptureDeviceForm = New AForge.Video.DirectShow.VideoCaptureDeviceForm 'alle möglichen Kameras
- Private FehlerNr As UInt16
- Private ReadOnly Deu As New System.Globalization.CultureInfo("de-DE")
- Private Speicherpfad As String = ""
- Private Einzelfotoindex As UInt16 = 1US
- Private ReadOnly Ausgangsfarbe As Color = Color.FromArgb(84, 184, 255)
- Private ReadOnly Gruen As Color = Color.FromArgb(0, 255, 0)
- Private Property Einzelfotobedarf As Boolean
- Private Sub Form_Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Dim die_Bildschirme As Screen() = System.Windows.Forms.Screen.AllScreens()
- If die_Bildschirme.Length = 1 AndAlso (die_Bildschirme(0).Bounds.Width < 1920 OrElse die_Bildschirme(0).Bounds.Height < 1080) Then
- MessageBox.Show("Dieses Programm ist für große Bildschirme ausgelegt worden (mindestens 1920 × 1080). Es ist nur ein Bildschirm angeschlossen, und dieser hat nicht die nötigen Maße.",
- "Kameraprogramm",
- MessageBoxButtons.OK,
- MessageBoxIcon.Exclamation)
- Me.Close()
- Return
- End If
- Me.Location = New Point(0, 0)
- Button_Start.BackColor = Ausgangsfarbe
- Button_Stopp.BackColor = Ausgangsfarbe
- Button_Foto.BackColor = Ausgangsfarbe
- PictureBox1.BackColor = Color.FromArgb(0, 0, 20)
- Me.BackColor = Color.FromArgb(0, 0, 0)
- End Sub
- Private Async Sub Button_Start_Click(sender As Object, e As EventArgs) Handles Button_Start.Click
- TextBox1.Text = ""
- Await Task.Run(Sub() Starten())
- End Sub
- Private Sub Starten()
- Using SFD1 As New Microsoft.WindowsAPICodePack.Dialogs.CommonSaveFileDialog
- SFD1.Title = "Wo sollen die Bilder gespeichert werden?"
- SFD1.Filters.Add(New Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialogFilter("PNG", ".png"))
- SFD1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
- Dim Result As Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialogResult
- Me.Invoke(Sub() Result = SFD1.ShowDialog())
- If Result = Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialogResult.Ok Then
- Speicherpfad = SFD1.FileName
- Speicherpfad = Speicherpfad.Substring(0, Speicherpfad.LastIndexOfAny({"\"c}))
- Else
- Me.Invoke(Sub() Button_Start.BackColor = Ausgangsfarbe)
- Return
- End If
- End Using
- Dim Resul As DialogResult
- Me.Invoke(Sub() Resul = Cameras1.ShowDialog())
- If Resul = DialogResult.OK Then
- gew_Kamera = Cameras1.VideoDevice
- AddHandler gew_Kamera.NewFrame, New AForge.Video.NewFrameEventHandler(AddressOf Captured)
- Me.Invoke(Sub() Button_Start.Enabled = False)
- Me.Invoke(Sub() Button_Start.BackColor = Gruen)
- Me.Invoke(Sub() Button_Stopp.BackColor = Ausgangsfarbe)
- gew_Kamera.Start()
- Me.Invoke(Sub() Timer1.Start())
- End If
- End Sub
- Private Sub Captured(sender As Object, eventArgs As AForge.Video.NewFrameEventArgs)
- If Einzelfotobedarf Then
- Einzelfoto = New Bitmap(DirectCast(eventArgs.Frame.Clone(), Bitmap))
- End If
- 'try / Catch, weil er, wenn er ausgelastet ist, zeitgleich ein Bild in die Picturebox legen will und eines entnehmen will
- Try
- If eventArgs.Frame IsNot Nothing Then
- If PictureBox1.Image IsNot Nothing Then
- PictureBox1.Image.Dispose()
- End If
- PictureBox1.Image = DirectCast(eventArgs.Frame.Clone(), Image)
- End If
- Catch ex As System.InvalidOperationException
- FehlerNr += 1US
- Me.Invoke(Sub() TextBox1.Text = FehlerNr.ToString(Deu) & " × System.Invalid Operation Exception in der Prozedur ‚Captured‘")
- End Try
- End Sub
- Private Sub Button_Stopp_Click(sender As Object, e As EventArgs) Handles Button_Stopp.Click
- If gew_Kamera IsNot Nothing Then 'If für den Fall, dass gar keine Kamera gewählt worden war.
- gew_Kamera.Stop()
- TextBox1.Text = "Kamera aus"
- End If
- TextBox1.Text = TextBox1.Text + "; fertig."
- Button_Start.Enabled = True
- Button_Start.BackColor = Ausgangsfarbe
- Button_Stopp.BackColor = Gruen
- PictureBox1.Image = Nothing
- Timer1.Stop()
- GC.Collect()
- End Sub
- Private Async Sub Button_Foto_Click(sender As Object, e As EventArgs) Handles Button_Foto.Click
- Await Task.Run(Sub() Speichern())
- End Sub
- Private Sub Speichern()
- Dim D As Date = Date.Now
- Einzelfotobedarf = True
- System.Threading.Thread.Sleep(50)
- Select Case Speicherpfad
- Case Nothing
- Case Else
- If Einzelfoto IsNot Nothing Then
- Einzelfoto.Save(Speicherpfad & "\manuelles Foto" & " " & Einzelfotoindex.ToString(Deu) & " " & D.Day & "-" & D.Month & "-" & D.Year & ".png", System.Drawing.Imaging.ImageFormat.Png)
- Einzelfotoindex += 1US
- End If
- End Select
- Einzelfotobedarf = False
- End Sub
- Private Sub Form_Main_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
- Try 'du kannst nur fragen, ob die Kamera (noch) läuft, wenn eine gewählt worden war!
- If gew_Kamera IsNot Nothing Then
- If gew_Kamera.IsRunning Then
- gew_Kamera.Stop()
- End If
- Cameras1.Dispose()
- End If
- Catch ex As System.NullReferenceException
- End Try
- If Einzelfoto IsNot Nothing Then
- Einzelfoto.Dispose()
- End If
- End Sub
- Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
- WinApi.SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS Or EXECUTION_STATE.ES_SYSTEM_REQUIRED Or EXECUTION_STATE.ES_DISPLAY_REQUIRED)
- End Sub
- End Class
- Friend Module WinApi
- <Runtime.InteropServices.DllImport("kernel32.dll", CharSet:=Runtime.InteropServices.CharSet.Auto, SetLastError:=True)>
- Public Function SetThreadExecutionState(ByVal flags As EXECUTION_STATE) As EXECUTION_STATE
- End Function
- <Flags>
- Public Enum EXECUTION_STATE As Integer
- ES_AWAYMODE_REQUIRED = &H40
- ES_CONTINUOUS = &H80000000
- ES_DISPLAY_REQUIRED = &H2
- ES_SYSTEM_REQUIRED = &H1
- End Enum
- End Module
- #Enable Warning CA1707 ' Bezeichner dürfen keine Unterstriche enthalten
- #Enable Warning CA1303 ' Literale nicht als lokalisierte Parameter übergeben
- #Enable Warning CA2007 ' Aufruf von "ConfigureAwait" für erwarteten Task erwägen
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Bartosz“ ()
-
-
Hallo,
danke erst mal für die Unterstützung.
@-Franky- Das Video steht auf dem Kopf. Das Bild kann ich mit Rotate drehen.
Ich möchte das ganze auf einem Surface Pro nutzen. Es ist überhaupt schwer was im Netz zu finden.
@Bartosz Ich werde dein Programm mal ausprobieren.
Letztendlich benötige ich ein Bild für eine Mängelsoftware das direkt vor Ort aufgenommen werden kann.
Gruß Udo -
Moin moin @grisu74
grisu74 schrieb:
Das Video steht auf dem Kopf.
Wie geschrieben könntest Du in der Sub SetConfigParms hinter Dim videoControl As IAMVideoControl = DirectCast(capFilter, IAMVideoControl) versuchen, ich kenne den Verweis den Du nutzt nicht, per videoControl.GetCaps entsprechende Flags auszulesen und wenn der Flag VideoControlFlag_FlipHorizontal angeboten wird, diesen per videoControl.SetMode zu setzen.
grisu74 schrieb:
Es ist überhaupt schwer was im Netz zu finden.
So würde ich das nicht sagen. Beispiele, zB auf die asbachalte API capCreateCaptureWindow sowie per DirectShow, findest wie Sand am Meer. In Bezug auf VB.NET gebe ich Dir allerdings recht. Da ist die Auswahl, die halbwegs brauchbar ist, doch sehr gering und wie @Bartosz schon angemerkt hat, kopieren die meisten immer wieder den gleichen Code der sich auf diversen Seiten wiederfindet. Beispiele per "Windows Media Foundation" für VB.NET sind sogut wie gar nicht zu finden. Dabei ist für letzteres alles sehr gut in der Microsoft Doku beschrieben.Mfg -Franky- -
Hallo,
der Code von Bartosz funktioniert für meine Zwecke gut.
Ich werde Ihn noch ein wenig bearbeiten.
@Bartosz Gibt es eine möglichkeit für Landscape und Portrait?
Vielleicht weist du da auf die schnelle was.
Ansonsten vielen Dank für die Unterstützung.
Gruß Udo
-
Ähnliche Themen
-
iEi - - Off-Topic
-