Search in sources :

Example 6 with Scalar

use of org.opencv.core.Scalar in project Relic_Main by TeamOverdrive.

the class GenericDetector method processFrame.

@Override
public Mat processFrame(Mat rgba, Mat gray) {
    Size initSize = rgba.size();
    newSize = new Size(initSize.width * downScaleFactor, initSize.height * downScaleFactor);
    rgba.copyTo(workingMat);
    Imgproc.resize(workingMat, workingMat, newSize);
    if (rotateMat) {
        Mat tempBefore = workingMat.t();
        // mRgba.t() is the transpose
        Core.flip(tempBefore, workingMat, -1);
        tempBefore.release();
    }
    Mat preConvert = workingMat.clone();
    colorFilter.process(preConvert, mask);
    if (stretch) {
        structure = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT, stretchKernal);
        Imgproc.morphologyEx(mask, mask, Imgproc.MORPH_CLOSE, structure);
    }
    List<MatOfPoint> contours = new ArrayList<>();
    Imgproc.findContours(mask, contours, hiarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
    Imgproc.drawContours(workingMat, contours, -1, new Scalar(230, 70, 70), 2);
    Rect chosenRect = null;
    double chosenScore = Integer.MAX_VALUE;
    MatOfPoint2f approxCurve = new MatOfPoint2f();
    for (MatOfPoint c : contours) {
        MatOfPoint2f contour2f = new MatOfPoint2f(c.toArray());
        // Processing on mMOP2f1 which is in type MatOfPoint2f
        double approxDistance = Imgproc.arcLength(contour2f, true) * 0.02;
        Imgproc.approxPolyDP(contour2f, approxCurve, approxDistance, true);
        // Convert back to MatOfPoint
        MatOfPoint points = new MatOfPoint(approxCurve.toArray());
        // Get bounding rect of contour
        Rect rect = Imgproc.boundingRect(points);
        // You can find this by printing the area of each found rect, then looking and finding what u deem to be perfect.
        // Run this with the bot, on a balance board, with jewels in their desired location. Since jewels should mostly be
        // in the same position, this hack could work nicely.
        double area = Imgproc.contourArea(c);
        double areaDiffrence = 0;
        switch(detectionMode) {
            case MAX_AREA:
                areaDiffrence = -area * areaWeight;
                break;
            case PERFECT_AREA:
                areaDiffrence = Math.abs(perfectArea - area);
                break;
        }
        // Just declaring vars to make my life eassy
        double x = rect.x;
        double y = rect.y;
        double w = rect.width;
        double h = rect.height;
        Point centerPoint = new Point(x + (w / 2), y + (h / 2));
        // Get the ratio. We use max in case h and w get swapped??? it happens when u account for rotation
        double cubeRatio = Math.max(Math.abs(h / w), Math.abs(w / h));
        double ratioDiffrence = Math.abs(cubeRatio - perfectRatio);
        double finalDiffrence = (ratioDiffrence * ratioWeight) + (areaDiffrence * areaWeight);
        // Think of diffrence as score. 0 = perfect
        if (finalDiffrence < chosenScore && finalDiffrence < maxDiffrence && area > minArea) {
            chosenScore = finalDiffrence;
            chosenRect = rect;
        }
        if (debugContours && area > 100) {
            Imgproc.circle(workingMat, centerPoint, 3, new Scalar(0, 255, 255), 3);
            Imgproc.putText(workingMat, "Area: " + String.format("%.1f", area), centerPoint, 0, 0.5, new Scalar(0, 255, 255));
        }
    }
    if (chosenRect != null) {
        Imgproc.rectangle(workingMat, new Point(chosenRect.x, chosenRect.y), new Point(chosenRect.x + chosenRect.width, chosenRect.y + chosenRect.height), new Scalar(0, 255, 0), 3);
        Imgproc.putText(workingMat, "Result: " + String.format("%.2f", chosenScore), new Point(chosenRect.x - 5, chosenRect.y - 10), Core.FONT_HERSHEY_PLAIN, 1.3, new Scalar(0, 255, 0), 2);
        Point centerPoint = new Point(chosenRect.x + (chosenRect.width / 2), chosenRect.y + (chosenRect.height / 2));
        resultRect = chosenRect;
        resultLocation = centerPoint;
        resultFound = true;
    } else {
        resultFound = false;
        resultRect = null;
        resultLocation = null;
    }
    Imgproc.resize(workingMat, workingMat, initSize);
    preConvert.release();
    Imgproc.putText(workingMat, "DogeCV v1.1 Generic: " + newSize.toString() + " - " + speed.toString() + " - " + detectionMode.toString(), new Point(5, 30), 0, 1.2, new Scalar(0, 255, 255), 2);
    return workingMat;
}
Also used : Mat(org.opencv.core.Mat) Rect(org.opencv.core.Rect) Size(org.opencv.core.Size) MatOfPoint2f(org.opencv.core.MatOfPoint2f) ArrayList(java.util.ArrayList) MatOfPoint(org.opencv.core.MatOfPoint) Point(org.opencv.core.Point) MatOfPoint(org.opencv.core.MatOfPoint) Scalar(org.opencv.core.Scalar)

