Laden...

Forenbeiträge von digi333 Ingesamt 290 Beiträge

01.08.2007 - 02:02 Uhr

@MrSparkle: Die Hough Transformation ist schon sehr spannend. Ich will nicht weit ausholen, aber ich will sie verwenden um in Bildern Bälle zu erkennen. Es kann aber auch für ganz andere Sachen verwendet werden (Augen, Strichcode, Gesichter... halt alles was aus Kreisen und Linien besteht). So wie im Beispiel.

oben links: das reale Bild einer Luftaufnahme.
oben mitte: das daraus resultierende Kantenbild (häufig Sobel oder Canny)
oben rechts: alle geraden Linien nach Hough-Transformation

Und zwar werden alle Linien aus dem Kanten Bild in den Hough-Raum abgebildet (durch den Winkel und die Richtung). Im Hough-Raum kreuzen sich alle Punkte einer Geraden in einem Hough-Punkt (siehe unten links). Wenn man also die Maxima separiert (unten rechts) erhält man die Lage und Richtung der Linien. So ähnlich funktioniert es mit den Kreisen.

Also wie gesagt schon recht spannend und wie ich finde auch sehr elementar wenn man sich mit bildverarbeitung beschäftigt.

@Herbivore: Ich hab den Satz schon so verstanden wie du meintest, aber ich wollte keinen Streit vom Zaun brechen.

Gruss
Digi333

31.07.2007 - 18:37 Uhr

Ui... das ist schade, da es eine elementare Frage bei der Bildbearbeitung zur Erkennung von Kreisen und Geraden ist. Also von der Sache an sich schon sehr spannend. In C++ hab ich in einem französischen Forum sogar Quellcode gefunden, aber ich bin nicht sehr fit mit C++, deswegen wär mir C# lieber.

Forum-Link: Hough-Code in C++

31.07.2007 - 17:35 Uhr

Huch!!! 8o Hier hätte ich mit mehr Feedback gerechnet.

29.07.2007 - 17:57 Uhr

Hallo zusammen,

Hat sich jemand schon mal an eine Hough Transformation versucht??? Sie soll sehr rechenintensiv sein und kompliziert. Ich wäre sehr dankbar für Quellbeispiele wenn vorhanden, aber auch andere Sachen sind gerne gesehen.

Ich möchte gerne Kreise und Linien in Kantenbildern (wie Canny) erkennen. Wenn jemand irgendwas in die Richtung gemacht hat ist mir das auch willkommen, da ich gerade bei der Informationssuche bin.

Die Suche hab ich verwendet, aber bei dem Suchbegriff Hough kam keine Treffer.

Gruss
digi333

21.02.2007 - 17:11 Uhr

Ich geb ihn aus in eine Grafischen Oberfläche (Delphi). Dort kann ich nur alles oder garnichts ändern. Schade geht also nicht. 🙁

Dank euch allen

21.02.2007 - 17:05 Uhr

Ich möchte gerne einen farbig machen und unterstreichen. Geht das?? Wenn ja, wie?

string bsp = "Dies ist ein Test";

Dies ist einTest

Danke!
Digi333

18.02.2007 - 21:01 Uhr

Ich hab meinen Fehler erkannt und wollte euch natürlich nicht die Antwort vorenthalten. Der Fehler ist zwar trivial, aber für mich unverständlich.

Falsch ist


Bitmap bmp = new Bitmap (width, height);
bmp.Dispose();
//Speicher quillt über

Richtig ist


Bitmap bmp = new Bitmap (width, height, PixelFormat.Format24bppRgb);
bmp.Dispose();
//Speicher quillt nicht über

In der grafischen Oberfläche sieht man keinen Unterschied... halt nur der Speicher. Da ich aber ein absoluter Anfänger bin, würde mich schon der Hintergrund interessieren. Was ist ein Bitmap ohne PixelFormat?? Und was ist dann der jeweilige Defaultwert?? Warum hält der GC den Wert im Speicher?? 🤔

14.02.2007 - 20:47 Uhr

kann ich dann das Array wieder lesen und ganz normal damit umgehen oder ist dann ein Mehraufwand nötig?? Nach dem Motto... suche Inhalte und Zellen.

