Search in sources :

Example 36 with Point

use of org.opencv.core.Point in project kifu-recorder by leonardost.

the class Desenhista method desenharTabuleiro.

/**
 * Desenha o tabuleiro sobre a matriz 'imagem' com a origem nas coordenadas 'x' e 'y' passadas
 * como parâmetro e com tamanho 'tamanhoImagem'. O desenho é feito respeitando a dimensão do
 * tabuleiro, ou seja, se o tabuleiro tem dimensão maior, o preview fica menor. A última jogada
 * é marcada com um círculo sobre a última pedra que foi colocada. Se o parâmetro ultimaJogada
 * for nulo, não marca a última jogada.
 *
 * @param imagem
 * @param tabuleiro
 * @param x
 * @param y
 * @param tamanhoImagem
 * @param ultimaJogada
 */
public static void desenharTabuleiro(Mat imagem, Tabuleiro tabuleiro, int x, int y, int tamanhoImagem, Jogada ultimaJogada) {
    Point p1 = new Point();
    Point p2 = new Point();
    double distanciaEntreLinhas = tamanhoImagem / (tabuleiro.getDimensao() + 1);
    double fimDasLinhas = tamanhoImagem - distanciaEntreLinhas;
    // estava usando tamanhoImagem / 20 para o 9x9
    int raioDaPedra = 29 - tabuleiro.getDimensao();
    p1.x = x;
    p1.y = y;
    p2.x = x + tamanhoImagem;
    p2.y = y + tamanhoImagem;
    Imgproc.rectangle(imagem, p1, p2, mBoardBrown, -1);
    // Desenha linhas horizontais
    for (int i = 0; i < tabuleiro.getDimensao(); ++i) {
        Point inicio = new Point();
        Point fim = new Point();
        inicio.x = x + distanciaEntreLinhas;
        inicio.y = y + distanciaEntreLinhas + distanciaEntreLinhas * i;
        fim.x = x + fimDasLinhas;
        fim.y = inicio.y;
        Imgproc.line(imagem, inicio, fim, mBlack);
    }
    // Desenha linhas verticais
    for (int i = 0; i < tabuleiro.getDimensao(); ++i) {
        Point inicio = new Point();
        Point fim = new Point();
        inicio.x = x + distanciaEntreLinhas + distanciaEntreLinhas * i;
        inicio.y = y + distanciaEntreLinhas;
        fim.x = inicio.x;
        fim.y = y + fimDasLinhas;
        Imgproc.line(imagem, inicio, fim, mBlack);
    }
    // Desenha pedras
    for (int i = 0; i < tabuleiro.getDimensao(); ++i) {
        for (int j = 0; j < tabuleiro.getDimensao(); ++j) {
            Point centro = new Point();
            centro.x = x + distanciaEntreLinhas + j * distanciaEntreLinhas;
            centro.y = y + distanciaEntreLinhas + i * distanciaEntreLinhas;
            if (tabuleiro.getPosicao(i, j) == Tabuleiro.PEDRA_PRETA) {
                Imgproc.circle(imagem, centro, raioDaPedra, mBlack, -1);
            } else if (tabuleiro.getPosicao(i, j) == Tabuleiro.PEDRA_BRANCA) {
                Imgproc.circle(imagem, centro, raioDaPedra, mWhite, -1);
                Imgproc.circle(imagem, centro, raioDaPedra, mBlack);
            }
        }
    }
    // Marca a última jogada feita
    if (ultimaJogada != null) {
        Point centro = new Point();
        centro.x = x + distanciaEntreLinhas + ultimaJogada.coluna * distanciaEntreLinhas;
        centro.y = y + distanciaEntreLinhas + ultimaJogada.linha * distanciaEntreLinhas;
        Scalar corDaMarcacao = ultimaJogada.cor == Tabuleiro.PEDRA_PRETA ? mWhite : mBlack;
        Imgproc.circle(imagem, centro, (int) (raioDaPedra * 0.6), corDaMarcacao, 1);
        Imgproc.circle(imagem, centro, raioDaPedra, mBlue, -1);
    }
}
Also used : Point(org.opencv.core.Point) MatOfPoint(org.opencv.core.MatOfPoint) Point(org.opencv.core.Point) MatOfPoint(org.opencv.core.MatOfPoint) Scalar(org.opencv.core.Scalar)

