OpenCV anderer Ansatz zur Erkennung von Go-Boards

ch arbeite an einer Android-App, die ein @ erkennGO board und erstelle einSGF file davon.

Ich habe eine Version gemacht, die in der Lage ist, ein Brett zu erkennen und die Perspektive zu verzerren, um es quadratisch zu machen (Code und Beispielbild unten). Leider wird es etwas schwieriger, wenn Steine hinzugefügt werden (Bild unten).

Wichtige Dinge über ein durchschnittliches Go-Board:

round schwarzen und weißen Steinen schwarze Linien auf dem Brettboard Farbe reicht von weiß bis hellbraun und manchmal mit einer HolzmaserungSteine werden an Schnittpunkten zweier Linien platziert

korrigieren Sie mich, wenn ich falsch liege, aber ich denke, dass meine derzeitige Herangehensweise nicht gut ist. Hat jemand eine allgemeine Idee, wie ich die Steine und Linien vom Rest des Bildes trennen kann?

Mein Code:

    Mat input = inputFrame.rgba(); //original image
    Mat gray = new Mat();          //grayscale image

    //convert image to grayscale
    Imgproc.cvtColor( input, gray, Imgproc.COLOR_RGB2GRAY);

    //try to improve histogram (more contrast)
    equalizeHist(gray, gray);

    //blur image
    Size s = new Size(5,5);
    GaussianBlur(gray, gray, s, 0);

    //apply adaptive treshold 
    adaptiveThreshold( gray, gray, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY,11,2);

    //adding secondary treshold, removes a lot of noise
    threshold(gray, gray, 0, 255, Imgproc.THRESH_BINARY + Imgproc.THRESH_OTSU);

Einige Bilder:

mpty board http://roelept82.eightytwo.axc.nl/pic/device-2016-02-15-130011.pn filledboard http://roelept82.eightytwo.axc.nl/pic/device-2016-02-15-131431.pn

BEARBEITEN 05-03-2016

Yay! geschafft, Linien Steine und Farbe richtig zu erkennen. Voraussetzung ist, dass das Bild nur die Tafel selbst ist, ohne dass ein anderer Hintergrund sichtbar ist.
Ich benutze houghLinesP (60 Zeilen) und houghCircles (17 Kreise), Dauer auf meinem Handy (1. Generation Moto G) ca. 5 Sekunden.
Board und Warp erkennen Es stellt sich als eine ziemliche Herausforderung heraus, wenn es unter verschiedenen Winkeln und Blitzbedingungen arbeiten mus

Vorschläge für verschiedene Ansätze sind immer noch willkommen !!

filledboard http://roelept82.eightytwo.axc.nl/pic/detect.pn

BEARBEITEN 15-03-2016

Ich habe eine gute Möglichkeit gefunden, Linienschnittpunkte mit morphologischen Kreuztransformationen zu erhalten. Funktioniert erstaunlich, wenn das Bild direkt über der Tafel aufgenommen wird, leider nicht in einem Winkel (siehe unten).morph http://roelept82.eightytwo.axc.nl/pic/morph.pn

In meinem letzten Update habe ich die Linien- und Steinerkennung mit einem Bild gezeigt, das direkt von oben aufgenommen wurde. Seitdem habe ich daran gearbeitet, das Board zu erkennen und es so zu verziehen, dass meine Linien- und Steinerkennung nützlich wird.

Harris Eckenerkennung
Ich hatte Mühe, die richtigen Parametereinstellungen zu finden, und ich bin mir immer noch nicht sicher, ob sie optimal sind. Ich kann nicht viele Informationen darüber finden, wie ich das Bild optimieren kann, bevor ich die Harris-Ecken verwende. im Moment erkennt es zu viele Ecken, um nützlich zu sein. obwohl es sich anfühlt, als könnte es funktionieren. (obere Zeile mit Bildern im Beispiel)

    Mat corners = new Mat();
    Imgproc.cornerHarris(image, corners, 5, 3, 0.03);

    Mat mask = new Mat(corners.size(), CvType.CV_8U, new Scalar(1));
    Core.MinMaxLocResult maxVal = Core.minMaxLoc(corners);

    Core.inRange(corners, new Scalar(maxVal.maxVal * 0.01), new Scalar(maxVal.maxVal), mask);

orphologische Transformationen vom Kreuzt
funktioniert gut, wenn das Bild direkt von oben aufgenommen, aus einem Winkel oder mit einem gedrehten Brett verwendet wird, funktioniert nicht (mittlere Linie mit Bildern in Beispiel)

    Imgproc.GaussianBlur(image, image, new Size(5, 5), 0);
    Imgproc.adaptiveThreshold(image, image, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY_INV, 11, 2);

    int morph_elem = 1;     //0: Rect - 1: Cross - 2: Ellipse
    int morph_size = 5;

    int morph_operator = 0; //0: Opening - 1: Closing \n 2: Gradient - 3: Top Hat \n 4: Black Hat
    Mat element = getStructuringElement( morph_elem, new Size(2 * morph_size + 1, 2 * morph_size + 1), new Point( morph_size, morph_size ));
    morphologyEx(image, image, morph_operator + 2, element);

Kontur und Houghlines
wenn es keine Steine auf der äußeren Boardline gibt und die Lichtverhältnisse nicht zu hart sind, funktioniert es ziemlich gut. Konturen sind oft nur ein Teil der Tafel (untere Zeile mit Bildern im Beispiel)

    Imgproc.GaussianBlur(image, image, new Size(5, 5), 0);
    Imgproc.adaptiveThreshold(image, image, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY_INV, 11, 2);

    Mat hierarchy = new Mat();
    MatOfPoint biggest     = null;
    int contourId          = 0;
    double biggestArea     = 0;

    double minSize = 2000;
    List<MatOfPoint> contours = new ArrayList<>();

    findContours(InvertedImage, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

    //find biggest
    for( int x = 0; x < contours.size() ; x++ ){

        double area = Imgproc.contourArea(contours.get(x));

        if( area > minSize && area > biggestArea ){

            biggestArea = area;
            biggest     = contours.get(x);
            contourId   = x;
        }
    }

Bereitstellung des richtigen Bildes Alle drei Methoden funktionieren, sind jedoch nicht gut genug, um zuverlässig zu sein. Überlegungen zu Parametern, zur Bildvorverarbeitung, zu verschiedenen Vorgehensweisen oder zu Verbesserungsvorschlägen für die Erkennung sind willkommen =)

link to picture

comparison http://roelept82.eightytwo.axc.nl/pic/comparison.pn

BEARBEITEN 31-03-2016

Erkennen von Linien und Steinen ist so ziemlich gelöst, also werde ich diese Frage schließen.Erstellte einen neuen zum genauen Erkennen und Verwerfen.

jeder, der an meinem Fortschritt interessiert ist:dies ist mein GOSU Snap Alpha Kanal erwarte jetzt nicht zu viel davon!

BEARBEITEN 16-10-2016

Update: Ich habe gesehen, dass einige Leute dieser Frage immer noch folgen. Ich habe noch ein paar Sachen getestet und angefangen, Tensorflow zu verwenden. Mein neuronales Netzwerk sieht vielversprechend aus.Sie können es sich hier ansehen. Es muss noch viel gearbeitet werden, mein aktueller Bilddatensatz ist schrecklich und ich arbeite gerade daran, einen großen Datensatz zu bekommen.

die App funktioniert am besten mit einem quadratischen Brett mit dicken Linien und anständigen Blitzen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage