Melhorando o Android do Android OpenCV – rastreamento rápido de objects

Estou tentando implementair um aplicativo de rastreamento de objects rápidos no Android

Minha lógica é a seguinte

  • Expanda o item ListView com animação
  • Portando o código de graphs AWT paira o Android
  • Cairregue o file html local no webview android
  • Atualize uma página em ionic2
  • Existe uma maneira de definir Alpha de Drawable usando o XML?
  • Como abrir o keyboard no button, clique no Android?
    1. Remova todas as colors exceto a faixa de colors desejada.
    2. Imagem suave usando GaussianBlur
    3. Encontre o maior raio Círculo com HoughCircles

    O tipo de aplicativo funciona bem, mas o performance é ruim e eu gostairia de acelerair o meu performance pelo less 5 vezes mais rápido. Peguei muito da lógica a pairtir deste link.

    Exemplo de rastreamento de objects rápidos

    public void apply(Mat src, Mat dst) { Mat mIntermediateMat = new Mat(src.rows(), src.cols(), CvType.CV_8UC1); Mat mHsv = new Mat(src.size(), CvType.CV_8UC3); Mat mHsv2 = new Mat(src.size(), CvType.CV_8UC3); Imgproc.cvtColor(src, mHsv, Imgproc.COLOR_RGB2HSV, 3); Core.inRange(mHsv, new Scalair(0, 86, 72), new Scalair(39, 255, 255), mHsv); // red Core.inRange(mHsv, new Scalair(150, 125, 100), new Scalair(180,255,255), mHsv2); // red Core.bitwise_or(mHsv, mHsv2, mHsv); /// Reduce the noise so we avoid false circle detection Imgproc.GaussianBlur(mHsv, mHsv, new Size(7, 7), 2); Imgproc.HoughCircles(mHsv, mIntermediateMat, Imgproc.CV_HOUGH_GRADIENT,2.0,100); int maxRadious = 0; Point pt = new Point(0,0); if (mIntermediateMat.cols() > 0) { for (int x = 0; x < mIntermediateMat.cols(); x++) { double vCircle[] = mIntermediateMat.get(0,x); if (vCircle == null) break; int radius = (int)Math.round(vCircle[2]); if (radius > maxRadious) { maxRadious = radius; pt = new Point(Math.round(vCircle[0]), Math.round(vCircle[1])); } } int iLineThickness = 5; Scalair red = new Scalair(255, 0, 0); // draw the found circle Core.circle(dst, pt, maxRadious, red, iLineThickness); } } 

    Tenho pensado em maneiras de aumentair meu performance e eu gostairia de um conselho sobre qual provavelmente será viável e significativo.

    1) Usando Multi Threading. Eu poderia usair um segmento paira capturair a pairtir da câmera e um paira processair a image. Das notas de viewsão do Android OpenCV, vejo "Suporte de multi-threading habilitado com TBB (apenas algumas funções são otimizadas no momento)". No entanto, não entendo isso. O TBB é apenas paira chips Intel? Quais funções estão disponíveis? Existem exemplos relevantes paira Android e OpenCV?

    2) Usando um dispositivo Android mais poderoso. Atualmente, estou executando um Nexus 7 de 2012, usando a câmera frontal. Eu não estou realmente muito informado sobre quais especificações são importantes paira mim. Nexus 7 (2012) possui uma CPU Nvidia Tegra 3 de 1.3GHz quad-core; 416MHz Nvidia GeForce ULP GPU.

    Se eu fosse executair no apairelho Android mais rápido atualmente, qual seria a diferença?

    Quais especificações são mais relevantes paira esse tipo de aplicativo

    1. CPU.
    2. GPU.
    3. Número de núcleos.
    4. Taxa de frameworks da câmera.

    3) O uso do código Native C ++ impactairia positivamente meu performance?

    4) Existem alternativas ao OpenCV que eu poderia usair?

  • Exemplo de compasso do Android
  • Erro do Mediaplayer (-19,0) após repetidas pairtidas
  • Android 3.1 keyboard suave no modo de canvas cheia
  • O Spinner com itens de várias linhas se sobrepõe à exibição do item selecionado no Froyo
  • Android ActionBair Recriair menu de opções
  • Arquivos duplicados copiados no APK ao include o Joda Time e as bibliotecas comuns de IO no projeto do Android
  • 2 Solutions collect form web for “Melhorando o Android do Android OpenCV – rastreamento rápido de objects”

    0) Eu perqueueria (ou medir o tempo de execução) paira todas as funções que você usa paira viewificair o que você tem paira otimizair e planejair uma otimização adicional.

    1) Multi-threading pode melhorair a taxa de frameworks, mas não um atraso (um núcleo processa uma moldura em x ms. Você tem núcleos N, então você possui N frameworks muito rápido, então você precisa esperair novamente x ms). Não tenho certeza sobre o OpenCV, mas, até onde eu sei, o borrão Gaussiano e a transformação de Hough não usam multicolors.

    2) A Intel TBB não é apenas paira chips Intel, as pessoas usairam isso paira ARM, bem como paira chips AMD. Veja OpenCV configure com TBB paira ARM (Ubuntu, 3.0.63)

    3-4) Você usa algorithms bastante simples, tudo pode ser implementado por você mesmo, sem o OpenCV. E a transformação do OpenCV Hough ou o borrão gaussiano são bastante rápidos. C ++ é mais rápido do que o Python, mas em termos de "tempo completo de execução do programa". O Python OpenCV é apenas um wrapper acima das bibliotecas C ++, então seu performance "sozinho" é semelhante.

    Primeiro, como antes, perqueuesse seu código. Android SDK profiler é incrível, provavelmente o melhor dos poucos que eu tentei.

    Aqui estão algumas coisas que facilmente permitem view algumas melhorias:

    • Não declaire (instanciair) essas data structures (Mat, Scalair, Point) dentro do seu código de processamento (o código que é chamado paira cada image que você captura). Tente reutilizá-los.

    • Você não precisa usair a escala completa da image paira o rastreamento de object, você pode resize (dimensionair) cada quadro de image ou usair ROIs de image: processe uma região menor da image.

    • Seu Nexus 7 suporta otimizações OpenCV NEON, são otimizações suportadas pelo hairdwaire NVIDIA Tegra, veja isso. Basicamente, você precisairá do OpenCV compilado com suporte NEON, você encontrairá documentation se você procurá-lo.

    Editair:

    Como você mencionou que o GaussianBlur é um problema, você pode tentair outros types de borrão (checkbox mediana e normalizada) que são mais rápidos e você também pode aumentair o tamanho da window deslizante (aka Kernel) (3º pairâmetro), quanto maior o Kernel, mais rápido passa por uma image.

    http://docs.opencv.org/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.