Laden...

Koordinaten Kreismittelpunkt im Kreis anzeigen

Erstellt von Stauch30 vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.540 Views
S
Stauch30 Themenstarter:in
15 Beiträge seit 2017
vor 6 Jahren
Koordinaten Kreismittelpunkt im Kreis anzeigen

Guten Tag zusammen,

mittlerweile sitze ich seit längerem an diesem Problem und habe keine Antwort gefunden:
Ich möchte aus einem Bild geometrische Formen erkennen und diese einzeichen. Das klappt soweit ganz gut. Anschließend möchte ich die Koordinaten des Formen (am besten Mittelpunkt, aber vorerst egal) in die Form oder nahe bei der Form anzeigen. Hier mal am Beispiel eines Kreises, wie die Kreise eingezeichnet werden:

Mat circleImage = new Mat(img.Size, DepthType.Cv8U, 3);
            circleImage.SetTo(new MCvScalar(0));
                foreach (CircleF circle in circles)
                {
                    CvInvoke.Circle(circleImage, Point.Round(circle.Center), (int)circle.Radius, new Bgr(Color.Brown).MCvScalar, 2);
                    CvInvoke.Circle(circleImage, Point.Round(circle.Center), (int) 1, new Bgr(Color.Brown).MCvScalar, 2);
                    textBox1.Text = Convert.ToString(Point.Round(circle.Center))+Environment.NewLine;                   
                }

Mit dem Code bekomm ich dann auch einen kleinen Kreis im Mittelpunkt des anderen und kann in einer Textbox die Koordinaten des Kreismittelpunkts anzeigen lassen.
Wegen der foreach-Schleife wird mir allerdings immer nur ein Koordinatenpaar angezeigt, unabhängig der Anzahl der Kreise. Ich habe gehofft dem Problem einfach mit einem Zeilenumbruch aus dem Weg zu gehen, das klappt aber nicht. Und wenn ich die TextBox.Location auf circle.Center setze, verschwindet die einfach.

Also meine Frage zu dem ganzen Text:
Wie kann ich die Koordinaten des Kreismittelpunkts am Kreismittelpunkt anzeigen lassen?

Vielen Dank im Voraus,
Grüße,
Steffen

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Stauch30,

wie und wo zeigst du das Bild an? Winforms und dort wie od. WPF?

wenn ich die TextBox.Location auf circle.Center setze, verschwindet die einfach.

Oder sie ist hinter dem Bild, dann kannst du sie in den Vordergrund bringen (Z-Index). Wie genau hängt von der vorherigen Frage ab.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
Stauch30 Themenstarter:in
15 Beiträge seit 2017
vor 6 Jahren

Hallo gfoidl,

Das Bild wird in einer Windows Forms App in einer ImageBox angezeigt.
Das Bild wird in einer ImageBox geladen, dann in Grauwertbild umgewandelt und in diesem die geometrischen Formen in jeweils eigenen Imageboxen, je geometrische Form, angezeigt

mfg

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Stauch30,

dann wird auch die TextBox hinter den ImageBoxen sein und du siehst sie nicht. Bring die TextBox mit dem z-Index (BringToFront-Methode) an die Front und sie ist sichtbar.

Der ganz ideale Weg ist das aber nicht, denn es können viele ImageBoxen werden. Nimm lieber ein Panel und zeichne die Bilder und Annotationen selbst. Das ist auch nicht recht aufwändiger, dafür aber performanter und du hast mehr und bessere Kontrolle. Anstatt der Textbox kannst du dann auch direkt in der Graphic zeichnen und zum Schluss sogar alles als neues Bild exportieren.

Siehe [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox) (Graphics.DrawImage und Graphics.DrawString).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

4.939 Beiträge seit 2008
vor 6 Jahren

Du mußt erst den Gesamtstring erzeugen, und dann nach der Schleife der TextBox zuweisen:


string text = "";

foreach (CircleF circle in circles)
{
    CvInvoke.Circle(circleImage, Point.Round(circle.Center), (int)circle.Radius, new Bgr(Color.Brown).MCvScalar, 2);
    CvInvoke.Circle(circleImage, Point.Round(circle.Center), (int) 1, new Bgr(Color.Brown).MCvScalar, 2);
    text += Convert.ToString(Point.Round(circle.Center)) + Environment.NewLine;
}

textBox1.Text = text;

S
Stauch30 Themenstarter:in
15 Beiträge seit 2017
vor 6 Jahren

@Th69: Vielen Dank, so listet die Textbox alle Koordinatenpaare auf. Ich hatte das so ähnlich ausprobiert, aber da anscheinend einen Fehler reingebracht.

@gfoidl: Ich glaube, das hab ich missverständlich formuliert. Es gibt ein Bild für alle Kreise, nicht ein Bild pro Kreis.
Die Textbox bleibt auf mit BringToFront verschwunden. Auch ein Ändern der Farben (falls es daran liegen sollte) hat nichts gebracht.