Hallo Leute,
nach langem Googeln, wälzen eines Visual C# Buches und suchen in der hiesingen Suchfunktion wende ich mich an euch, da ich nicht mehr weiter komme.
Zur Vorgeschichte:
Ich programmiere mit einem Freund ein Programm in C# das über eine Kamera ein schwarzes Objekt auf einem Weißem Blatt Papier erkennt und die Koordinaten des Objektes via RS232 an einen µ-Controller sendet.
Dieser µ-Controller steuert dann eine 3-Achs-Vorrichtung an, ähnlich einer CNC-Fräße, nur das die Fräße hier ein Magnet ist. Dieser Magnet wird dann halt zu dem Objekt auf dem Papier gesteuert und hebt es auf.
Soweit ist eigentlich alles im Endspurt.
Das µ-Controller Programm läuft, eine Relyplatine wurde entworfen geääzt usw.
Das einzige Problem ist noch im C# Programm.
Das Programm macht eine Aufnahme von dem weißem Blatt Papier und speichert diese Aufnahme in einer Picturebox. Der RGB-Wert jedes Pixcels wird in einem Array abgespeichert.
Nun legt man das Objekt auf das Blatt, das Programm macht eine weitere Aufnahme und vergleicht die RGB-Werte jedes Pixcels mit dem im Array, und findet so heraus wo sich im bild etwas verändert hat.
Doch taucht, wenn ich das programm mehrmals durchlaufen lasse ein "accessviolationexception"-Fehler auf. Und zwar wahlweiße an der Stelle "GetPixel" bzw. "picturebox.refresh()".
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| private void suchen() { Bitmap BM1; Color Farbe; bool lv_rv; byte r_wert, g_wert, b_wert; int x, y, lfd_nr, x_anzahl, y_anzahl, haeufigkeit;
BM1 = (Bitmap)pictureBox1.Image; Farbe = new Color(); lv_rv = false; r_wert = 0; g_wert = 0; b_wert = 0; lfd_nr = 0; x_anzahl = 0; y_anzahl = 0; haeufigkeit = 0; numud_gitter.Minimum = 1; numud_gitter.Maximum = 10; numud_sense.Minimum = 10; numud_sense.Maximum = 100; numud_sense.Increment = 10; pb_mod.Minimum = 1; pb_mod.Maximum = (int)(80000 / (numud_gitter.Value * numud_gitter.Value));
for(y = 1; y <= pictureBox1.Height - 1; y = y + (int)(numud_gitter.Value)) { for (x = 1; x <= pictureBox1.Width - 1; x = x + (int)(numud_gitter.Value)) { Farbe = new Color();
Farbe = BM1.GetPixel(x, y); r_wert = Farbe.R; g_wert = Farbe.G; b_wert = Farbe.B;
if (((r_wert + g_wert + b_wert) < (r_werte[lfd_nr] + g_werte[lfd_nr] + b_werte[lfd_nr] - numud_sense.Value)) | ((r_wert + g_wert + b_wert) > (r_werte[lfd_nr] + g_werte[lfd_nr] + b_werte[lfd_nr] + numud_sense.Value))) { <span style="color: red"> BM1.SetPixel(x, y, Color.Red);</span> } lfd_nr++; } }
pictureBox1.Refresh();
MessageBox.Show("Analyse erfolgreich abgeschlossen! " + haeufigkeit + " Pixel wurden verändert."); } |
Vielen Dank, im Vorraus für eure Hilfe.