OpenCV no Android Studio

140

Quero usar a biblioteca OpenCV no meu aplicativo com o Android Studio. Segui as instruções encontradas aqui, mas recebo um erro

Configuração com o nome 'padrão' não encontrado

O que pode estar errado?

Eu uso o Android Studio 1.0 com gradle 2.2.1.

Bartosz Bialecki
fonte
1
Agora, podemos importar módulos com o Android studio e as etapas podem ser muito mais simples. Você pode tentar este stackoverflow.com/a/27356635/1180117
Kiran
Obrigado, funciona. Escreva como resposta, então eu posso aceitá-lo.
Bartosz Bialecki
@BartoszBialecki @Kiran, eu o segui para a etapa No.4, não consigo encontrar o nativediretório no meu sdk diretório. Estou perdendo alguma coisa?
Romantic Electron
1
@RomanticElectron, você precisa adicionar o diretório natvie do sdk da biblioteca OpenCV, não do Android sdk.
Bartosz Bialecki
@BartoszBialecki thanks
Romantic Electron

Respostas:

312

As etapas abaixo para usar o Android OpenCV sdk no Android Studio. Esta é uma versão simplificada desta ( 1 ) resposta SO.

  1. Faça o download do OpenCV sdk mais recente para Android no OpenCV.org e descompacte o arquivo zip.
  2. Importe o OpenCV para o Android Studio , em Arquivo -> Novo -> Módulo de importação , escolha a pasta sdk / java no arquivo opencv descompactado.
  3. Atualize build.gradle no módulo OpenCV importado para atualizar 4 campos para corresponder ao seu projeto build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion ed) targetSdkVersion.
  4. Adicione a dependência do módulo por Aplicativo -> Configurações do módulo e selecione a guia Dependências . Clique no ícone + na parte inferior, escolha Dependência do módulo e selecione o módulo OpenCV importado.
    • No Android Studio v1.2.2, para acessar as Configurações do módulo: na visualização do projeto, clique com o botão direito do mouse no módulo dependente -> Abrir Configurações do módulo
  5. Copie a pasta libs em sdk / native para o Android Studio em app / src / main .
  6. No Android Studio, renomeie o diretório libs copiado para jniLibs e pronto.

A etapa (6) ocorre porque o Android studio espera bibliotecas nativas em app/src/main/jniLibsvez da libspasta mais antiga . Para quem é novo no Android OpenCV, não perca as etapas abaixo

  • include static{ System.loadLibrary("opencv_java"); }(Nota: para o OpenCV versão 3 nesta etapa, você deve carregar a biblioteca opencv_java3.)
  • Para a etapa (5), se você ignorar qualquer biblioteca de plataformas como x86, verifique se o dispositivo / emulador não está nessa plataforma.

O OpenCV gravado está em C / C ++. Wrappers Java são

  1. Android OpenCV SDK - O OpenCV.org manteve o wrapper Java do Android. Eu sugiro este.
  2. OpenCV Java - O OpenCV.org mantinha o wrapper Java para desktop gerado automaticamente.
  3. JavaCV - Wrapper Java popular mantido por desenvolvedores independentes. Não é específico para Android. Esta biblioteca pode ficar fora de sincronia com as versões mais recentes do OpenCV.
