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