Comecei esse projeto no windows além disso sou novato em java minha dúvida: como faco para indicar um diretório no Mac?
No windows essa configuracao funciona normal.
Comecei esse projeto no windows além disso sou novato em java minha dúvida: como faco para indicar um diretório no Mac?
No windows essa configuracao funciona normal.
O separador do Windows é \
, que em uma String do Java precisa ser escapado da seguinte forma: "\\"
O Mac, assim como o Linux, é baseado em Unix, onde o separador é /
Então, para garantir multiplataforma, ou você faz assim:
File diretorio = new File("src/imagens");
Ou faz assim:
File diretorio = new File("src", "imagens");
Se preferir usar somente objetos File:
File src = new File("src");
File diretorio = new File(src, "imagens");
Ou
File diretorio = new File("src");
diretorio = new File(diretorio, "imagens");
Nem uma das alternativas funcionou.
O que exatamente não funcionou?
Obs: não poste imagens, poste o código.
File diretorio = new File(“src/imagens”);
Deu o seguinte erro (primeiro)
run:
Exception in thread “main” java.lang.UnsatisfiedLinkError: /private/var/folders/_c/84xctyjd6fbf9rsk4y7b4_880000gp/T/javacpp11226119362907/libjniopencv_core.dylib: dlopen(/private/var/folders/_c/84xctyjd6fbf9rsk4y7b4_880000gp/T/javacpp11226119362907/libjniopencv_core.dylib, 1): Library not loaded: @rpath/libopencv_core.2.4.dylib
Referenced from: /private/var/folders/_c/84xctyjd6fbf9rsk4y7b4_880000gp/T/javacpp11226119362907/libjniopencv_core.dylib
Reason: image not found
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:418)
at com.googlecode.javacpp.Loader.load(Loader.java:368)
at com.googlecode.javacpp.Loader.load(Loader.java:315)
at com.googlecode.javacv.cpp.opencv_core.(opencv_core.java:131)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.googlecode.javacpp.Loader.load(Loader.java:334)
at com.googlecode.javacv.cpp.opencv_imgproc.(opencv_imgproc.java:96)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.googlecode.javacpp.Loader.load(Loader.java:334)
at com.googlecode.javacv.cpp.opencv_highgui.(opencv_highgui.java:85)
at opencv.ExtratorCaracteristicas.main(ExtratorCaracteristicas.java:61)
/Users/paulo/Library/Caches/NetBeans/8.2/executor-snippets/run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 0 segundos)
O segundo
File diretorio = new File(“src”, “imagens”);
run:
Exception in thread “main” java.lang.UnsatisfiedLinkError: /private/var/folders/_c/84xctyjd6fbf9rsk4y7b4_880000gp/T/javacpp11280868674462/libjniopencv_core.dylib: dlopen(/private/var/folders/_c/84xctyjd6fbf9rsk4y7b4_880000gp/T/javacpp11280868674462/libjniopencv_core.dylib, 1): Library not loaded: @rpath/libopencv_core.2.4.dylib
Referenced from: /private/var/folders/_c/84xctyjd6fbf9rsk4y7b4_880000gp/T/javacpp11280868674462/libjniopencv_core.dylib
Reason: image not found
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:418)
at com.googlecode.javacpp.Loader.load(Loader.java:368)
at com.googlecode.javacpp.Loader.load(Loader.java:315)
at com.googlecode.javacv.cpp.opencv_core.(opencv_core.java:131)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.googlecode.javacpp.Loader.load(Loader.java:334)
at com.googlecode.javacv.cpp.opencv_imgproc.(opencv_imgproc.java:96)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.googlecode.javacpp.Loader.load(Loader.java:334)
at com.googlecode.javacv.cpp.opencv_highgui.(opencv_highgui.java:85)
at opencv.ExtratorCaracteristicas.main(ExtratorCaracteristicas.java:61)
/Users/paulo/Library/Caches/NetBeans/8.2/executor-snippets/run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 0 segundos)
O Terceiro
File src = new File(“src”);
File diretorio = new File(src, “imagens”);
run:
Exception in thread “main” java.lang.RuntimeException: Uncompilable source code - cannot find symbol
symbol: variable arquivos
location: class opencv.ExtratorCaracteristicas
at opencv.ExtratorCaracteristicas.main(ExtratorCaracteristicas.java:55)
/Users/paulo/Library/Caches/NetBeans/8.2/executor-snippets/run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 1 segundo)
O quarto.
File diretorio = new File(“src”);
diretorio = new File(diretorio, “imagens”);
run:
Exception in thread “main” java.lang.RuntimeException: Uncompilable source code - cannot find symbol
symbol: variable arquivos
location: class opencv.ExtratorCaracteristicas
at opencv.ExtratorCaracteristicas.main(ExtratorCaracteristicas.java:54)
/Users/paulo/Library/Caches/NetBeans/8.2/executor-snippets/run.xml:53: Java returned: 1
FALHA NA CONSTRUÇÃO (tempo total: 1 segundo)
Olha, os seus stack traces não apontam nenhuma exceção ao instanciar a classe java.io.File
.
Posta o código completo da classe opencv.ExtratorCaracteristicas
.
Não esqueça de formatar o código no fórum usando o botão de texto pré formatado: </>
package opencv;
import com.googlecode.javacv.cpp.opencv_core.CvMat;
import com.googlecode.javacv.cpp.opencv_core.CvScalar;
import com.googlecode.javacv.cpp.opencv_core.CvSize;
import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import static com.googlecode.javacv.cpp.opencv_core.cvCloneImage;
import static com.googlecode.javacv.cpp.opencv_core.cvCreateImage;
import static com.googlecode.javacv.cpp.opencv_core.cvGet2D;
import static com.googlecode.javacv.cpp.opencv_core.cvGetMat;
import static com.googlecode.javacv.cpp.opencv_core.cvGetSize;
import static com.googlecode.javacv.cpp.opencv_core.cvSet2D;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExtratorCaracteristicas {
public static void main(String[] args) throws IOException {
int proximaImagem, classePersonagem;
String classePersonagemString;
double red, green, blue;
// Cabeçalho do arquivo Weka
String exportacao = "@relation caracteristicas\n\n";
exportacao += "@attribute laranja_camisa_bart real\n";
exportacao += "@attribute azul_calcao_bart real\n";
exportacao += "@attribute azul_sapato_bart real\n";
exportacao += "@attribute marrom_boca_homer real\n";
exportacao += "@attribute azul_calca_homer real\n";
exportacao += "@attribute cinza_sapato_homer real\n";
exportacao += "@attribute classe {Bart, Homer}\n\n";
exportacao += "@data\n";
// Diretório onde estão armazenadas as imagens
File diretorio = new File("src\\imagens");
File[] arquivos = diretorio.listFiles();
// Características do Homer e Bart
float laranjaCamisaBart, azulCalcaoBart, azulSapatoBart;
float azulCalcaHomer, marromBocaHomer, cinzaSapatoHomer;
// Definição do vetor de características
float[][] caracteristicas = new float[293][7];
// Percorre todas as imagens do diretório
for (int i = 0; i < arquivos.length; i++) {
laranjaCamisaBart = 0;
azulCalcaoBart = 0;
azulSapatoBart = 0;
azulCalcaHomer = 0;
marromBocaHomer = 0;
cinzaSapatoHomer = 0;
// Carrega cada imagem do diretório
IplImage imagemOriginal = cvLoadImage(diretorio.getAbsolutePath() + "\\" + arquivos[i].getName());
CvSize tamanhoImagemOriginal = cvGetSize(imagemOriginal);
// Imagem processada - tamanho, profundidade de cores e número de canais de cores
IplImage imagemProcessada = cvCreateImage(tamanhoImagemOriginal, IPL_DEPTH_8U, 3);
imagemProcessada = cvCloneImage(imagemOriginal);
// Definição da classe - Homer ou Bart
if (arquivos[i].getName().charAt(0) == 'b') {
classePersonagem = 0;
classePersonagemString = "Bart";
} else {
classePersonagem = 1;
classePersonagemString = "Homer";
}
// Matriz multi-canal
CvMat mtx = CvMat.createHeader(imagemProcessada.height(), imagemProcessada.width());
CvScalar scalarImagemProcessada = new CvScalar();
cvGetMat(imagemProcessada, mtx, null, 0);
// Varre a imagem pixel a pixel
for (int altura = 0; altura < imagemProcessada.height(); altura++) {
for (int largura = 0; largura < imagemProcessada.width(); largura++) {
// Extração do RGB de cada pixel da imagem
CvScalar scalarExtraiRgb = cvGet2D(imagemProcessada, altura, largura);
blue = scalarExtraiRgb.val(0);
green = scalarExtraiRgb.val(1);
red = scalarExtraiRgb.val(2);
// Camisa laranja do Bart
if (blue >= 11 && blue <= 22 &&
green >= 85 && green <= 105 &&
red >= 240 && red <= 255) {
scalarImagemProcessada.setVal(0, 0);
scalarImagemProcessada.setVal(1, 255);
scalarImagemProcessada.setVal(2, 128);
cvSet2D(mtx, altura, largura, scalarImagemProcessada);
laranjaCamisaBart++;
}
// Calção azul do Bart (metade de baixo da imagem)
if (altura > (imagemProcessada.height() / 2)) {
if (blue >= 125 && blue <= 170 && green >= 0 && green <= 12 && red >= 0 && red <= 20) {
scalarImagemProcessada.setVal(0, 0);
scalarImagemProcessada.setVal(1, 255);
scalarImagemProcessada.setVal(2, 128);
cvSet2D(mtx, altura, largura, scalarImagemProcessada);
azulCalcaoBart++;
}
}
// Sapato do Bart (parte inferior da imagem)
if (altura > (imagemProcessada.height() / 2) + (imagemProcessada.height() / 3)) {
if (blue >= 125 && blue <= 140 && green >= 3 && green <= 12 && red >= 0 && red <= 20) {
scalarImagemProcessada.setVal(0, 0);
scalarImagemProcessada.setVal(1, 255);
scalarImagemProcessada.setVal(2, 128);
cvSet2D(mtx, altura, largura, scalarImagemProcessada);
azulSapatoBart++;
}
}
// Calça azul do Homer
if (blue >= 150 && blue <= 180 && green >= 98 && green <= 120 && red >= 0 && red <= 90) {
scalarImagemProcessada.setVal(0, 0);
scalarImagemProcessada.setVal(1, 255);
scalarImagemProcessada.setVal(2, 255);
cvSet2D(mtx, altura, largura, scalarImagemProcessada);
azulCalcaHomer++;
}
// Boca do Homer (pouco mais da metade da imagem)
if (altura < (imagemProcessada.height() / 2) + (imagemProcessada.height() / 3)) {
if (blue >= 95 && blue <= 140 && green >= 160 && green <= 185 && red >= 175 && red <= 200) {
scalarImagemProcessada.setVal(0, 0);
scalarImagemProcessada.setVal(1, 255);
scalarImagemProcessada.setVal(2, 255);
cvSet2D(mtx, altura, largura, scalarImagemProcessada);
marromBocaHomer++;
}
}
// Sapato do Homer (parte inferior da imagem)
if (altura > (imagemProcessada.height() / 2) + (imagemProcessada.height() / 3)) {
if (blue >= 25 && blue <= 45 && green >= 25 && green <= 45 && red >= 25 && red <= 45) {
scalarImagemProcessada.setVal(0, 0);
scalarImagemProcessada.setVal(1, 255);
scalarImagemProcessada.setVal(2, 255);
cvSet2D(mtx, altura, largura, scalarImagemProcessada);
cinzaSapatoHomer++;
}
}
}
}
// Imagem processada de acordo com as características (alteração das cores)
imagemProcessada = new IplImage(mtx);
// Normaliza as características pelo número de pixels totais da imagem
laranjaCamisaBart = (laranjaCamisaBart / (imagemOriginal.height() * imagemOriginal.width())) * 100;
azulCalcaoBart = (azulCalcaoBart / (imagemOriginal.height() * imagemOriginal.width())) * 100;
azulSapatoBart = (azulSapatoBart / (imagemOriginal.height() * imagemOriginal.width())) * 100;
azulCalcaHomer = (azulCalcaHomer / (imagemOriginal.height() * imagemOriginal.width())) * 100;
marromBocaHomer = (marromBocaHomer / (imagemOriginal.height() * imagemOriginal.width())) * 100;
cinzaSapatoHomer = (cinzaSapatoHomer / (imagemOriginal.height() * imagemOriginal.width())) * 100;
// Grava as características no vetor de características
caracteristicas[i][0] = laranjaCamisaBart;
caracteristicas[i][1] = azulCalcaoBart;
caracteristicas[i][2] = azulSapatoBart;
caracteristicas[i][3] = azulCalcaHomer;
caracteristicas[i][4] = marromBocaHomer;
caracteristicas[i][5] = cinzaSapatoHomer;
caracteristicas[i][6] = classePersonagem;
System.out.println("Laranja camisa Bart: " + caracteristicas[i][0] + " - Azul calção Bart: " + caracteristicas[i][1] + " - Azul sapato Bart: " + caracteristicas[i][2] + " - Azul calça Homer: " + caracteristicas[i][3] + " - Marrom boca Homer: " + caracteristicas[i][4] + " - Preto sapato Homer: " + caracteristicas[i][5] + " - Classe: " + caracteristicas[i][6]);
exportacao += caracteristicas[i][0] + "," + caracteristicas[i][1] + "," + caracteristicas[i][2] + "," + caracteristicas[i][3] + "," + caracteristicas[i][4] + "," + caracteristicas[i][5] + "," + classePersonagemString + "\n";
cvShowImage("Imagem original", imagemOriginal);
cvShowImage("Imagem processada", imagemProcessada);
proximaImagem = cvWaitKey();
}
// Grava o arquivo ARFF no disco
File arquivo = new File("caracteristicas.arff");
FileOutputStream f = new FileOutputStream(arquivo);
f.write(exportacao.getBytes());
f.close();
}
}
Aqui você tentou rodar um fonte com erros de compilação, não havia declarado a variável arquivos
As linhas 60 e 61 contém o seguinte código:
IplImage imagemOriginal = cvLoadImage(diretorio.getAbsolutePath() + "\\" + arquivos[i].getName());
CvSize tamanhoImagemOriginal = cvGetSize(imagemOriginal);
Ou seja, continua tentando montar um caminho usando \\
ao invés de /
.
O \\
só funciona no Windows.
O seu array arquivos
contém objetos File
, então não há necessidade de montar o caminho novamente, é só fazer assim:
IplImage imagemOriginal = cvLoadImage(arquivos[i].getAbsolutePath());
Olá Paulo,
Como teste experimental coloque "src//imagens"
e veja se o local de execução do projeto tem acesso direto nesse caminho.
Estava sem internet em casa, amanhã testo novamente e posto o resultado.
Tive tempo livre hoje consegui resolver, foi mais simples do que imaginava.
Original Windows: File diretorio = new File("src\\imagens");
Modificado MacOS: File diretorio = new File("src/imagens");
Original Windows: IplImage imagemOriginal = cvLoadImage(diretorio.getAbsolutePath() + "\\" + arquivos[i].getName());
Modificado MacOS: IplImage imagemOriginal = cvLoadImage(diretorio.getAbsolutePath() + "/" + arquivos[i].getName());
Muito obrigado pelas dicas.