Integrando o OpenCV v3.1.0 ao Android Studio v1.4.1 , instruções com detalhes adicionais e capturas de tela do tipo "é isso que você deve obter".
A maior parte do crédito é para Kiran, Kool, 1 "e SteveLiles, no opencv.org, pelas explicações. Estou adicionando esta resposta porque acredito que a interface do Android Studio agora é estável o suficiente para trabalhar com esse tipo de integração. Também tenho que escrever essas instruções de qualquer maneira para o nosso projeto.
Desenvolvedores AS experientes encontrarão um pouco desse pedante. Esta resposta é direcionada a pessoas com experiência limitada no Android Studio.
Crie um novo projeto do Android Studio usando o assistente de projeto (Menu: / Arquivo / Novo Projeto):
- Chame de " cvtest1 "
- Fator de forma: API 19, Android 4.4 (KitKat)
Atividade em branco denominada MainActivity
Você deve ter um diretório cvtest1 onde este projeto está armazenado. (a barra de título do Android studio mostra onde está o cvtest1 quando você abre o projeto)
Verifique se o seu aplicativo está funcionando corretamente. Tente alterar algo como o texto "Hello World" para confirmar que o ciclo de construção / teste é bom para você. (Estou testando com um emulador de um dispositivo API 19).
Baixe o pacote OpenCV para Android v3.1.0 e descompacte-o em algum diretório temporário em algum lugar. (Verifique se é o pacote especificamente para Android e não apenas o pacote OpenCV para Java.) Chamarei este diretório " unzip-dir " Abaixo de unzip-dir, você deve ter um diretório sdk / native / libs com subdiretórios que começam com coisas como arm ..., mips ... e x86 ... (um para cada tipo de "arquitetura" que o Android roda)
No Android Studio, importe o OpenCV para o seu projeto como um módulo: Menu: / File / New / Import_Module :
- Diretório de origem: {unzip-dir} / sdk / java
- Nome do módulo: o Android studio preenche automaticamente esse campo com o openCVLibrary310 (o nome exato provavelmente não importa, mas seguiremos em frente).
Clique no próximo . Você recebe uma tela com três caixas de seleção e perguntas sobre jarros, bibliotecas e opções de importação. Todos os três devem ser verificados. Clique em Concluir.
O Android Studio começa a importar o módulo e um arquivo import-summary.txt é exibido com uma lista do que não foi importado (principalmente arquivos javadoc) e outras informações.
Mas você também receberá uma mensagem de erro dizendo que não conseguiu encontrar-alvo com corda de hash 'android-14' ... . Isso acontece porque o arquivo build.gradle no arquivo zip do OpenCV que você baixou diz para compilar usando a API do Android versão 14, que por padrão você não possui com o Android Studio v1.4.1.
Abra o diálogo de estrutura do projeto ( Menu: / File / Project_Structure ). Selecione o módulo "app", clique na guia Dependencies e adicione : openCVLibrary310 como uma dependência do módulo. Quando você seleciona Add / Module_Dependency, ele deve aparecer na lista de módulos que você pode adicionar. Agora ele será exibido como uma dependência, mas você receberá mais alguns erros do tipo não consegue encontrar o android-14 no log de eventos.
Procure no arquivo build.gradle seu módulo de aplicativo. Existem vários arquivos build.gradle em um projeto Android. O que você deseja está no diretório cvtest1 / app e, na visualização do projeto, parece com build.gradle (Módulo: app) . Observe os valores desses quatro campos:
- compileSDKVersion (o meu diz 23)
- buildToolsVersion (o meu diz 23.0.2)
- minSdkVersion (o meu diz 19)
- targetSdkVersion (o meu diz 23)
Seu projeto agora tem um diretório cvtest1 / OpenCVLibrary310 , mas não é visível na visualização do projeto:
Use alguma outra ferramenta, como qualquer gerenciador de arquivos, e acesse este diretório. Você também pode alternar a visualização do projeto do Android para os Arquivos do projeto e pode encontrar este diretório conforme mostrado nesta captura de tela:
Dentro, há outro arquivo build.gradle (destacado na captura de tela acima). Atualize este arquivo com os quatro valores da etapa 6.
Sincronize novamente o seu projeto e limpe / reconstrua-o. (Menu: / Build / Clean_Project ) Ele deve ser limpo e compilado sem erros e você deve ver muitas referências a : openCVLibrary310 na tela 0: Mensagens .
Nesse ponto, o módulo deve aparecer na hierarquia do projeto como openCVLibrary310 , exatamente como app . (Observe que naquele pequeno menu suspenso retornei da Visualização do projeto para a Android ). Você também deve ver um arquivo build.gradle adicional em "Gradle Scripts", mas acho a interface do Android Studio um pouco complicada e, às vezes, não faz isso imediatamente. Portanto, tente ressincronizar, limpar e até reiniciar o Android Studio.
Você deve ver o módulo openCVLibrary310 com todas as funções do OpenCV em java, como nesta captura de tela:
Copie o diretório {unzip-dir} / sdk / native / libs (e tudo sob ele) para o seu projeto Android, para cvtest1 / OpenCVLibrary310 / src / main / e renomeie sua cópia de libs para jniLibs . Agora você deve ter um diretório cvtest1 / OpenCVLibrary310 / src / main / jniLibs . Sincronize novamente o seu projeto e esse diretório deve aparecer na visualização do projeto em openCVLibrary310 .
Vá para o método onCreate de MainActivity.java e acrescente este código:
if (!OpenCVLoader.initDebug()) {
Log.e(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), not working.");
} else {
Log.d(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), working.");
}
Em seguida, execute seu aplicativo. Você deve ver linhas como esta no Android Monitor:
(não sei por que essa linha com a mensagem de erro está lá)
Agora tente realmente usar algum código openCV. No exemplo abaixo, copiei um arquivo .jpg no diretório de cache do aplicativo cvtest1 no emulador do Android. O código abaixo carrega essa imagem, executa o algoritmo de detecção de borda inteligente e, em seguida, grava os resultados novamente em um arquivo .png no mesmo diretório.
Coloque esse código logo abaixo do código da etapa anterior e altere-o para corresponder aos seus próprios arquivos / diretórios.
String inputFileName="simm_01";
String inputExtension = "jpg";
String inputDir = getCacheDir().getAbsolutePath(); // use the cache directory for i/o
String outputDir = getCacheDir().getAbsolutePath();
String outputExtension = "png";
String inputFilePath = inputDir + File.separator + inputFileName + "." + inputExtension;
Log.d (this.getClass().getSimpleName(), "loading " + inputFilePath + "...");
Mat image = Imgcodecs.imread(inputFilePath);
Log.d (this.getClass().getSimpleName(), "width of " + inputFileName + ": " + image.width());
// if width is 0 then it did not read your image.
// for the canny edge detection algorithm, play with these to see different results
int threshold1 = 70;
int threshold2 = 100;
Mat im_canny = new Mat(); // you have to initialize output image before giving it to the Canny method
Imgproc.Canny(image, im_canny, threshold1, threshold2);
String cannyFilename = outputDir + File.separator + inputFileName + "_canny-" + threshold1 + "-" + threshold2 + "." + outputExtension;
Log.d (this.getClass().getSimpleName(), "Writing " + cannyFilename);
Imgcodecs.imwrite(cannyFilename, im_canny);
Execute seu aplicativo. Seu emulador deve criar uma imagem em "borda" em preto e branco. Você pode usar o Android Device Monitor para recuperar a saída ou gravar uma atividade para mostrá-la.
The Gotchas :
- Se você abaixar sua plataforma de destino abaixo do KitKat, algumas das bibliotecas OpenCV não funcionarão mais, especificamente as classes relacionadas ao org.opencv.android.Camera2Renderer e outras classes relacionadas. Você provavelmente pode contornar isso simplesmente removendo os arquivos .java apropriados do OpenCV.
- Se você elevar sua plataforma de destino para o Lollipop ou acima, meu exemplo de carregamento de um arquivo pode não funcionar porque o uso de caminhos de arquivo absolutos é desaprovado. Portanto, pode ser necessário alterar o exemplo para carregar um arquivo da galeria ou em outro lugar. Existem inúmeros exemplos flutuando.