Heyho zusammen
Mein Versuch eine Bewegungserkennung zu programmieren scheitert gerade.
Ziel ist es die geänderten Pixel rot zu markieren.
Die Funktion erhält zwei Bitmaps mit der Auflösung 640x480. Transparenz nicht vorhanden (RGB).
Die einzelnen Bytes werden ermittelt, als Farbe erkannt und danach verglichen.
Ist ein Unterschied zu erkennen, müsste das Bild an diesem Pixel rot werden.
Im anderen Fall sollte die originale Farbe übernommen werden.
Mein Versuch sieht so aus:
Jedoch bleibt das Bild komplett schwarz, obwohl zwei gefüllte Bitmaps übergeben werden.
Wo liegt der Fehler?
Gruss & Danke
Dancger
Mein Versuch eine Bewegungserkennung zu programmieren scheitert gerade.
Ziel ist es die geänderten Pixel rot zu markieren.
Die Funktion erhält zwei Bitmaps mit der Auflösung 640x480. Transparenz nicht vorhanden (RGB).
Die einzelnen Bytes werden ermittelt, als Farbe erkannt und danach verglichen.
Ist ein Unterschied zu erkennen, müsste das Bild an diesem Pixel rot werden.
Im anderen Fall sollte die originale Farbe übernommen werden.
bmp_standard
enthält das Standbild, bmp_camera
das aktuelle Frame der Webcam. bmp_difference
sollte das Bild enthalten, das den Unterschied aufzeigt.Mein Versuch sieht so aus:
VB.NET-Quellcode
- Private Function generateDiffrence(ByVal bmp_standard As Bitmap, ByVal bmp_camera As Bitmap) As Bitmap
- ' Bei beiden Bitmaps alle Bild-Daten im Speicher sperren
- Dim bmp_difference As New Bitmap(bmp_standard.Width, bmp_standard.Height, PixelFormat.Format24bppRgb)
- Dim rect_imagesize As New Rectangle(0, 0, bmp_standard.Width, bmp_standard.Height)
- Dim bmpdata_standard As BitmapData = bmp_standard.LockBits(rect_imagesize, ImageLockMode.ReadOnly, bmp_difference.PixelFormat)
- Dim bmpdata_camera As BitmapData = bmp_camera.LockBits(rect_imagesize, ImageLockMode.ReadOnly, bmp_difference.PixelFormat)
- Dim bmpdata_difference As BitmapData = bmp_difference.LockBits(rect_imagesize, ImageLockMode.WriteOnly, bmp_difference.PixelFormat)
- Dim bytes As Integer = bmpdata_standard.Stride * bmpdata_standard.Height
- Dim bytes_standard(bytes - 1), bytes_camera(bytes - 1), bytes_diffrence(bytes - 1) As Byte
- ' Die gesperrten Bilddaten in 3 Bytearrays kopieren
- InteropServices.Marshal.Copy(bmpdata_standard.Scan0, bytes_standard, 0, bytes)
- InteropServices.Marshal.Copy(bmpdata_camera.Scan0, bytes_camera, 0, bytes)
- InteropServices.Marshal.Copy(bmpdata_difference.Scan0, bytes_diffrence, 0, bytes)
- ' Bitmaps vergleichen
- For idx As Integer = 0 To bytes - 1 Step 3 ' Offset 3?
- Dim clr_standard As Color = Color.FromArgb(bytes_standard(idx + 2), bytes_standard(idx + 1), bytes_standard(idx + 0))
- Dim clr_camera As Color = Color.FromArgb(bytes_camera(idx + 2), bytes_camera(idx + 1), bytes_camera(idx + 0))
- If Not clr_standard.Equals(clr_camera) Then
- bytes_diffrence(idx + 2) = 255 'R
- bytes_diffrence(idx + 1) = 0 'G
- bytes_diffrence(idx + 0) = 0 'B
- Else
- bytes_diffrence(idx + 2) = bytes_camera(idx + 2) 'R
- bytes_diffrence(idx + 1) = bytes_camera(idx + 1) 'G
- bytes_diffrence(idx + 0) = bytes_camera(idx + 0) 'B
- End If
- Next
- ' Daten und Ressourcen freigeben
- bmp_standard.UnlockBits(bmpdata_standard)
- bmp_camera.UnlockBits(bmpdata_camera)
- bmp_difference.UnlockBits(bmpdata_difference)
- 'Rückgabe
- Return bmp_difference
- End Function
Jedoch bleibt das Bild komplett schwarz, obwohl zwei gefüllte Bitmaps übergeben werden.
Wo liegt der Fehler?
Gruss & Danke
Dancger
MESS WITH THE BEST, DIE LIKE THE REST!