Example 7 with Scalar

use of org.opencv.core.Scalar 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 8 with Scalar

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

the class DetectorDePedras method corMediaDoTabuleiro.

/**
 * Retorna a cor media do tabuleiro.
 *
 * ESTA COR MUDA CONFORME O JOGO PROGRIDE E CONFORME A ILUMINAÇÃO MUDA.
 *
 * @param imagemDoTabuleiro
 * @return
 */
private double[] corMediaDoTabuleiro(Mat imagemDoTabuleiro) {
    Scalar mediaScalar = Core.mean(imagemDoTabuleiro);
    double[] media = new double[imagemDoTabuleiro.channels()];
    for (int i = 0; i < mediaScalar.val.length; ++i) {
        media[i] = mediaScalar.val[i];
    }
    return media;
}
Also used : Scalar(org.opencv.core.Scalar)

Example 9 with Scalar

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

the class DetectorDePedras method recuperarMediaDeCores.

/**
 * Recupera a cor media ao redor de uma posiçao na imagem
 *
 * @param y
 * @param x
 * @return
 */
private double[] recuperarMediaDeCores(int y, int x) {
    // long tempoEntrou = System.currentTimeMillis();
    /**
     * A imagem do tabuleiro ortogonal tem 500x500 pixels de dimensão.
     * Este cálculo pega mais ou menos o tamanho de pouco menos de metade de uma pedra na imagem do
     * tabuleiro ortogonal.
     * 9x9 -> 25
     * 13x13 -> 17
     * 19x19 -> 11
     *
     * Antes o raio sendo utilizado era de 8 pixels. Em um tabuleiro 9x9 em uma imagme de 500x500
     * pixels, um raio de 8 pixels, em uma interseção que tem o ponto do hoshi, o detector quase
     * achava que havia uma pedra preta ali.
     */
    // int radius = 500 / (partida.getDimensaoDoTabuleiro() - 1) * 0.33;
    int radius = 0;
    if (dimensaoDoTabuleiro == 9) {
        radius = 21;
    } else if (dimensaoDoTabuleiro == 13) {
        radius = 14;
    } else if (dimensaoDoTabuleiro == 19) {
        radius = 9;
    }
    // Não é um círculo, mas pelo speedup, acho que compensa pegar a média
    // de cores assim
    Mat roi = imagemDoTabuleiro.submat(Math.max(y - radius, 0), Math.min(y + radius, imagemDoTabuleiro.height()), Math.max(x - radius, 0), Math.min(x + radius, imagemDoTabuleiro.width()));
    Scalar mediaScalar = Core.mean(roi);
    double[] corMedia = new double[imagemDoTabuleiro.channels()];
    for (int i = 0; i < mediaScalar.val.length; ++i) {
        corMedia[i] = mediaScalar.val[i];
    }
    // Log.d(TestesActivity.TAG, "TEMPO (recuperarMediaDeCores()): " + (System.currentTimeMillis() - tempoEntrou));
    return corMedia;
}
Also used : Mat(org.opencv.core.Mat) Scalar(org.opencv.core.Scalar)

Example 10 with Scalar

use of org.opencv.core.Scalar in project Frankenstein by olir.

the class OU2LR method process.

@Override
public Mat process(Mat sourceFrame, int frameId, FilterContext context) {
    Rect roi = new Rect(0, 0, smallWidth, smallHeight);
    sourceFrame.submat(new Rect(0, 0, sourceFrame.cols(), sourceFrame.rows() >> 1)).copyTo(upperFrame);
    sourceFrame.submat(new Rect(0, sourceFrame.rows() >> 1, sourceFrame.cols(), sourceFrame.rows() >> 1)).copyTo(lowerFrame);
    Imgproc.resize(upperFrame, leftFrame, new Size(smallWidth, smallHeight), 0, 0, Imgproc.INTER_AREA);
    Imgproc.resize(lowerFrame, rightFrame, new Size(smallWidth, smallHeight), 0, 0, Imgproc.INTER_AREA);
    newFrame.setTo(new Scalar(255, 0, 0));
    roi = new Rect(0, 0, smallWidth, smallHeight);
    leftFrame.copyTo(new Mat(newFrame, roi));
    roi = new Rect(smallWidth, 0, smallWidth, smallHeight);
    rightFrame.copyTo(new Mat(newFrame, roi));
    return newFrame;
}
Also used : Mat(org.opencv.core.Mat) Rect(org.opencv.core.Rect) Size(org.opencv.core.Size) Scalar(org.opencv.core.Scalar)

Aggregations

Scalar (org.opencv.core.Scalar)15 Mat (org.opencv.core.Mat)9 Size (org.opencv.core.Size)9 Rect (org.opencv.core.Rect)7 MatOfPoint (org.opencv.core.MatOfPoint)6 Point (org.opencv.core.Point)6 ArrayList (java.util.ArrayList)4 MatOfPoint2f (org.opencv.core.MatOfPoint2f)2 Line (com.disnodeteam.dogecv.math.Line)1 File (java.io.File)1 List (java.util.List)1