Entwickler-Ecke

Multimedia / Grafik - AccessViolationException bei Bilderkennung


tk_123 - Do 30.10.08 16:17
Titel: AccessViolationException bei Bilderkennung
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()".


C#-Quelltext
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()
    {
        //Deklariation
        Bitmap BM1;
        Color Farbe;
        bool lv_rv;
        byte r_wert, g_wert, b_wert;
        int x, y, lfd_nr, x_anzahl, y_anzahl, haeufigkeit;

        //Initaialisieren
        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);   //RGB des Aktuellen Pixel auslesen

                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.


tk_123 - So 02.11.08 21:18

mh,
mir scheint meine Frage zu anspruchsvoll für das Forum hier.

Bei den ganzen anderen Threads sind auch nicht oft keine Antworten,
hier fehlen ein paar Leute die richtige Anhung davon haben.

Naja vielen Dank.


Greenberet - So 02.11.08 21:41

verwendest du multithreading?
abgesehen davon wer eine genaue fehlermeldung interessant
weil nur mit "accessviolation" fängt man nicht viel an...


tk_123 - Mo 03.11.08 21:23

AccessViolationException

Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.