File.ReadAllLines(path)

... und ja auf Festplatte. Das Tool soll vergleichen können zwischen verschiedenen statischen Inhalten von Arrays. Also sprich erzeuge eine Datenbank mit Arrays und vergleiche ob in der aktuellen Datenbank ein Array aus der gespeicherten Datei identisch sind.

Seralisierung??? Sorry sagt mir nichts! Ich google mal!

14.02.2007 - 15:56 Uhr

Ich möchte gerne wissen wie man ein Array speichern kann mit 200 Listenelemeten. Ich möchte aber nicht unbedingt mit MySQL oder SQL arbeiten. Vielleicht gibt es ja in C# einen Befehl um solche Arrays zu speichern.

Gruss
Digi333

12.02.2007 - 18:21 Uhr

Leider nein (hab nochmal nachgeschaut)! Der Code verursacht sogar 10 MB... Das ist fatal, da sekündlich 10 MB dazu kommen. In 30 Sekunden ist mein Arbeitsspeicher voll und die grafische Oberfläche stürzt ab.

12.02.2007 - 18:09 Uhr

Original von herbivore
Es kann aber auch sein, dass du einfach viele Strings mit + zusammenhängt. Das kann auch den Speicher gut voll machen.

Strings??? Ich übergebe Strings an die grafische Oberfläche, aber das ist eigentlich sehr wenig (ich kann mir nicht vorstellen, dass diese 3 Mb groß werden)... Können den Strings tatsächlich so ansteigen? Aber die kann man nicht disposen, oder? Die sollten auf jeden Fall vom GC entfernt werden. Behaupte ich mal...

Gruss
Digi333

12.02.2007 - 17:58 Uhr

Okay... Ich versteh eure Antworten so, dass das Bitmap nicht das Problem ist, da das Dispose() den Speicher wieder frei macht oder sogar im schlimmsten Fall der GC. Das ist schade... da es das Problem leider nicht behebt.

Und die Sache irgendwie umschreiben geht nicht (so dass das new weg ist)?? Den Quelltext kann ich nicht offen legen, aber ich kann versichern, dass da nur kleine Berechnungen drinne sind.

12.02.2007 - 17:22 Uhr

Ich sag doch vielleicht bin ich zu doof für Dispose(). Der Originalquelltext ist im grunde wie oben im Beispielquelltext aufgebaut. Erzeuge bmp... Arbeite auf bmp... und "Zerstöre" bmp. Die letzte Zeile in Execute ist bmp.Dispose(). Sind damit nicht die Ressourcen wieder frei???

12.02.2007 - 17:14 Uhr

Leider ist Bitmap nicht immer gleich groß... sonst hätte ich es ja schon statisch gesetzt. 🙁

Wie gesagt... der Speicher raßt mächtig nach oben. Denn einzigen verdacht den ich hab ist das Bitmap (es existiert zwar noch global ein BitmapData, aber das kann es nicht sein). Der Quelltext ist überschaubar... da kann nichts anderes so schnell wachsen außer ein Bitmap (und das ist das einzige). 🤔

Das unsafe ist hier nur ein Beispiel, da ich in dem richtigen Quellcode noch weitere Übergabeparameter habe (die ich hier nicht angegeben habe).

12.02.2007 - 17:00 Uhr