Example 37 with Point

use of org.opencv.core.Point in project kifu-recorder by leonardost.

the class DetectorDeTabuleiro method processar.

/**
 * Processa a imagem fornecida. Retorna verdadeiro se o processamento completo ocorreu com
 * sucesso, ou seja, se um tabuleiro de Go foi detectado na imagem. Retorna falso, caso
 * contrário.
 *
 * @return boolean
 */
public boolean processar() {
    if (imagem == null) {
        // lançar erro
        return false;
    }
    Mat imagemComBordasEmEvidencia = detectarBordas();
    // Se quiser ver a saída do detector de bordas Cammy
    // Imgproc.cvtColor(imagemComBordasEmEvidencia, imagemDePreview, Imgproc.COLOR_GRAY2BGR, 4); if (true) return false;
    // imagemDePreview = imagemComBordasEmEvidencia; if (true) return false;
    List<MatOfPoint> contornos = detectarContornos(imagemComBordasEmEvidencia);
    if (contornos.isEmpty()) {
        Log.i(TestesActivity.TAG, "> Processamento de imagem: contornos não foram encontrados.");
        return false;
    }
    // Se quiser ver a saída do detector de contornos
    // Imgproc.drawContours(imagemDePreview, contornos, -1, new Scalar(0, 0, 255), 2); if (true) return false;
    List<MatOfPoint> quadrilateros = detectarQuadrilateros(contornos);
    if (quadrilateros.isEmpty()) {
        Log.i(TestesActivity.TAG, "> Processamento de imagem: quadriláteros não foram encontrados.");
        return false;
    }
    // Se quiser ver a saída do detector de quadriláteros
    // for (MatOfPoint quadrilatero : quadrilateros) { List<MatOfPoint> listaContorno = new ArrayList<MatOfPoint>(); listaContorno.add(quadrilatero); Imgproc.drawContours(imagemDePreview, listaContorno, -1, new Scalar(255, 0, 0), 3); } if (true) return false;
    MatOfPoint quadrilateroDoTabuleiro = detectarTabuleiro(quadrilateros);
    if (quadrilateroDoTabuleiro == null) {
        Log.i(TestesActivity.TAG, "> Processamento de imagem: quadrilátero do tabuleiro não foi encontrado.");
        return false;
    }
    HierarquiaDeQuadrilateros hierarquiaDeQuadrilateros = new HierarquiaDeQuadrilateros(quadrilateros);
    double areaMedia = 0;
    for (MatOfPoint quadrilatero : hierarquiaDeQuadrilateros.hierarquia.get(quadrilateroDoTabuleiro)) {
        areaMedia += Imgproc.contourArea(quadrilatero);
    }
    areaMedia /= hierarquiaDeQuadrilateros.hierarquia.get(quadrilateroDoTabuleiro).size();
    double areaDoTabuleiro = Imgproc.contourArea(quadrilateroDoTabuleiro);
    double razao = areaMedia / areaDoTabuleiro;
    // com a área do quadrado do tabuleiro
    if (razao <= 1.0 / 324.0) {
        // 18 quadrados por 18
        dimensaoDoTabuleiro = 19;
    } else if (razao <= 1.0 / 144.0) {
        // 12 quadrados por 12
        dimensaoDoTabuleiro = 13;
    } else {
        dimensaoDoTabuleiro = 9;
    }
    List<Point> cantosDoTabuleiro = ordenarCantos(quadrilateroDoTabuleiro);
    if (desenharPreview) {
        // Desenhista.desenhaInterseccoesECantosDoTabuleiro(imagemDePreview, intersecoes, cantosDoTabuleiro);
        Desenhista.desenharContornoDoTabuleiro(imagemDePreview, quadrilateroDoTabuleiro);
    }
    posicaoDoTabuleiroNaImagem = new Mat(4, 1, CvType.CV_32FC2);
    posicaoDoTabuleiroNaImagem.put(0, 0, (int) cantosDoTabuleiro.get(0).x, (int) cantosDoTabuleiro.get(0).y, (int) cantosDoTabuleiro.get(1).x, (int) cantosDoTabuleiro.get(1).y, (int) cantosDoTabuleiro.get(2).x, (int) cantosDoTabuleiro.get(2).y, (int) cantosDoTabuleiro.get(3).x, (int) cantosDoTabuleiro.get(3).y);
    /*
        for (int i = 0; i < posicaoDoTabuleiroNaImagem.rows(); ++i) {
            for (int j = 0; j < posicaoDoTabuleiroNaImagem.cols(); ++j) {
                double[] valor = posicaoDoTabuleiroNaImagem.get(i, j);
                Log.d(TestesActivity.TAG, "(" + i + ", " + j + ") = " + valor[0] + ", " + valor[1]);
            }
        }
        */
    processadoComSucesso = true;
    return true;
}
Also used : Mat(org.opencv.core.Mat) MatOfPoint(org.opencv.core.MatOfPoint) Point(org.opencv.core.Point) MatOfPoint(org.opencv.core.MatOfPoint)

Example 38 with Point

use of org.opencv.core.Point in project kifu-recorder by leonardost.

the class HierarquiaDeQuadrilateros method estaDentro.

/**
 * Verifica se um quadrilátero está dentro de outro.
 *
 * @param quadrilateroExterno
 * @param quadrilateroInterno
 * @return
 */
private boolean estaDentro(MatOfPoint quadrilateroExterno, MatOfPoint quadrilateroInterno) {
    final double ESTA_DENTRO_DO_CONTORNO = 1;
    double result;
    MatOfPoint2f quadrilateroExterno2f = new MatOfPoint2f();
    quadrilateroExterno.convertTo(quadrilateroExterno2f, CvType.CV_32FC2);
    for (Point point : quadrilateroInterno.toList()) {
        result = Imgproc.pointPolygonTest(quadrilateroExterno2f, point, false);
        if (result != ESTA_DENTRO_DO_CONTORNO) {
            return false;
        }
    }
    return true;
}
Also used : MatOfPoint2f(org.opencv.core.MatOfPoint2f) Point(org.opencv.core.Point) MatOfPoint(org.opencv.core.MatOfPoint)

Example 39 with Point

use of org.opencv.core.Point in project kifu-recorder by leonardost.

the class DetectarTabuleiroActivity method converterParaMatOfPoint.

private MatOfPoint converterParaMatOfPoint(Mat posicaoDoTabuleiroNaImagem) {
    Point[] cantos = { new Point(posicaoDoTabuleiroNaImagem.get(0, 0)[0], posicaoDoTabuleiroNaImagem.get(0, 0)[1]), new Point(posicaoDoTabuleiroNaImagem.get(1, 0)[0], posicaoDoTabuleiroNaImagem.get(1, 0)[1]), new Point(posicaoDoTabuleiroNaImagem.get(2, 0)[0], posicaoDoTabuleiroNaImagem.get(2, 0)[1]), new Point(posicaoDoTabuleiroNaImagem.get(3, 0)[0], posicaoDoTabuleiroNaImagem.get(3, 0)[1]) };
    contornoDoTabuleiro = new MatOfPoint(cantos);
    return contornoDoTabuleiro;
}
Also used : MatOfPoint(org.opencv.core.MatOfPoint) Point(org.opencv.core.Point) MatOfPoint(org.opencv.core.MatOfPoint)

Example 40 with Point

use of org.opencv.core.Point in project opentest by mcdcorp.

the class ImageFinder method findImage.

private ImageFinderResult findImage(Mat sourceMat, Mat templateMat, double desiredAccuracy) {
    if (sourceMat.width() < templateMat.width() || sourceMat.height() < templateMat.height()) {
        throw new UnsupportedOperationException("The template image is larger than the source image. Ensure that the width and/or height of the image you are trying to find do not exceed the dimensions of the source image.");
    }
    Mat result = new Mat(sourceMat.rows() - templateMat.rows() + 1, sourceMat.rows() - templateMat.rows() + 1, CvType.CV_32FC1);
    int intMatchingMethod;
    switch(this.matchingMethod) {
        case MM_CORELLATION_COEFF:
            intMatchingMethod = Imgproc.TM_CCOEFF_NORMED;
            break;
        case MM_CROSS_CORELLATION:
            intMatchingMethod = Imgproc.TM_CCORR_NORMED;
            break;
        default:
            intMatchingMethod = Imgproc.TM_SQDIFF_NORMED;
    }
    Imgproc.matchTemplate(sourceMat, templateMat, result, intMatchingMethod);
    MinMaxLocResult minMaxLocRes = Core.minMaxLoc(result);
    double accuracy = 0;
    Point location = null;
    if (this.matchingMethod == MatchingMethod.MM_SQUARE_DIFFERENCE) {
        accuracy = 1 - minMaxLocRes.minVal;
        location = minMaxLocRes.minLoc;
    } else {
        accuracy = minMaxLocRes.maxVal;
        location = minMaxLocRes.maxLoc;
    }
    if (accuracy < desiredAccuracy) {
        throw new ImageNotFoundException(String.format("Failed to find template image in the source image. The accuracy was %.2f and the desired accuracy was %.2f", accuracy, desiredAccuracy), new Rectangle((int) location.x, (int) location.y, templateMat.width(), templateMat.height()), accuracy);
    }
    if (!minMaxLocResultIsValid(minMaxLocRes)) {
        throw new ImageNotFoundException("Image find result (MinMaxLocResult) was invalid. This usually happens when the source image is covered in one solid color.", null, null);
    }
    Rectangle foundRect = new Rectangle((int) location.x, (int) location.y, templateMat.width(), templateMat.height());
    return new ImageFinderResult(foundRect, accuracy);
}
Also used : Mat(org.opencv.core.Mat) Rectangle(java.awt.Rectangle) Point(org.opencv.core.Point) ImageNotFoundException(org.getopentest.exceptions.ImageNotFoundException) Point(org.opencv.core.Point) MinMaxLocResult(org.opencv.core.Core.MinMaxLocResult)

Aggregations

Point (org.opencv.core.Point)56 MatOfPoint (org.opencv.core.MatOfPoint)30 Mat (org.opencv.core.Mat)23 ArrayList (java.util.ArrayList)11 Scalar (org.opencv.core.Scalar)9 Line (com.disnodeteam.dogecv.math.Line)7 Rect (org.opencv.core.Rect)7 Size (org.opencv.core.Size)7 MatOfPoint2f (org.opencv.core.MatOfPoint2f)4 TimingLogger (android.util.TimingLogger)2 Ponto (br.edu.ifspsaocarlos.sdm.kifurecorder.processing.cornerDetector.Ponto)2 KeyPoint (org.opencv.core.KeyPoint)2 MatOfKeyPoint (org.opencv.core.MatOfKeyPoint)2 Pair (android.util.Pair)1 Corner (br.edu.ifspsaocarlos.sdm.kifurecorder.processing.cornerDetector.Corner)1 Rectangle (java.awt.Rectangle)1 List (java.util.List)1 ImageNotFoundException (org.getopentest.exceptions.ImageNotFoundException)1 Core (org.opencv.core.Core)1 MinMaxLocResult (org.opencv.core.Core.MinMaxLocResult)1