Kiran
fonte
1
Estou recebendo erros após a segunda etapa, Devo excluir o javadocsdiretório? .Também está me pedindo para instalar, android sdk 14embora eu esteja direcionando para dispositivos que suportamandroid sdk 15
Romantic Electron
1
@RomanticElectron Espero que você tenha baixado o OpenCV4Android 2.4.10 do link sourceforge.net/projects/opencvlibrary/files/opencv-android/… e não essa versão desktop do java?
quer
2
Ok, entendi, pensei que você estivesse falando sobre o sdkdiretório de instalação no meu sistema enquanto falava sobre o diretório que acompanha o Android Open CV SDK.Ok concluiu a etapa 6. Onde incluo static{ System.loadLibrary("opencv_java"); }?
Romantic Electron
5
@RomanticElectron, onde você inclui static {System.loadLibrary ("opencv_java"); }? Você diz "Obrigado, entendi", mas parece não haver mensagem no meio. Então você diz que não é necessário. Você poderia explicar um pouco mais? Obrigado.
Puntofisso
8
para qualquer um ter o android-14erro depois de importar o módulo no passo 2, você precisa editar manualmente o build.gradleno diretório openCV em seu projeto como mostrado no passo 3.
paradite
144

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.

  1. 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)

  2. 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).

  3. 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)

  4. 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. insira a descrição da imagem aqui

      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. insira a descrição da imagem aqui

  5. 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.

  6. 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)
  7. Seu projeto agora tem um diretório cvtest1 / OpenCVLibrary310 , mas não é visível na visualização do projeto:

insira a descrição da imagem aqui

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: insira a descrição da imagem aqui

Dentro, há outro arquivo build.gradle (destacado na captura de tela acima). Atualize este arquivo com os quatro valores da etapa 6.

  1. 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 .

    insira a descrição da imagem aqui

    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:

    insira a descrição da imagem aqui

  2. 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 .

    insira a descrição da imagem aqui

  3. 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: insira a descrição da imagem aqui (não sei por que essa linha com a mensagem de erro está lá)

  4. 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);
  5. 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.
ssimm
fonte
2
Edição de 16 de fevereiro: jniLibs agora no diretório openCVLibrary310, não no diretório principal do aplicativo. Ou funciona, mas me parece mais limpo mantê-los na parte aberta. Além de mais capturas de tela e a parte "Gotchas".
ssimm
Acho que faltam algumas instruções de importação, caso contrário, é um trabalho muito bom! +1
Allan Nørgaard
1
Eu segui sua resposta, mas falhei. 1, recebi o erro OpenCV error: Cannot load info library for OpenCV 2 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/www.deven.com.opencv-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libopencv_java3.so O que esses erros fizeram eu passo a passo, como você escreveu.
Devendra Singh
2
@DevendraSingh eu tenho o mesmo erro que você tem, mas eu percebi que eu tinha perdido o passo 9.
aasu
2
e se quisermos codificar em c ++ para opencv no android studio?
user8663682
37

Para todos que acham que querem fugir com todas as etapas e capturas de tela nas (ótimas!) Respostas acima, isso funcionou para mim com android studio 2.2.1:

  1. Crie um novo projeto, nomeie-o como desejar e use o padrão (minSdkVersion 15 está correto).
  2. Faça o download do arquivo zip aqui: https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (baixei a versão 3.1.0, mas pode haver versões mais recentes).
  3. Descompacte o arquivo zip, o melhor lugar é na pasta da área de trabalho, mas isso não importa.
  4. Dentro Android Studio, clique File->New-> Import Modulee navegue até \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\javae pressione Ok, depois aceite todas as caixas de diálogo padrão.
  5. No gradlearquivo do seu app módulo, adicione isso ao bloco de dependências:

    dependencies {
        compile project(':openCVLibraryXYZ')
        //rest of code
    }

Onde XYZ é a versão exata que você baixa, por exemplo, no meu caso:

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }
yshahak
fonte
1
Agradável e simples, o thnx ;-) Funciona também para a versão 3.2.0.
blacharnia
2
Obrigado, é realmente a solução mais fácil. Um ponto de mim. O novo módulo OpenCV não pôde ser compilado. A resposta aqui me ajudou a corrigir esse problema stackoverflow.com/a/40302788/408780
Tima 31/03
apenas para adicionar ao que a @blacharnia disse, apenas certifique-se de usar o 'projeto de compilação (': openCVLibrary320 ')' na seção de dependências do berço, em vez de 310
Abraham Philip
Talvez de maneira mais geral, para adicionar aos comentários acima, use "compile project (': openCVLibraryXYZ')" onde XYZ é o número da versão do openCV Android SDK sem os 'pontos' - isso também funciona agora para a versão 3.4.0 -> ie use "compile project (': openCVLibrary340')"
Mick
@Mick obrigado, eu editei a resposta de acordo com sua sugestão.
precisa saber é
9

