OpenCV enfoque diferente en la detección de go board

Estoy trabajando en una aplicación de Android que reconocerá unGO junta y crear unArchivo SGF de eso.

Hice una versión que es capaz de detectar un tablero y deformar la perspectiva para hacerlo cuadrado (código e imagen de ejemplo a continuación) desafortunadamente se vuelve un poco más difícil al agregar piedras (imagen a continuación)

Cosas importantes sobre un promedio go board:

piedras redondas en blanco y negrolíneas negras en el tableroel color del tablero varía de blanco a marrón claro y, a veces, con vetas de maderalas piedras se colocan en intersecciones de dos líneas

corrígeme si estoy equivocado pero creo que mi enfoque actual no es bueno. ¿Alguien tiene una idea general sobre cómo puedo separar las piedras y las líneas del resto de la imagen?

Mi código:

    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);

Algunas imagenes:

tablero vacío http://roelept82.eightytwo.axc.nl/pic/device-2016-02-15-130011.png tablero lleno http://roelept82.eightytwo.axc.nl/pic/device-2016-02-15-131431.png

EDITAR: 05-03-2016

¡Hurra! logró detectar líneas, piedras y colores correctamente. condición previa la imagen tiene que ser solo el tablero en sí, sin ningún otro fondo visible.
Uso houghLinesP (60 líneas) y houghCircles (17circles), la duración en mi teléfono (1a generación Moto G) es de aproximadamente 5 segundos.
Detectar el tablero y la deformación resulta ser todo un desafío cuando tiene que estar trabajando en diferentes ángulos y condiciones de rayos ... aún trabajando en eso

¡Sugerencias para diferentes enfoques son bienvenidas!

tablero lleno http://roelept82.eightytwo.axc.nl/pic/detect.png

EDITAR: 15-03-2016

Encontré una buena manera de obtener intersecciones de líneas con transformaciones morfológicas de tipo cruzado, funciona increíblemente cuando la imagen se toma directamente sobre el tablero, desafortunadamente no en ángulo (ver más abajo)morph http://roelept82.eightytwo.axc.nl/pic/morph.png

En mi última actualización, mostré la detección de líneas y piedras con una imagen tomada directamente desde arriba, desde entonces he estado trabajando para detectar el tablero y deformarlo de manera que mi detección de líneas y piedras se vuelva útil.

detección de esquina de harris
Luché por obtener la configuración de parámetros correcta y todavía no estoy seguro de si son óptimas, no puedo encontrar mucha información sobre cómo optimizar la imagen antes de usar harris corners. ahora mismo detecta muchos rincones para ser útil. aunque parece que podría funcionar. (línea superior con imágenes en el ejemplo)

    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);

transformaciones morfológicas de tipo cruzado
funciona muy bien cuando la imagen se toma directamente desde arriba, se usa desde un ángulo o con un tablero girado no funciona (línea media con imágenes en el ejemplo)

    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);

curvas de nivel y líneas
Si no hay piedras en el tablero exterior y las condiciones de luz no son duras, funciona bastante bien. los contornos son solo una parte del tablero con bastante frecuencia (línea inferior con imágenes, por ejemplo)

    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;
        }
    }

Al proporcionar la imagen correcta, los tres métodos funcionan pero no son lo suficientemente buenos como para ser confiables. cualquier idea sobre parámetros, procesamiento previo de imágenes, diferentes enfoques o cualquier cosa que pueda mejorar la detección son bienvenidos =)

enlace a la imagen

comparación http://roelept82.eightytwo.axc.nl/pic/comparison.png

EDITAR: 31-03-2016

detectar líneas y piedras está bastante resuelto, así que cerraré esta pregunta.creado uno nuevo para detectar y deformar con precisión.

Alguien interesado en mi progreso:este es mi canal Snap Alpha de GOSU ¡no esperes mucho en este momento!

EDITAR: 16-10-2016

Actualización: vi que algunas personas todavía siguen esta pregunta. Probé algunas cosas más y comencé a usar Tensorflow, mi red neuronal parece prometedora,Puedes echarle un vistazo aquí. Todavía queda mucho trabajo por hacer, mi conjunto de datos de imagen actual es horrible y en este momento estoy trabajando para obtener un gran conjunto de datos.

la aplicación funciona mejor usando un tablero cuadrado con líneas gruesas y un rayo decente.

Respuestas a la pregunta(2)

Su respuesta a la pregunta