Mac - Caminho relativo/absoluto [Resolvido]

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");
2 curtidas

Nem uma das alternativas funcionou.

O que exatamente não funcionou?
Obs: não poste imagens, poste o código.

1 curtida

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: </>

1 curtida
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());
1 curtida

Olá Paulo,

Como teste experimental coloque "src//imagens"
e veja se o local de execução do projeto tem acesso direto nesse caminho.

1 curtida

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.