Android Studio 3.4 + OpenCV 4.1

  1. Baixe o arquivo zip mais recente do OpenCV aqui (a versão mais recente atual é 4.1.0) e descompacte-o no seu espaço de trabalho ou em outra pasta.

  2. Crie o novo projeto do Android Studio normalmente. Clique File->New->Import Module, navegue para /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, defina o nome do módulo como opencv, clique Nexte desmarque todas as opções na tela.

  3. Ative Projecto modo de visualização de arquivo (o modo padrão é Android). No opencv/build.gradlearquivo, mude apply plugin: 'com.android.application'para apply plugin: 'com.android.library'e substitua application ID "org.opencv"por

    minSdkVersion 21
    targetSdkVersion 28

    (de acordo com os valores em app/build.gradle). Sincronize projeto com arquivos Gradle.

  4. Adicione essa sequência ao bloco de dependências no app/build.gradlearquivo

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  5. Selecione novamente Androido modo de exibição de arquivo. Clique com o botão direito do mouse no appmódulo e vá para New->Folder->JNI Folder. Selecione alterar o local da pasta e defina src/main/jniLibs/.

  6. Selecione novamente Projecto modo de exibição de arquivo e copie todas as pastas de /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libspara app/src/main/jniLibs.

  7. Novamente no Androidmodo de visualização de arquivo, clique com o botão direito do mouse no appmódulo e escolha Link C++ Project with Gradle. Selecione Build System ndk-builde caminho para o OpenCV.mkarquivo /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files não deve conter espaços, ou você receberá um erro!

Para verificar a inicialização do OpenCV, adicione a mensagem Toast no onCreate()método MainActivity :

Toast.makeText(MainActivity.this, String.valueOf(OpenCVLoader.initDebug()), Toast.LENGTH_LONG).show();

Se a inicialização for bem-sucedida, você verá truena mensagem do Toast outra mensagem false.

Plo_Koon
fonte
Acima, você diz "substitua o ID do aplicativo" org.opencv "por .....", mas não há nada após o "com". Você pode esclarecer por favor? Você quer dizer "remova a entrada applicationId e adicione duas entradas da seguinte maneira:"
Dale
@Dale Sim, você deve substituir application ID "org.opencv"corda com duas cordas: minSdkVersion 21e targetSdkVersion 28(de acordo com os valores no arquivo app / build.gradle)
Plo_Koon
Eu segui todos os passos como você descreveu. Mas, obtendo o erro E / art: dlopen ("/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) falhou: dlopen falhou: biblioteca "libc ++ _ shared.so" não encontrada
Masthan
0

Qualquer pessoa que esteja enfrentando problemas ao criar o jniLibs cpp é mostrada .. basta adicionar ndk ..

Aklesh Singh
fonte
0

Isso funcionou para mim e foi tão fácil quanto adicionar uma dependência de gradle:

https://bintray.com/seesaa/maven/opencv#

https://github.com/seesaa/opencv-android

A única ressalva é que eu tive que usar um dispositivo de depuração de hardware, pois os emuladores de braço estavam muito lentos para mim (como o AVD Manager diz que eles farão) e, conforme descrito no README do repo, esta versão não inclui suporte para x86 ou x86_64.

Parece construir e o teste sugerido:

static {
    OpenCVLoader.initDebug();
}

cospe um monte de saída que parece certo para mim.

Naumdev
fonte
Este foi de um novo projeto no estúdio android. Não importei nada, não baixei nada, etc. Basta adicionar a dependência e a sincronização do gradle.
Naumdev
0

No seu build.gradle

repositories {
  jcenter()
}

implementation 'com.quickbirdstudios:opencv:4.1.0'

Mais informações

Raymond Chenon
fonte