Wie gesagt habe ich Probleme mit dem new... ob so oder so. Der Speicher rennt trotzdem ins unermäßliche. X(

12.02.2007 - 16:44 Uhr

Ich hab folgenden Quellcode...


public class beispiel
{
	private Bitmap bmp = null

	public unsafe override void Execute(int width, int height)
	{
		if (bmp != null) // wenn noch altes Bitmap vorhanden, löschen
		{
			bmp.Dispose();
		}
		Bitmap temp = new Bitmap(width, height);
		bmp = new Bitmap(temp);
     temp.Dispose();
		... 		// arbeite mit bmp!
     bmp.Dispose(); // nur zur Sicherheit (wird dann nicht mehr gebraucht)
	}

Ich würde gerne ein Bitmap erzeugen aber ohne new Bitmap. Am liebsten wäre mir es Bitmap bmp global zu besitzen und bei jedem Aufruf wird bmp überschrieben. Leider wird aber erst width und height in der Methode übergeben. Das Problem ist das irgendwie bmp immer neu erzeugt wird durch new und der Speicher irgendwann überquillt. Scheinbar bin ich zu doof für Dispose().

Danke
Digi333

11.02.2007 - 15:07 Uhr

Original von Golo

Original von MagicAndre1981

GC.Collect();  

Das muss - damit es sicher funktioniert - aber zwei Mal hintereinander aufgerufen werden.

Warum den das eigentlich??

11.02.2007 - 12:35 Uhr

Ich weiß das die GarbageCollection automatisch läuft, aber ich wollte fragen, ob man den Spiecher per Hand auch noch aufräumen kann. Ich hab ein Programm geschrieben, dass in Videosequenzen Bilder bearbeitet. Am Anfang jedes Frames erzeuge ich ein Bitmap und ein Graphics und zum ende dispose ich es auch wieder. Trotzdem "explodiert" mein Speicher mit 2 bis 3 MB pro Frame. Wenn der Arbeitsspeicher voll ist stürtzt dann die Delphi-Oberfläche ab.

Ich bin ja noch am suchen was da so groß wird, aber jede Idee wäre hilfreich.

Ne Idee?

Gruss
Digi333

04.09.2006 - 16:04 Uhr

thx 🙂

04.09.2006 - 15:25 Uhr

Ein Set-Befehl wäre super! Kannst mir vielleicht sagen, wie ich den Eintrag in der Registry ändern kann, wenn ich ihn gefunden habe? Ich meine damit naturlich einen Befehl.

Uhrzeit und Datum? Muß doch da auch in der Nähe sein von System.Environment... aber dort aúch der Set-Befehl.

1000 mal Danke im voraus!

04.09.2006 - 14:41 Uhr

Ich hab gerade einen Teil gefunden...
Es gibt den Befehl netsh. Dort kann man alles ändern (Ip, Adresse, Netzwerkname etc.). Ich schreib einfach ne Oberfläche und übergebe das dann.

Fragen sind aber noch zur Windowszeit und zum Computername?

04.09.2006 - 14:19 Uhr

Wie gesagt bin ich kein Programmierer...
Ich bin Praktikant in einer Firma die Geräte verschickt mit einem embedded Windows XP. Diese Geräte werden beim ersten Start neu konfiguriert. Nun möchte man aber nicht dem Benutzer eine Anleitung schicken zum Konfigurieren... sondern er soll nach Möglichkeit die Einstellungen nacheinander machen als Wizzard.

So ist der Stand der Dinge... Kann mir da vielleicht jemand helfen oder eine andere elegante Lösung präsentieren. Im Grunde sollte es auch mit Framework funktionieren und C#, oder? Aber wie? 🤔

04.09.2006 - 14:03 Uhr

Sorry, ich bin blutiger Anfänger 🙁
Ich möchte gerne einen Installationswizzard schreiben. Dazu soll er nacheinander Abfragen machen und Einstellungen setzen. Als erstes bräuchte ich einen Frameworkbefehl, der die aktuelle Ip überschreibt. Indem er z.B. in der Registry den Eintrag ändert oder so ähnlich. Als zweites soll er den Rechnername setzen und super wäre, wenn er das aktuelle Datum setzen würde.

Kann mir da vielleicht jemand von euch helfen? Danke schon im voraus!

🙂

20.07.2006 - 22:12 Uhr

Immer mit der Ruhe! Mit Graustufen meine ich halt 256-Graustufen (1Byte). Genauere Graustufentiefen sind nicht notwendig.

Wie gesagt... kopier dir die ersten paar Zeilen oder bastel dir ein kleines Miniprogramm indem du von 24bpp zu 8bpp konvertierst. Das Miniprogramm ist schnell gemacht (vielleicht 7 Zeilen). Oder wie oben erklärt eines der Probleme löst. Es muß ja irgendwie gehen, da die Pixelformate existieren. 🤔

19.07.2006 - 00:32 Uhr

Canny dient zur Kantenerkennung. Man übergibt ihm ein Graustufenbild und als Ausgabe bekommt man ein Schwarz/Weiss-Bild, wo die Kanten Weiß sind. Wie in meinem Bild.

Erster Schritt: Graustufenbild (das ist bei mir die Variable "bmp") erzeugen - funktioniert einwandfrei, da bei YCbCr (Farbraum) die Y-Komponente der Graustufenwert ist. Da besteht aber gleichzeitig das Problem. Die Color in SetPixel kann ich nur als 24Bpp speichern mit FromArgb.

Ab der Zeile mit "int stride;" ist es der Originalquellcode Canny aus dem Internet. Im Internet ist srcImage ein übergebenes Bild mit dem Pixelformat Format8bppIndexed. Aber wie will man bei SetPixel die Farbe angeben und bleibt im PixelFormat 8bpp???

Die Aufgabe wäre wie im angegebenen Sourcetext. Erzeuge das Bitmap bmp wie angegeben (24bpp), aber das Pixelformat von BitmapData sei 8bpp.

Oder die Aufgabe kann auch anders gelöst werden... Erzeuge ein Bitmap bmp mit Pixelformat 8bpp, aber die Farbe liegt als Grauwert (Variable heißt "int frame.GetY") von 0-255 vor. Wie man dann die Farbe angibt keine Ahnung. Vielleicht mit Casten oder Convert.ToByte.

18.07.2006 - 22:12 Uhr

Das SrcImage erstelle ich mir aus einem voherigen Algorithmus. Ich nehme die Luminance (Y-Komponente aus YCbCr) und packe sie in die Rot-, Blau- und Grünkomponente. Es entsteht ein Graustufenbild. Das funktioniert ja auch noch einwandfrei, aber ihm dann zu sagen mit Scan0, dass die Breite nicht 1Byte sondern 3Byte ist. Das versteh ich leider nicht. Entweder muß der Quelltext mit den Schleifen auf die Bytebreite angepaßt werden oder ein anderes Format müßte gewählt werden für scr und dst. Wie gesagt ich bin Anfänger und hab keine große Ahnung von Pointer und BitmapData (wie diese abgelegt werden).

Super wäre man könnte mit Pixelformat.Format8bppIndexed arbeiten, da die Y-Komponente ja auch nur von 0 bis 255 geht, aber ich hab keine Ahnung wie ich das dann mit SetPixel als Farbe deklariere. Von Palette hab ich keine Ahnung.

@Ikarus: Meinst du das Pixelformat auf 32 Bpp anheben und die dst bzw. src auf double setzen? Oder wie meinst du den zweiten Teil?

17.07.2006 - 21:30 Uhr

Ich hab schon einmal so etwas ähnliches gefragt. Ich bin dabei einen Canny-Edge-Algorithmus zu erstellen. Leider wird mein eigener Algorithmus zu langsam und ich habe auf einer englischen Homepage einen freien Canny (für private Zwecke) gefunden. Ich möchte jetzt ein eigenes Bild (PixelFormat.Format24bppRgb) auf seinem Algorithmus (PixelFormat.Format8bppIndexed) laufen lassen. Wenn ich das versuche entsteht ein Canny mit 1/3 Bildbreite (siehe Anhang) was ja auch logisch ist, da Scan0 von BitmapData ein Byte-Wert ist und das Bild 3*Byte=24bppRgb (Rot[Byte], Grün[Byte], Blau[Byte]) besitzt.


                            Bitmap dstImg = new Bitmap(frameWidth, frameHeight, PixelFormat.Format24bppRgb);
                            BitmapData dstData =dstImg.LockBits(new Rectangle(0, 0, frameWidth, frameHeight), ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);

                            Bitmap bmp = new Bitmap(frameWidth, frameHeight, PixelFormat.Format24bppRgb);
                            for (int x = 0; x < frameWidth; x++)
                            {
                                for (int y = 0; y < frameHeight; y++)
                                {
                                    bmp.SetPixel(x, y, Color.FromArgb(frame.GetY(x, y), frame.GetY(x, y), frame.GetY(x, y)));
                                }
                            }
                            Bmp);
                            BitmapData srcData = bmp.LockBits(new Rectangle(0, 0, frameWidth, frameHeight), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                            int stride = srcData.Stride;
                             // Canny
                             //hier muß die Breite korrigiert werden, aber wie?
                            byte* src = (byte*) srcData.Scan0.ToPointer() + stride;
                            byte* dst = (byte*) dstData.Scan0.ToPointer() + stride;
                            int p = frameWidth;
                            int i, j, ir;
                            int widthM1 = frameWidth - 1;
                            int heightM1 = frameHeight - 1;
                            int offset = stride - frameWidth;
                            double v, gx, gy;
                            double orientation, toPI = 180.0/Math.PI;
                            byte[] orients = new byte[frameWidth*frameHeight];
                            byte leftPixel = 0, rightPixel = 0;

                            // Step 3 - calculate magnitude and edge orientation

                            // for each line
                            unsafe
                            {
                                for (int y = 1; y < heightM1; y++)
                                {
                                    src++;
                                    dst++;
                                    p++;

                                    // for each pixel
                                    for (int x = 1; x < widthM1; x++, src++, dst++, p++)
                                    {
                                        
                                        // for each kernel row
                                        for (i = 0; i < 3; i++)
                                        {
                                            ir = i - 1;
                                            // for each kernel column
                                            for (j = 0; j < 3; j++)
                                            {
                                                // source value
                                                v = src[ir * stride + j - 1];

                                                gx += v * xKernel[i, j];
                                                gy += v * yKernel[i, j];
                                            }
                                        }
                                        // get gradient value
                                        *dst =  //hier wurde viel Quelltext enfernt
                             
                                        }

                                        // save orientation
                                        orients[p] = (byte)orientation;
                                    }
                                    src += (offset + 1);
                                    dst += (offset + 1);
                                    p++;
                                }

Ich hoffe ihr könnt mir helfen bei


byte* src = (byte*) srcData.Scan0.ToPointer() + stride;
byte* dst = (byte*) dstData.Scan0.ToPointer() + stride;

Wie gesagt ursprünglich war es ein anderes Pixelformat bei dem es ohne Probleme funktioniert.

17.07.2006 - 00:16 Uhr

An welche Stelle würdest du es setzen wollen?

16.07.2006 - 23:23 Uhr

Ich bin schon seit Ewigkeiten im Internet am suchen, aber nirgens eine Antwort.


Bitmap bmp = new Bitmap(frameWidth, frameHeight, PixelFormat.Format24bppRgb);
    for (int x = 0; x < frameWidth; 
   {
         for (int y = 0; y < frameHeight; y++)
        {
            bmp.SetPixel(x, y, Color.FromArgb(frame.GetY(x, y), frame.GetY(x, y), frame.GetY(x, y)));
         }

Nagut, aber wie mach man aus dem "PixelFormat.Format24bppRGB" ein "PixelFormat.Format8bppIndexed". Die Frage wird leider öfters mal gestellt, aber immer ohne Antwort.

Wie gesagt, die Variable "frame.GetY" ist der Grauwert des Bildes den ich im Grunde pixelweise als neues Bild "bmp" speichern möchte mit 8bpp.

16.07.2006 - 17:52 Uhr

Aber das Pixelformat darf nicht verändert werden! Als Zusatz.

16.07.2006 - 17:50 Uhr
Bitmap bmp = new Bitmap(frameWidth, frameHeight, PixelFormat.Format8bppIndexed);
                            for (int x = 0; x < frameWidth; x++)
                            {
                                for (int y = 0; y < frameHeight; y++)
                                {
                                    bmp.SetPixel(x, y, Color.FromArgb(frame.GetY(x, y)));
                                }
                            }

Das ist mein momentanes Problem. "bmp" ist ein 8 Bit/Pixel Format und bei Setpixel steht bei Farbe (FromArgb) ein 32bit-Wert. Die Variable "frame.GetY" ist ein Wert zwischen 0...255. Vielleicht ist es ja so richtig, jedoch steigt mir das Programm an der Stelle aus. Wie kann ich in dem angegebenen Pixelformat eine Farbe deklarieren die in dem angegebenen Intergerraum liegt (0...255)? Ich bin leider Anfänger X(

27.06.2006 - 00:04 Uhr

Wie kann man einen Kreis zeichnen ohne diese unschöne "x-Achse"-Linie?

mygraphics.DrawPie(new Pen(Color.Black),1,1,myframe.Width,myframe.Height,0,360);

Bild im Dateianhang.

18.06.2006 - 01:07 Uhr

Wie gesagt nicht böse gemeint. Ich kenne leider einige Leute, die zu selten das Tageslicht sehen und sich zu sehr abkapseln. Die reden auch so in kryptischen Sätzen... (sind aber hoch intelligent). Danke auch dir für deine Hilfe!

18.06.2006 - 00:42 Uhr

Ich hab es jetzt schon ausprobiert... mir hat es in den Fingern gekribbelt. Es funktioniert! Danke!

@all: Ich hoffe ihr versteht was Ikaros meint... es hört ich nicht Gesund an. Frische Luft und mal Kiste ausschalten! 😉 ... ist nicht böse gemeint.

18.06.2006 - 00:09 Uhr

Ich werde es morgen mal testen und dann den Quellcode auf euer Beispiel umschreibe.

Ich danke euch allen für euer Verständnis und eure Hilfe. THX 👍

Ich hab mir bei Ebay für 1 Euro + 4 Euro Versand das Buch Visual C# (800 Seiten) gekauft. Aber ich hab auch noch ein paar eBooks. Ich muß mich noch etwas einarbeiten.

17.06.2006 - 23:57 Uhr

@ikaros: 🤔 Häh? Ich bin doch ein Anfänger. Das einzige was ich verstanden habe und was mir irgendwie helfen soll ist wohl FromGraphics?

Meinst du das so???


Graphics mygraphics;
Bitmap pic = Image.FromGraphics(mygraphics)
17.06.2006 - 23:48 Uhr

Hui! Das ging ja schnell.

Wenn ich jedoch richtig verstanden hab, bin ich doch dann wieder am Anfang meiner Überlegung. Nach g.Draw(...) möchte ich g als Bitmap haben oder besser noch auf g BitmapData anwenden. Da bin ich ja wieder an dem ursprünglichen Problem... Wie wende ich auf g BitmapData an?

@DerHulk: Kann man vielleicht das "Test.bmp" wieder zurück holen als Bitmap (so dass ich dann BitmapData anwenden kann)?

Was macht den "Graphics.FromImage"?

Wie gesagt blutiger Anfänger (2 Tage) und nur wenig Erfahrung aus Java.

17.06.2006 - 23:16 Uhr

Das ist ja blöd...

In Bitmap kann ich keine Linie zeichnen und ein Graphics kann ich nicht als Bitmap speichern. Ich benutze ja momentan nur das Graphics zum zeichnen und das Bitmap damit ich BitmapData (Rückgabewert des Programms) verwenden kann.

1.) Kann man in Bitmap ne Linie zeichnen?
2.) Kann man ein Graphics speichern und in Bitmap laden?
3.) Gibt es sowas wie GraphicsData?
4.) Kann ich irgendwie mit BitmapData arbeiten obwohl ich ein Graphics besitze.
5.) Stichwort: Vererbung von Methoden von Graphics und Bitmap??
6.) Vielleicht Casten?

Ich kann und will nicht glauben, dass man ein Bild zeichnen kann (mit Graphics), aber es nicht speichern (nur ein Beispiel) mit Bitmap. 🤔

Das scheint mir sowas von elementar... Ich verstehe dein Beispiel, aber als Programmiersprache macht es keinen wirklichen Sinn.

17.06.2006 - 20:56 Uhr

Ich bin blutiger Anfänger und ich möchte eine Graphics in ein Bitmap umwandeln. Ich hab schon gelesen, dass es nicht geht, aber vielleicht wenn man es Pixelweise ausließt...

Kann man irgendwie die Farbe von einem GraphicsPixel auslesen??? Meine Idee...


 Bitmap pic = new Bitmap(bmp.Width,bmp.Height);
 for (int x = 0; x < pic.Width; x++)
 {
       for (int y = 0; y < pic.Height; y++)
        {
               pic.SetPixel(x,y, mygraphics.??? [x,y] );  // <==
               // Umwandeln von Graphics in Bitmap (Pixelweise)
         }
 }

Bitte Hilfe!