Gezeichnetes Dreieck mit HoughLines erkennen

MaggyMo

Aktives Mitglied
Guten Abend,

ich versuche gerade mithilfe der HoughLines/HoughLinesP ein gezeichnetes Dreieck auszulesen.
Ich habe erstmal mit einem Bild, auf dem sich ein ausgefülltes Dreieck befindet, begonnen. Dieses Bild habe ich zuerst in ein Binärbild umgewandelt und anschließend einen Medianfilter drüber laufen lassen. Aktuell werden mir auch die 3 Kanten des Dreiecks eingezeichnet. Nun zu meiner Frage:
Wie kann ich erkennen, dass es sich um ein Dreieck handelt? Kann ich irgendwie die Schnittpunkte der HoughLines bestimmen und anhand dieser auswerten ob es sich bspw. um ein Drei- oder Viereck handelt? Oder gibt es dafür noch andere Möglichkeiten?

Liebe Grüße und Danke im Voraus :)
 

MaggyMo

Aktives Mitglied
Danke :) Aber dabei werden ja nur ausgefüllte Formen betrachtet. Wenn ich aber nun ein Dreieck mit einem Filzstift aufzeichne und dieses Bild dann auswerte wird sowohl ein inneres als auch ein äußeres Dreieck erkannt. Mit wurde gesagt, dass man den Abstand der Konturpunkte irgendwie auswerten kann, damit auch wirklich nur ein Dreieck erkannt wird. Weißt du eventuell wie man das damit machen könnte?

Liebe Grüße
 

MaggyMo

Aktives Mitglied
Wenn ich mich recht entsinne, verwendest Du doch OpenCV?

Könntest du mir eventuell bei den folgenden Fragen helfen?
Ich habe irgendwie nicht ganz verstanden, was mit dilation gemeint ist und wie es verwendet wird. Die dazugehörige Doku habe ich mir schon angeschaut, aber daraus werde ich irgendwie nicht
schlau :(
Auch mit diesem "import numpy as np" und "kernel" komme ich irgendwie nicht weiter.
Sorry ich bin noch Anfänger in der Hinsicht :)
Danke :)
 

mihe7

Top Contributor
Im Stackoverflow-Artikel wird Python verwendet. Die betreffenden Methoden müssten aber in ähnlicher Form auch in der Java-API zu finden sein. Du müsstest den Spaß also nach Java übersetzen.
 

MaggyMo

Aktives Mitglied
Im Stackoverflow-Artikel wird Python verwendet. Die betreffenden Methoden müssten aber in ähnlicher Form auch in der Java-API zu finden sein. Du müsstest den Spaß also nach Java übersetzen.
Ja das habe ich gesehen und auch ausprobiert, aber es will nicht funktionieren. Sowohl bei einem Viereck als auch einem Quadrat werden immer nur 3 Konturen gefunden. Kann mir da vllt jemand helfen? Gegoogelt habe ich schon :)
 

AndiE

Top Contributor
Ich würde gerne den Code sehen und die Bilder, die generiert werden. Dann kann ich mir, und können sich andere, Vorstellungen machen, wieso das Ergebnis kommt.
 

AndiE

Top Contributor
Habe das mal eben ausprobiert, der Algorithmus liefert höchst unterschiedliche Ergebnisse.

https://openclipart.org/image/400px/49573 - Ausgabe schwarz (es wird nichts erkannt)
https://openclipart.org/detail/266228/circle-triangle - viele Teile, die nicht zum Dreieck gehören werden nachgezogen
https://www.freepik.com/free-icon/up-arrow-triangle-hand-drawn-outline_734850.htm - Dreieck wird innen perfekt nachgezogen
Hast du das in Java gemacht? Wie hast du das mit der Faltung gemacht? Eine Klasse für Matrizen geschrieben?
 

mihe7

Top Contributor
Hast du das in Java gemacht? Wie hast du das mit der Faltung gemacht? Eine Klasse für Matrizen geschrieben?
Ja, ich habe das Beispiel von Stackoverflow nach Java übersetzt (mit OpenCV 2.4.9):

Java:
import org.opencv.core.*;
import org.opencv.imgproc.*;
import org.opencv.highgui.*;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        nu.pattern.OpenCV.loadShared();
        Mat img = Highgui.imread(args[0]);
        Mat gray = img.clone();
        Imgproc.cvtColor(img, gray, Imgproc.COLOR_BGR2GRAY);
        Mat kernel = Mat.ones(4, 4, CvType.CV_8U);
        Mat dilation = gray;
        Imgproc.dilate(gray, dilation, kernel, new Point(-1,-1), 1);
        Mat blur = dilation;
        Imgproc.GaussianBlur(dilation, blur, new Size(5d,5d), 0d);
        Mat thresh = blur;
        Imgproc.adaptiveThreshold(blur, thresh, 255, 1, 1, 11, 2);
        List<MatOfPoint> contours = new ArrayList<>();
        Imgproc.findContours(thresh, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
        for (MatOfPoint pnt : contours) {
            MatOfPoint2f cnt = new MatOfPoint2f(pnt.toArray());
            MatOfPoint2f approx = new MatOfPoint2f();
            Imgproc.approxPolyDP(cnt, approx, 0.07 * Imgproc.arcLength(cnt, true), true);
            if (approx.toArray().length == 3) {
                Imgproc.drawContours(img, Collections.singletonList(pnt), 0, new Scalar(0, 0, 255), 3);
            }
        }
        Highgui.imwrite("result.png", img);
    }
}
 

Ähnliche Java Themen

Neue Themen


Oben